Esempio n. 1
0
        public void GetValuesWithAggregationFilter()
        {
            //  nRows 2566
            // nCols 1843
            // upper left corner of map
            // ULXMAP        124854.28
            // ULYMAP        523505.38
            // stepsize (m) for both dimensions
            // Xdim 20
            // Ydim 20

            string path = rasterDataPath + "Bodem.bil";

            var functionStore = new GdalFunctionStore {
                Path = path
            };

            functionStore.Open();
            //grid.GetValues()
            var grid = functionStore.Grid;

            //create filter for x and y to set xmin, xmax, ymin and ymax (VariableValueRangesFilter<>)
            var xFilter = new VariableAggregationFilter(grid.X, 18, 0, 1782);
            var yFilter = new VariableAggregationFilter(grid.Y, 25, 0, 2475);

            //get values between 130000-132000 and 526000-528000
            var values = grid.GetValues(xFilter, yFilter);

            //check count
            Assert.AreEqual(10000, values.Count);
        }
        private int GetSourceIndex(VariableAggregationFilter filter, int index)
        {
            int sourceIndex = filter.MinIndex + index * filter.StepSize;

            sourceIndex = Math.Min(sourceIndex, filter.MaxIndex);
            return(sourceIndex);
        }
Esempio n. 3
0
        /// <summary>
        /// Returns filters containing variables which exist in the store.
        /// If variable in the filter is filtered - use parent vararible.
        /// </summary>
        /// <param name="filters"></param>
        /// <returns></returns>
        private IVariableFilter[] GetFiltersInParent(IEnumerable <IVariableFilter> filters)
        {
            if (filters.Count() == 0 && Filters.Count == 0)
            {
                return(new IVariableFilter[0]);
            }

            var allFilters = new List <IVariableFilter>();

            //convert variableValuefilter to parent..some assumptions here refactor to a more decorated architecture
            foreach (IVariableFilter filter in filters)
            {
                //TODO : refactor to a base class or something
                if ((filter is IVariableValueFilter) && (filter.Variable.Parent != null))
                {
                    var valueFilter    = (filter as IVariableValueFilter);
                    var parentVariable = (IVariable)(valueFilter.Variable.Parent);
                    allFilters.Add(parentVariable.CreateValuesFilter(valueFilter.Values));
                }

                else if ((filter is VariableIndexRangesFilter) && (filter.Variable.Parent != null))
                {
                    //this assumen indexes in the parent are the same..
                    VariableIndexRangesFilter indexFilter = (filter as VariableIndexRangesFilter);
                    allFilters.Add(new VariableIndexRangesFilter((IVariable)(indexFilter.Variable.Parent),
                                                                 indexFilter.IndexRanges));
                }
                else if ((filter is VariableAggregationFilter) && (filter.Variable.Parent != null))
                {
                    //this assumen indexes in the parent are the same..
                    VariableAggregationFilter aggregationFilter = (filter as VariableAggregationFilter);
                    VariableAggregationFilter clone             = (VariableAggregationFilter)aggregationFilter.Clone();
                    clone.Variable = (IVariable)filter.Variable.Parent;
                    allFilters.Add(clone);
                }
                else
                {
                    allFilters.Add(filter);
                }
            }

            if (Filters.Count != 0)
            {
                allFilters = Filters.Concat(allFilters).ToList();
            }

            List <IVariableFilter> uniqueFilters = CombineCompatibleFilters(allFilters);

            if (uniqueFilters.OfType <IVariableValueFilter>().Any(f => f.Values.Count == 0))
            {
                throw new InvalidOperationException("Variable value filters should have values!");
            }
            return(uniqueFilters.ToArray());
        }
Esempio n. 4
0
        public void AggregateOneDimension()
        {
            //two dimensional function aggregation on x variable
            Function f = new Function();
            var      x = new Variable <int>("x");
            var      y = new Variable <int>("x");

            f.Arguments.Add(x);
            f.Arguments.Add(y);

            //step through x 0,5,10,...100..selecting 21 values from 0 to 100 ranging 101 values
            var xFilter = new VariableAggregationFilter(x, 5, 0, 100);

            FilteredArrayInfo info = new FilteredArrayInfo(f, new[] { xFilter });

            Assert.AreEqual(new[] { 0, -1 }, info.Origin);
            Assert.AreEqual(new[] { 21, -1 }, info.Shape);
            Assert.AreEqual(new[] { 101, -1 }, info.Size);
            Assert.AreEqual(new[] { 5, -1 }, info.Stride);
        }
Esempio n. 5
0
        public void SelectTwoDimensional()
        {
            IFunction f = new Function();
            var       x = new Variable <int>("x");
            var       y = new Variable <int>("x");

            f.Arguments.Add(x);
            f.Arguments.Add(y);
            //step through x 0,5,10,...100..selecting 21 values from 0 to 100 ranging 101 values
            var xFilter = new VariableAggregationFilter(x, 5, 0, 100);
            //step through y 10,12,14..20..selecting 6 values from 10 to 20 ranging 11
            var yFilter = new VariableAggregationFilter(y, 2, 10, 20);

            FilteredArrayInfo info = new FilteredArrayInfo(f, new[] { xFilter, yFilter });

            Assert.AreEqual(new[] { 0, 10 }, info.Origin);
            Assert.AreEqual(new[] { 21, 6 }, info.Shape);
            Assert.AreEqual(new[] { 101, 11 }, info.Size);
            Assert.AreEqual(new[] { 5, 2 }, info.Stride);
        }
        public void SampleSize()
        {
            IVariable <int> x = new Variable <int>();

            int stepSize   = 1;
            int startIndex = 0;
            int endIndex   = 0;
            var filter     = new VariableAggregationFilter(x, stepSize, startIndex, endIndex);

            Assert.AreEqual(1, filter.Count);

            stepSize   = 2;
            startIndex = 0;
            endIndex   = 3;
            filter     = new VariableAggregationFilter(x, stepSize, startIndex, endIndex);
            Assert.AreEqual(2, filter.Count);


            stepSize   = 2;
            startIndex = 0;
            endIndex   = 4;
            filter     = new VariableAggregationFilter(x, stepSize, startIndex, endIndex);
            Assert.AreEqual(3, filter.Count);
        }
        /// <summary>
        /// Renders feature on a given map.
        /// </summary>
        /// <param name="feature">Feature to render</param>
        /// <param name="g">Graphics object to be used as a target for rendering</param>
        /// <param name="layer">Layer where feature belongs to</param>
        /// <returns>When rendering succeds - returns true, otherwise false</returns>
        public virtual bool Render(IFeature feature, Graphics g, ILayer layer)
        {
            if (null == RegularGridCoverageLayer)
            {
                throw new Exception("RegularGridCoverageRenderer needs reference to RegularGridCoverageLayer");
            }
            var gridLayer = RegularGridCoverageLayer;
            var grid      = gridLayer.RenderedCoverage;

            IEnvelope mapExtents = layer.Map.Envelope;

            //  IEnvelope gridExtents = grid.Geometry.EnvelopeInternal;

            //do not render invalid grid
            if (grid.SizeX == 0 || grid.SizeY == 0)
            {
                return(false);
            }

            //create filters for x, y to only obtain necessary data from functionstore.


            //  var xFilter = new VariableValueRangesFilter<double>(grid.X, new[] { new Pair<double, double>(layer.Map.Envelope.MinX,layer.Map.Envelope.MaxX) });
            //  var yFilter = new VariableValueRangesFilter<double>(grid.Y, new[] { new Pair<double, double>(layer.Map.Envelope.MinY, layer.Map.Envelope.MaxY) });

            IMultiDimensionalArray <double> xValues = grid.X.Values;
            var indexMinX = FindNearest(xValues, layer.Map.Envelope.MinX);
            var indexMaxX = FindNearest(xValues, layer.Map.Envelope.MaxX);
            IMultiDimensionalArray <double> yValues = grid.Y.Values;
            var indexMinY = FindNearest(yValues, layer.Map.Envelope.MinY);
            var indexMaxY = FindNearest(yValues, layer.Map.Envelope.MaxY);

            if (indexMaxX == indexMinX || indexMaxY == indexMinY)
            {
                return(true);                                                  //nothing to render.
            }

            /*
             *          var xWidth = xFilter.IndexRanges[0].Second - xFilter.IndexRanges[0].First + 1;
             *          var yWidth = yFilter.IndexRanges[0].Second - yFilter.IndexRanges[0].First + 1;
             */

            const PixelFormat pixelFormat = PixelFormat.Format32bppArgb;


            var gridMinX = xValues[indexMinX];
            var gridMaxX = xValues[indexMaxX] + grid.DeltaX;
            var gridMinY = yValues[indexMinY];
            var gridMaxY = yValues[indexMaxY] + grid.DeltaY;

            //height and offset for the rasterlayer
            var targetOffsetX = (int)((gridMinX - mapExtents.MinX) / layer.Map.PixelWidth);
            var targetOffsetY = (int)((mapExtents.MaxY - gridMaxY) / layer.Map.PixelHeight);
            var targetWidth   = (int)((gridMaxX - gridMinX) / layer.Map.PixelWidth);
            var targetHeight  = (int)((gridMaxY - gridMinY) / layer.Map.PixelHeight);

            if (targetHeight == 0 || targetWidth == 0)
            {
                return(true);
            }

            //in case there is just one pixel stepsize should be 1
            var stepsizeX = Math.Max((indexMaxX - indexMinX) / targetWidth, 1);
            var stepsizeY = Math.Max((indexMaxY - indexMinY) / targetHeight, 1);

            /*
             *            var xFilter = new VariableAggregationFilter(grid.Components[0].Arguments.Where(a=>a.Name==grid.X.Name).FirstOrDefault(), stepsizeX, indexMinX, indexMaxX);
             *      var yFilter = new VariableAggregationFilter(grid.Components[0].Arguments.Where(a=>a.Name==grid.Y.Name).FirstOrDefault(), stepsizeY, indexMinY, indexMaxY);
             *
             */
            var xFilter = new VariableAggregationFilter(grid.X, stepsizeX, indexMinX, indexMaxX);
            var yFilter = new VariableAggregationFilter(grid.Y, stepsizeY, indexMinY, indexMaxY);

            log.DebugFormat("x: {0},{1},{2}; y: {3},{4},{5}", stepsizeX, indexMinX, indexMaxX, stepsizeY, indexMinY, indexMaxY);

            // TODO: Commented out as temporary fix. Bitmap is not be cleared any more, results in as of revision 19658 by Genna
            // Fix ensures coverage is updated properly and no strange rescaling effects when zooming or dragging a part of the coverage outside the viewport
            // occur because bitmapCache is never cleared.
            // However, the fix might incur performance issues because bitmapCache is always refreshed on Render call
            //if (null == bitmapCache)
            //{
            var filters = grid.Filters.ToList();

            filters.Add(xFilter);
            filters.Add(yFilter);

            bitmapCache = GenerateBitmap(gridLayer, grid, pixelFormat, filters.ToArray(),
                                         xFilter.Count, yFilter.Count);
            //}


            /*
             *          int targetOffsetX = (int)((gridExtents.MinX - mapExtents.MinX) / layer.Map.PixelWidth);
             *          int targetOffsetY = (int)((mapExtents.MaxY - gridExtents.MaxY) / layer.Map.PixelHeight);
             *
             *          int targetWidth = (int)(gridExtents.Width / layer.Map.PixelWidth);
             *          int targetHeight = (int)(gridExtents.Height / layer.Map.PixelHeight);
             */


            var srcRectangle    = new Rectangle(0, 0, bitmapCache.Width, bitmapCache.Height);
            var targetRectangle = new Rectangle(targetOffsetX, targetOffsetY, targetWidth, targetHeight);

            g.SetClip(targetRectangle);
            g.PixelOffsetMode   = PixelOffsetMode.Half;
            g.InterpolationMode = InterpolationMode.NearestNeighbor;
            g.DrawImage(bitmapCache, targetRectangle, srcRectangle, GraphicsUnit.Pixel);
            g.ResetClip();

            return(false);
        }
Esempio n. 8
0
        /// <summary>
        /// Renders feature on a given map.
        /// </summary>
        /// <param name="feature">Feature to render</param>
        /// <param name="g">Graphics object to be used as a target for rendering</param>
        /// <param name="layer">Layer where feature belongs to</param>
        /// <returns>When rendering succeds - returns true, otherwise false</returns>
        public virtual bool Render(IFeature feature, Graphics g, ILayer layer)
        {
            if (null == RegularGridCoverageLayer)
            {
                throw new Exception("RegularGridCoverageRenderer needs reference to RegularGridCoverageLayer");
            }
            var gridLayer = RegularGridCoverageLayer;
            var grid      = (IRegularGridCoverage)feature;

            //do not render invalid grid
            if (grid.SizeX == 0 || grid.SizeY == 0)
            {
                log.ErrorFormat("The following grid could not be rendered: '{0}'", grid.Name);
                return(false);
            }


            IEnvelope mapExtents = layer.Map.Envelope;
            //  IEnvelope gridExtents = grid.Geometry.EnvelopeInternal;

            //create filters for x, y to only obtain necessary data from functionstore.


            //  var xFilter = new VariableValueRangesFilter<double>(grid.X, new[] { new Pair<double, double>(layer.Map.Envelope.MinX,layer.Map.Envelope.MaxX) });
            //  var yFilter = new VariableValueRangesFilter<double>(grid.Y, new[] { new Pair<double, double>(layer.Map.Envelope.MinY, layer.Map.Envelope.MaxY) });

            IMultiDimensionalArray <double> xValues = grid.X.Values;
            var indexMinX = FindNearest(xValues, layer.Map.Envelope.MinX);
            var indexMaxX = FindNearest(xValues, layer.Map.Envelope.MaxX);
            IMultiDimensionalArray <double> yValues = grid.Y.Values;
            var indexMinY = FindNearest(yValues, layer.Map.Envelope.MinY);
            var indexMaxY = FindNearest(yValues, layer.Map.Envelope.MaxY);

            if (indexMaxX == indexMinX || indexMaxY == indexMinY)
            {
                return(true);                                                  //nothing to render.
            }

            /*
             *          var xWidth = xFilter.IndexRanges[0].Second - xFilter.IndexRanges[0].First + 1;
             *          var yWidth = yFilter.IndexRanges[0].Second - yFilter.IndexRanges[0].First + 1;
             */

            const PixelFormat pixelFormat = PixelFormat.Format32bppRgb;


            var gridMinX = xValues[indexMinX];
            var gridMaxX = xValues[indexMaxX] + grid.DeltaX;
            var gridMinY = yValues[indexMinY];
            var gridMaxY = yValues[indexMaxY] + grid.DeltaY;

            //height and offset for the rasterlayer
            var targetOffsetX = (int)((gridMinX - mapExtents.MinX) / layer.Map.PixelWidth);
            var targetOffsetY = (int)((mapExtents.MaxY - gridMaxY) / layer.Map.PixelHeight);
            var targetWidth   = (int)((gridMaxX - gridMinX) / layer.Map.PixelWidth);
            var targetHeight  = (int)((gridMaxY - gridMinY) / layer.Map.PixelHeight);

            if (targetHeight == 0 || targetWidth == 0)
            {
                return(true);
            }

            //in case there is just one pixel stepsize should be 1
            var stepsizeX = Math.Max((indexMaxX - indexMinX) / targetWidth, 1);
            var stepsizeY = Math.Max((indexMaxY - indexMinY) / targetHeight, 1);

            /*
             *            var xFilter = new VariableAggregationFilter(grid.Components[0].Arguments.Where(a=>a.Name==grid.X.Name).FirstOrDefault(), stepsizeX, indexMinX, indexMaxX);
             *      var yFilter = new VariableAggregationFilter(grid.Components[0].Arguments.Where(a=>a.Name==grid.Y.Name).FirstOrDefault(), stepsizeY, indexMinY, indexMaxY);
             *
             */
            var xFilter = new VariableAggregationFilter(grid.X, stepsizeX, indexMinX, indexMaxX);
            var yFilter = new VariableAggregationFilter(grid.Y, stepsizeY, indexMinY, indexMaxY);

            log.DebugFormat("x: {0},{1},{2}; y: {3},{4},{5}", stepsizeX, indexMinX, indexMaxX, stepsizeY, indexMinY, indexMaxY);

            if (null == bitmapCache)
            {
                var filters       = grid.Filters.ToList();
                var coverageLayer = (RegularGridCoverageLayer)layer;
                if (coverageLayer.TimeSelectionStart != null)
                {
                    filters.Add(new VariableValueFilter <DateTime>(grid.Time, coverageLayer.TimeSelectionStart.Value));
                }
                filters.Add(xFilter);
                filters.Add(yFilter);

                bitmapCache = GenerateBitmap(gridLayer, grid, pixelFormat, filters.ToArray(),
                                             xFilter.Count, yFilter.Count);
            }


            /*
             *          int targetOffsetX = (int)((gridExtents.MinX - mapExtents.MinX) / layer.Map.PixelWidth);
             *          int targetOffsetY = (int)((mapExtents.MaxY - gridExtents.MaxY) / layer.Map.PixelHeight);
             *
             *          int targetWidth = (int)(gridExtents.Width / layer.Map.PixelWidth);
             *          int targetHeight = (int)(gridExtents.Height / layer.Map.PixelHeight);
             */


            var srcRectangle    = new Rectangle(0, 0, bitmapCache.Width, bitmapCache.Height);
            var targetRectangle = new Rectangle(targetOffsetX, targetOffsetY, targetWidth, targetHeight);

            g.SetClip(targetRectangle);
            g.PixelOffsetMode   = PixelOffsetMode.Half;
            g.InterpolationMode = InterpolationMode.NearestNeighbor;
            g.DrawImage(bitmapCache, targetRectangle, srcRectangle, GraphicsUnit.Pixel);
            g.ResetClip();

            // clear memory claimed by MD arrays to avoid out of memory exception
            xValues = null;
            yValues = null;
            GC.Collect();
            return(false);
        }