Example #1
0
        private static Tuple <double, double> GetMaxMinFromGridFile(IRegularGridCoverage grid)
        {
            Tuple <double, double> tuple = new Tuple <double, double>();

            IList <double> values;

            if (grid.Components[0].ValueType == typeof(double))
            {
                values = grid.GetValues <double>();
            }
            else //convert
            {
                values = new List <double>();
                var nonConvertedValues = grid.GetValues();
                foreach (var obj in nonConvertedValues)
                {
                    values.Add(Convert.ToDouble(obj));
                }
            }


            double maxValue       = double.MinValue;
            double secondMaxValue = double.MinValue;
            double minValue       = double.MaxValue;
            double secondMinValue = double.MaxValue;

            // we need to filter out any non-data values. So we look at two most extreme values
            // on either side, assuming that only one value (but perhaps one for positive and
            // one for negative) is used for non-data. We do this by looking at the difference
            // between the maximum found and the second maximum found, and comparing this to the
            // difference between the second maximum and the second minimum.
            foreach (double value in values)
            {
                maxValue = Math.Max(maxValue, value);
                minValue = Math.Min(minValue, value);
            }

            foreach (double value in values)
            {
                if (value < maxValue)
                {
                    secondMaxValue = Math.Max(secondMaxValue, value);
                }
                if (value > minValue)
                {
                    secondMinValue = Math.Min(secondMinValue, value);
                }
            }

            tuple.value1 = (Math.Abs(minValue - secondMinValue) > Math.Abs(secondMaxValue - secondMinValue))
                               ?
                           secondMinValue
                               : minValue;
            tuple.value2 = (Math.Abs(maxValue - secondMaxValue) > Math.Abs(secondMaxValue - secondMinValue))
                               ?
                           secondMaxValue
                               : maxValue;

            return(tuple);
        }
        public void CheckEnvelope()
        {
            string            filePath = @"..\..\..\..\data\RasterData\Schematisatie.bil";
            GdalFunctionStore store    = new GdalFunctionStore
            {
                Path = Path.GetFullPath(filePath)
            };

            IRegularGridCoverage regularGridCoverage = store.Grid;

            Assert.IsNotNull(store);

            //check wether geometry has been updated in the right manner.
            Assert.AreEqual(0, regularGridCoverage.Geometry.Envelope.EnvelopeInternal.MinX, 0.1);
            Assert.AreEqual(60, regularGridCoverage.Geometry.Envelope.EnvelopeInternal.MaxX, 0.1);

            Assert.AreEqual(0, regularGridCoverage.Geometry.Envelope.EnvelopeInternal.MinY, 0.1);
            Assert.AreEqual(60, regularGridCoverage.Geometry.Envelope.EnvelopeInternal.MaxY, 0.1);

            Assert.AreEqual(3, regularGridCoverage.SizeY);
            Assert.AreEqual(3, regularGridCoverage.SizeX);


            Assert.AreEqual(20.0, regularGridCoverage.DeltaX, 0.1);
            Assert.AreEqual(-20.0, regularGridCoverage.DeltaY, 0.1);

            //check wether lower left corner lies at (0, 0)
            Assert.AreEqual(0.0, regularGridCoverage.Origin.X, 0.1);
            Assert.AreEqual(60.0, regularGridCoverage.Origin.Y, 0.1);
        }
Example #3
0
        public void ReadBinaryRasterFile()
        {
            string fileName    = RasterDataPath + "SchematisatieInt.bil";
            var    rasterLayer = new RegularGridCoverageLayer();

            var rasterFeatureProvider = new GdalFeatureProvider {
                Path = fileName
            };

            rasterFeatureProvider.Open();
            IRegularGridCoverage grid   = rasterFeatureProvider.Grid;
            IList <int>          values = grid.GetValues <int>();

            Assert.AreEqual(9, values.Count);

            IList <int> values2 = grid.GetValues <int>(
                new VariableValueFilter <double>(grid.X, grid.X.Values[0]),
                new VariableValueFilter <double>(grid.Y, grid.Y.Values[0])
                );

            Assert.AreEqual(1, values2.Count);
            Assert.AreEqual(7, values2[0]);

            //rasterLayer.CustomRenderers.Add(new RegularGridCoverageRenderer()); // add optimized custom gdal renderer
            rasterLayer.DataSource = rasterFeatureProvider;


            IRegularGridCoverage regularGridCoverage = rasterFeatureProvider.Grid;
        }
Example #4
0
        public void RenderBilFileAsCoverage()
        {
            var map = new Map(new Size(400, 200))
            {
                Name = "map1"
            };

            string fileName = RasterDataPath + "SchematisatieInt.bil";

            var rasterLayer = new RegularGridCoverageLayer();

            var rasterFeatureProvider = new GdalFeatureProvider {
                Path = fileName
            };

            rasterLayer.CustomRenderers.Add(new RegularGridCoverageRenderer(rasterLayer));
            // add optimized custom gdal renderer
            rasterLayer.DataSource = rasterFeatureProvider;

            map.Layers.Add(rasterLayer);

            IRegularGridCoverage grid   = rasterFeatureProvider.Grid;
            IList <int>          values = grid.GetValues <int>();

            Assert.AreEqual(9, values.Count);

            MapTestHelper.Show(map);
        }
Example #5
0
        public void GenerateThemeForBilFileWithoutLegendFile()
        {
            const string fileName = @"..\..\..\..\..\test-data\DeltaShell\DeltaShell.Plugins.SharpMapGis.Tests\RasterData\SchematisatieUInt.bil";

            RegularGridCoverageLayer rasterLayer           = new RegularGridCoverageLayer();
            GdalFeatureProvider      rasterFeatureProvider = new GdalFeatureProvider {
                Path = fileName
            };

            rasterFeatureProvider.Open();
            rasterLayer.DataSource = rasterFeatureProvider;
            IRegularGridCoverage grid = rasterLayer.Grid;

            ITheme theme = DemisMapControlLegendHelper.ConvertLegendToTheme(fileName, "value", grid);

            Assert.IsTrue(((GradientTheme)theme).Max == 9.0);
            Assert.IsTrue(((GradientTheme)theme).Min == 1.0);

            Assert.IsInstanceOfType(typeof(GradientTheme), theme);
            foreach (IThemeItem themeItem in theme.ThemeItems)
            {
                Assert.IsInstanceOfType(typeof(GradientThemeItem), themeItem);
                Assert.IsInstanceOfType(typeof(VectorStyle), themeItem.Style);
            }
        }
Example #6
0
        public void CreateNewRasterLayer()
        {
            // read source grid
            string filePath       = RasterDataPath + "Schematisatie.bil";
            var    sourceProvider = new GdalFeatureProvider {
                Path = filePath
            };
            IRegularGridCoverage sourceGrid = sourceProvider.Grid;

            // create a new grid
            //const string targetFilePath = @"..\..\..\..\data\RasterData\SchematisatieTest.asc";
            const string targetFilePath = "GdalProviderTest.CreateNewRasterLayer.asc";
            var          targetProvider = new GdalFeatureProvider();

            targetProvider.CreateNew(targetFilePath);

            Assert.AreEqual(0, targetProvider.Features.Count);

            targetProvider.Features.Add(sourceGrid);
            // provider will write a source grid into .asc file and will add a new grid
            Assert.AreEqual(1, targetProvider.Features.Count);

            Assert.AreEqual(sourceGrid.SizeX, targetProvider.Grid.SizeX);
            Assert.AreEqual(sourceGrid.SizeY, targetProvider.Grid.SizeY);
            Assert.AreEqual(sourceGrid.DeltaX, targetProvider.Grid.DeltaX);
            Assert.AreEqual(sourceGrid.DeltaY, targetProvider.Grid.DeltaY);

            Assert.IsTrue(sourceGrid.X.Values.SequenceEqual(targetProvider.Grid.X.Values));
            Assert.IsTrue(sourceGrid.GetValues <float>().SequenceEqual(targetProvider.Grid.GetValues <float>()));
        }
        public void TimeDependentGridGetTimeSeriesAtUnKnownLocation()
        {
            DateTime             time1;
            DateTime             time2;
            IRegularGridCoverage grid2D = CreatePressureTimeDependentRegularGridCoverage(out time1, out time2);

            grid2D.GetTimeSeries(new Coordinate(75.0, 75.0));
        }
 /// <summary>
 /// Fills gridvalues function with profiledata based on profileline over the grid
 /// </summary>
 /// <param name="function"></param>
 /// <param name="grid"></param>
 /// <param name="polyline"></param>
 public static void UpdateGridValues(Function function, IRegularGridCoverage grid, ILineString polyline)
 {
     function.Clear();
     double offset = 0;
     double step = polyline.Length / 100;
     foreach (ICoordinate coordinate in GetGridProfileCoordinates(polyline, step))
     {
         function[offset] = grid.Evaluate(coordinate);
         offset += step;
     }
 }
Example #9
0
        /// <summary>
        /// Fills gridvalues function with profiledata based on profileline over the grid
        /// </summary>
        /// <param name="function"></param>
        /// <param name="grid"></param>
        /// <param name="polyline"></param>
        public static void UpdateGridValues(Function function, IRegularGridCoverage grid, ILineString polyline)
        {
            function.Clear();
            double offset = 0;
            double step   = polyline.Length / 100;

            foreach (ICoordinate coordinate in GetGridProfileCoordinates(polyline, step))
            {
                function[offset] = grid.Evaluate(coordinate);
                offset          += step;
            }
        }
        public void TimeDependentGrid2D()
        {
            DateTime             time1;
            DateTime             time2;
            IRegularGridCoverage grid2D = CreatePressureTimeDependentRegularGridCoverage(out time1, out time2);

            Assert.IsTrue(grid2D.Time.Values.SequenceEqual(new[] { time1, time2 }));

            // time values are added last. internal array is 1,2,3,4,5,6,10,20,30,40,50,60
            Assert.AreEqual(10.0, grid2D.GetValues <double>()[6]);
            Assert.AreEqual(2.0, grid2D.GetValues <double>()[1]);
            Assert.AreEqual(12, grid2D.GetValues <double>().Count);
        }
        public void TimeDependentGridGetTimeSeriesAtKnownLocation()
        {
            DateTime             time1;
            DateTime             time2;
            IRegularGridCoverage grid2D = CreatePressureTimeDependentRegularGridCoverage(out time1, out time2);

            var timeSeries = grid2D.GetTimeSeries(new Coordinate(100.0, 100.0));

            Assert.AreEqual(1, timeSeries.Arguments.Count);
            Assert.AreEqual(1, timeSeries.Components.Count);
            var values = timeSeries.GetValues();

            Assert.AreEqual(2, values.Count);
            Assert.AreEqual(6.0, values[0]);
            Assert.AreEqual(60.0, values[1]);
        }
        private static Bitmap GenerateBitmap(IRegularGridCoverageLayer gridLayer, IRegularGridCoverage grid,
                                             PixelFormat pixelFormat, IVariableFilter[] filters, int xWidth, int yWidth)
        {
            /*var xWidth =
             *  ((VariableIndexRangesFilter) filters[0]).IndexRanges[0].Second-((VariableIndexRangesFilter) filters[0]).
             *      IndexRanges[0].First +1;
             * var yWidth = ((VariableIndexRangesFilter)filters[1]).IndexRanges[0].Second - ((VariableIndexRangesFilter)filters[1]).
             *      IndexRanges[0].First+1;*/


            var bitmap = new Bitmap(xWidth, yWidth, pixelFormat);


            if (grid.Components[0].ValueType == typeof(double))
            {
                FillBitmap <double>(gridLayer, grid, bitmap, pixelFormat, filters);
            }
            else if (grid.Components[0].ValueType == typeof(float))
            {
                FillBitmap <float>(gridLayer, grid, bitmap, pixelFormat, filters);
            }
            else if (grid.Components[0].ValueType == typeof(int))
            {
                FillBitmap <int>(gridLayer, grid, bitmap, pixelFormat, filters);
            }
            else if (grid.Components[0].ValueType == typeof(short))
            {
                FillBitmap <short>(gridLayer, grid, bitmap, pixelFormat, filters);
            }
            else if (grid.Components[0].ValueType == typeof(UInt32))
            {
                FillBitmap <UInt32>(gridLayer, grid, bitmap, pixelFormat, filters);
            }
            else if (grid.Components[0].ValueType == typeof(Byte))
            {
                //todo hack: in case source file is tiff it has its own color
                //return bitmap;
                FillBitmap <Byte>(gridLayer, grid, bitmap, pixelFormat, filters);
            }
            else
            {
                log.WarnFormat("Cant render type: " + grid.Components[0].ValueType);
            }
            return(bitmap);
        }
        /// <summary>
        /// Defines the gridProfile function
        /// </summary>
        /// <param name="grid"></param>
        /// <param name="polyline"></param>
        public static Function GetGridValues(IRegularGridCoverage grid, ILineString polyline)
        {
            Function function = new Function {Name = grid.Name};
            if (grid.Time != null)
            {
                grid.Name += " (" + grid.Time + ")";
            }
            function.Arguments.Add(new Variable<double>("offset"));
         function.Components.Add(  (IVariable) TypeUtils.CreateGeneric(typeof (Variable<>), grid.Components[0].ValueType, new object[] {"value"}));
            function.Components[0].NoDataValues = grid.Components[0].NoDataValues;

            if (null == polyline)
            {
                return function;
            }
            UpdateGridValues(function, grid, polyline);
            return function;
        }
        public RegularGridCoverage(IRegularGridCoverage grid)
        {
            if (grid.Components.Count > 1)
            {
                throw new NotImplementedException("Copy constructor not implemented for grids with more than one component");
            }
            if (grid.Components[0].NoDataValues.Count > 1)
            {
                throw new NotImplementedException("Copy constructor not implemented for component with multiple nodata values");
            }


            Name = grid.Name;
            var y = new Variable <double>("y", grid.SizeY)
            {
                InterpolationType = InterpolationType.Constant
            };

            y.Attributes[StandardName] = StandardNameY;
            Arguments.Add(y);

            var x = new Variable <double>("x", grid.SizeX)
            {
                InterpolationType = InterpolationType.Constant
            };

            x.Attributes[StandardName] = StandardNameX;
            Arguments.Add(x);


            IVariable variable = grid.Components[0].Clone();

            //clear arguments because they will be added when the component is added to the function
            variable.Arguments.Clear();
            Components.Add(variable);



            CollectionChanged += RegularGridCoverage_CollectionChanged;
            ValuesChanged     += RegularGridCoverage_ValuesChanged;
            IsTimeDependent    = grid.IsTimeDependent;
            // update sizes of the arguments
            Resize(grid.SizeX, grid.SizeY, grid.DeltaX, grid.DeltaY, new Coordinate(grid.Origin.X, grid.Origin.Y));
        }
        public void GenerateThemeForCategorialBilFileWithLegendFile()
        {
            const string fileName = @"..\..\..\..\..\test-data\DeltaShell\DeltaShell.Plugins.SharpMapGis.Tests\RasterData\bodem.bil";

            var rasterLayer           = new RegularGridCoverageLayer();
            var rasterFeatureProvider = new GdalFeatureProvider {
                Path = fileName
            };

            rasterLayer.DataSource = rasterFeatureProvider;
            IRegularGridCoverage grid = rasterLayer.Grid;

            ITheme theme = DemisMapControlLegendHelper.ConvertLegendToTheme(fileName, "value", grid);

            ICollection colors = new List <string>(new string[]
            {
                "0000FF",
                "00FFFF",
                "00FF00",
                "FFFF00",
                "FF0000"
            });
            ICollection values = new List <double>(new double[] { 1, 2, 3, 4, 5 });

            Assert.IsInstanceOfType(typeof(CategorialTheme), theme);
            foreach (IThemeItem themeItem in theme.ThemeItems)
            {
                Assert.IsInstanceOfType(typeof(CategorialThemeItem), themeItem);
                Assert.IsInstanceOfType(typeof(VectorStyle), themeItem.Style);

                double value = Convert.ToDouble(((CategorialThemeItem)themeItem).Value);
                Assert.Contains(value, values);
                ((List <double>)values).Remove(value);

                string color = FromColorToBGRString(((SolidBrush)((VectorStyle)themeItem.Style).Fill).Color);
                Assert.Contains(color, colors);
                ((List <string>)colors).Remove(color);
            }

            Assert.IsTrue(colors.Count == 0);
            Assert.IsTrue(values.Count == 0);
        }
        public void GetCoordinatesInCoverageWithOffset()
        {
            IRegularGridCoverage     grid2D = CreatePressureCoverage(1000.0, 0.0);
            IRegularGridCoverageCell regularGridCoverageCell = grid2D.GetRegularGridCoverageCellAtPosition(1000.0, 0.0);

            Assert.AreEqual(1000.0, regularGridCoverageCell.X);
            Assert.AreEqual(0.0, regularGridCoverageCell.Y);

            regularGridCoverageCell = grid2D.GetRegularGridCoverageCellAtPosition(1050.0, 25.0);
            Assert.AreEqual(1000.0, regularGridCoverageCell.X);
            Assert.AreEqual(0.0, regularGridCoverageCell.Y);

            regularGridCoverageCell = grid2D.GetRegularGridCoverageCellAtPosition(1150.0, 25.0);
            Assert.AreEqual(1100.0, regularGridCoverageCell.X);
            Assert.AreEqual(0.0, regularGridCoverageCell.Y);

            regularGridCoverageCell = grid2D.GetRegularGridCoverageCellAtPosition(1199.0, 99.0);
            Assert.AreEqual(1100.0, regularGridCoverageCell.X);
            Assert.AreEqual(50.0, regularGridCoverageCell.Y);
        }
Example #17
0
        private void SubstituteDriverByInMemIfReadonly(IRegularGridCoverage addedCoverage, Driver gdalDriver)
        {
            var canCreate = gdalDriver.GetMetadataItem("DCAP_CREATE", null) == "YES";

            //cannot create use mem driver.
            if (!canCreate)
            {
                using (var inMemoryDriver = Gdal.GetDriverByName("MEM"))
                {
                    DataType dataType =
                        GdalHelper.GetGdalDataType(inMemoryDriver, addedCoverage.Components[0].ValueType);

                    if (dataType.Equals(DataType.GDT_Unknown))
                    {
                        throw new NotSupportedException(
                                  String.Format("The datatype {0} cannot be saved to this kind of file: {1}",
                                                addedCoverage.Components[0].ValueType, System.IO.Path.GetExtension(path)));
                    }

                    gdalDataset = inMemoryDriver.Create(path, addedCoverage.SizeX, addedCoverage.SizeY,
                                                        addedCoverage.Components.Count, dataType,
                                                        new string[] { });
                }
            }
            else
            {
                DataType dataType =
                    GdalHelper.GetGdalDataType(gdalDriver, addedCoverage.Components[0].ValueType);

                if (dataType.Equals(DataType.GDT_Unknown))
                {
                    throw new NotSupportedException(
                              String.Format("The datatype {0} cannot be saved to this kind of file: {1}",
                                            addedCoverage.Components[0].ValueType, System.IO.Path.GetExtension(path)));
                }

                gdalDataset = gdalDriver.Create(path, addedCoverage.SizeX, addedCoverage.SizeY,
                                                addedCoverage.Components.Count, dataType,
                                                new string[] { });
            }
        }
Example #18
0
        /// <summary>
        /// Defines the gridProfile function
        /// </summary>
        /// <param name="grid"></param>
        /// <param name="polyline"></param>
        public static Function GetGridValues(IRegularGridCoverage grid, ILineString polyline)
        {
            Function function = new Function {
                Name = grid.Name
            };

            if (grid.Time != null)
            {
                grid.Name += " (" + grid.Time + ")";
            }
            function.Arguments.Add(new Variable <double>("offset"));
            function.Components.Add((IVariable)TypeUtils.CreateGeneric(typeof(Variable <>), grid.Components[0].ValueType, new object[] { "value" }));
            function.Components[0].NoDataValues = grid.Components[0].NoDataValues;

            if (null == polyline)
            {
                return(function);
            }
            UpdateGridValues(function, grid, polyline);
            return(function);
        }
        public void Initialization()
        {
            IRegularGridCoverage grid2D = CreatePressureCoverage(0.0, 0.0);

            Assert.AreEqual(2, grid2D.Arguments.Count);
            Assert.AreEqual("y", grid2D.Arguments[0].Name);
            Assert.AreEqual("x", grid2D.Arguments[1].Name);

            Assert.IsInstanceOfType(typeof(IPolygon), grid2D.Geometry);

            Assert.AreEqual(grid2D.SizeX, grid2D.X.Values.Count, "number of X argument values");
            Assert.AreEqual(grid2D.SizeY, grid2D.Y.Values.Count, "number of Y argument values");

            //obtain values for all x and for y=50.0 (second row.
            var values = grid2D.GetValues(new VariableValueFilter <double>(grid2D.Y, new[] { 50.0 }));

            Assert.IsTrue(((IEnumerable <double>)values).SequenceEqual(new[] { 3.0, 4.0 }));

            //obtain values for all x and for y=100.0 (third row.)
            values = grid2D.GetValues(new VariableValueFilter <double>(grid2D.Y, new[] { 100.0 }));
            Assert.IsTrue(((IEnumerable <double>)values).SequenceEqual(new[] { 5.0, 6.0 }));
        }
Example #20
0
        /// <summary>
        /// Convert a DemisMapControl legend (.leg) file to an ITheme
        /// </summary>
        /// <remarks>
        /// returns null if legend file is not found
        /// </remarks>
        /// <param name="fileName">The name of the legfile or bil-/bsq-/bipfile</param>
        /// <returns>instance of ITheme</returns>
        public static ITheme ConvertLegendToTheme(string fileName, string columnName, IRegularGridCoverage grid)
        {
            string legendFileNameBase = null;
            string legendFileName     = null;
            bool   fileIsLegend       = false;

            if (Path.GetExtension(fileName.ToLower()).Equals(".bil") ||
                Path.GetExtension(fileName.ToLower()).Equals(".bip") ||
                Path.GetExtension(fileName.ToLower()).Equals(".bsq"))
            {
                string pathName = Path.GetDirectoryName(fileName);
                string baseName = Path.GetFileNameWithoutExtension(fileName);
                legendFileNameBase = Path.Combine(pathName, baseName);
            }
            else
            {
                fileIsLegend   = true;
                legendFileName = fileName;
            }

            if (legendFileNameBase != null)
            {
                foreach (string name in
                         new string[]
                {
                    legendFileNameBase + ".leg",
                    legendFileNameBase + ".Leg",
                    legendFileNameBase + ".LEG"
                })
                {
                    if (File.Exists(name))
                    {
                        legendFileName = name;
                        break;
                    }
                }
            }

            Legend legend;

            if (legendFileName == null || (legend = ReadLegend(legendFileName)) == null)
            {
                if (fileIsLegend || grid == null)
                {
                    return(null);
                }
                return(CreateDefaultGradientTheme(columnName, GetMaxMinFromGridFile(grid)));
            }

            legend.columnName = columnName;

            Ranges <double> doubleRanges = null;
            Ranges <int>    intRanges    = null;

            if (legend.doubles)
            {
                doubleRanges = ParseRanges <double>(legend);
            }
            else
            {
                intRanges = ParseRanges <int>(legend);
            }

            ITheme newTheme;

            if (intRanges != null && intRanges.IsClassification)
            {
                newTheme = CreateCategorialTheme(legend, intRanges);
            }
            else if (legend.doubles)
            {
                newTheme = CreateQuantityTheme <double>(legend, doubleRanges);
            }
            else
            {
                newTheme = CreateQuantityTheme <int>(legend, intRanges);
            }

            return(newTheme);
        }
Example #21
0
        private static Dataset GetOutputDataset <T>(Dataset gdalDataset, Driver gdalDriver, Driver targetDatasetDriver, IRegularGridCoverage gridCoverage, int rasterBandIndex, RasterBoundaries rasterBoundaries, T[] values)
        {
            Dataset outputDataset = gdalDataset;

            if (targetDatasetDriver.ShortName == "PCRaster")
            {
                // Convert the in mem dataset to a pc rasterBoundaries compatible one...

                Type valueType = gridCoverage.Components[0].ValueType;

                DataType dataType =
                    GdalHelper.GetGdalDataType(targetDatasetDriver, valueType);

                outputDataset = gdalDriver.Create(gridCoverage.Name, gdalDataset.RasterXSize,
                                                  gdalDataset.RasterYSize,
                                                  gridCoverage.Components.Count, dataType, new string[] { });

                GdalHelper.SetValuesForBand(outputDataset, rasterBandIndex, rasterBoundaries.StartX, rasterBoundaries.StartY, rasterBoundaries.WidthX, rasterBoundaries.WidthY, values);
            }
            return(outputDataset);
        }
Example #22
0
        /// <summary>
        /// Sony NS @ 2013-08-06
        /// </summary>
        /// <param name="worldPos"></param>
        /// <param name="limit"></param>
        /// <param name="outLayer"></param>
        /// <param name="condition"></param>
        /// <returns></returns>
        public IFeature FindNearestFeature(ICoordinate worldPos, float limit, out ILayer outLayer, Func <ILayer, bool> condition)
        {
            IFeature nearestFeature = null;

            outLayer = null;

            // Since we are only interested in one geometry object start with the topmost trackersLayer and stop
            // searching the lower layers when an object is found.

            // Sony NS @ 2013-08-06, order list ILayer Desc, karena untuk layer-layer symbol diload paling terakhir
            foreach (ILayer mapLayer in Map.GetAllVisibleLayers(true).Reverse())
            {
                if (mapLayer is DiscreteGridPointCoverageLayer)
                {
                    try
                    {
                        var curvilinearGridLayer = (DiscreteGridPointCoverageLayer)mapLayer;
                        var coverage             = (IDiscreteGridPointCoverage)curvilinearGridLayer.Coverage;

                        var nearestFeatures = coverage.GetFeatures(worldPos.X, worldPos.Y, limit);

                        if (nearestFeatures != null)
                        {
                            if (!curvilinearGridLayer.ShowFaces)
                            {
                                nearestFeatures = nearestFeatures.Where(f => !(f is IGridFace));
                            }

                            if (!curvilinearGridLayer.ShowVertices)
                            {
                                nearestFeatures = nearestFeatures.Where(f => !(f is IGridVertex));
                            }
                        }

                        nearestFeature = nearestFeatures.FirstOrDefault();

                        outLayer = curvilinearGridLayer;
                    }
                    catch (Exception)
                    {
                        // GetCoordinateAtPosition will throw exception if x, y is not within the coverage
                    }
                }
                if (mapLayer is VectorLayer)
                {
                    var       vectorLayer = mapLayer as VectorLayer;
                    IEnvelope envelope;
                    float     localLimit = limit;

                    if ((!vectorLayer.IsSelectable) || ((null != condition) && (!condition(vectorLayer))))
                    {
                        continue;
                    }
                    // Adjust the marge limit for Layers with a symbol style and if the size of the symbol exceeds
                    // the minimum limit. Ignore layers with custom renderers
                    if ((vectorLayer.Style.Symbol != null) && (0 == vectorLayer.CustomRenderers.Count))
                    {
                        ICoordinate size = MapHelper.ImageToWorld(MapControl.Map,
                                                                  vectorLayer.Style.Symbol.Width,
                                                                  vectorLayer.Style.Symbol.Height);
                        if ((size.X > localLimit) || (size.Y > localLimit))
                        {
                            envelope   = MapHelper.GetEnvelope(worldPos, size.X, size.Y);
                            localLimit = (float)Math.Max(envelope.Width, envelope.Height);
                        }
                        else
                        {
                            envelope = GetEnvelope(worldPos, localLimit);
                        }
                    }
                    else
                    {
                        envelope = GetEnvelope(worldPos, localLimit);
                    }

                    IFeatureProvider featureProvider = vectorLayer.DataSource;
                    if (null != featureProvider)
                    {
                        // Get features in the envelope
                        IList objectsAt;

                        if (vectorLayer.CustomRenderers.Count > 0)
                        {
                            objectsAt = vectorLayer.CustomRenderers[0].GetFeatures(envelope, vectorLayer);
                        }
                        else
                        {
                            objectsAt = featureProvider.GetFeatures(envelope);
                        }
                        // Mousedown at new position
                        if (null != objectsAt)
                        {
                            IFeature feature = null;
                            if (objectsAt.Count == 1)
                            {
                                feature = objectsAt.OfType <IFeature>().First();
                            }
                            else if (objectsAt.Count > 1)
                            {
                                double localDistance;
                                feature = FindNearestFeature(vectorLayer, objectsAt, worldPos, localLimit, out localDistance);
                            }

                            if (null != feature)
                            {
                                nearestFeature = feature;
                                outLayer       = vectorLayer;
                                break;
                            }
                        }
                    }
                }
                else if (mapLayer is IRegularGridCoverageLayer)
                {
                    try
                    {
                        IRegularGridCoverageLayer regularGridCoverageLayer = (IRegularGridCoverageLayer)mapLayer;
                        IRegularGridCoverage      regularGridCoverage      = (IRegularGridCoverage)regularGridCoverageLayer.Coverage;

                        nearestFeature = regularGridCoverage.GetRegularGridCoverageCellAtPosition(worldPos.X, worldPos.Y);
                        outLayer       = regularGridCoverageLayer;
                    }
                    catch (Exception)
                    {
                        // GetCoordinateAtPosition will throw exception if x, y is not within the coverage
                    }
                }
            }
            return(nearestFeature);
        }
        protected static void FillBitmap <T>(IRegularGridCoverageLayer gridLayer, IRegularGridCoverage gridCoverage,
                                             Bitmap bitmap, PixelFormat pixelFormat, IVariableFilter[] filters)
            where T : IComparable, IComparable <T>
        {
            // HACK: free memory before getting large block
            GC.Collect(1, GCCollectionMode.Optimized);

            T[] gridValues = gridCoverage.Components[0].GetValues <T>(filters).ToArray();

            var imageWidth  = bitmap.Width;
            var imageHeight = bitmap.Height;

            Trace.Assert(imageHeight * imageWidth == gridValues.Count());
            //flip upside down
            for (int k = 0; k < imageWidth; k++)
            {
                for (int j = 0; j < imageHeight / 2; j++)
                {
                    T swap1 = gridValues[k + j * imageWidth];
                    T swap2 = gridValues[(imageHeight - 1 - j) * imageWidth + k];
                    gridValues[k + j * imageWidth] = swap2;
                    gridValues[(imageHeight - 1 - j) * imageWidth + k] = swap1;
                }
            }

            if (gridLayer.Theme == null)
            {
                object minValue = gridCoverage.Components[0].MinValue;
                object maxValue = gridCoverage.Components[0].MaxValue;

                gridLayer.Theme = GenerateDefaultTheme(gridCoverage.Components[0].Name,
                                                       gridCoverage.Components[0].NoDataValues, minValue, maxValue);
            }

            // Add NoDataValues from grid coverage if it was unspecified:
            var theme = gridLayer.Theme as Theme;

            if (theme != null && theme.NoDataValues == null)
            {
                theme.NoDataValues = gridCoverage.Components[0].NoDataValues;
            }

            BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, imageWidth, imageHeight),
                                                    ImageLockMode.ReadWrite, pixelFormat);

            try
            {
                unsafe
                {
                    // use a pointer to get direct access to the bits in the bitmap.
                    // this is faster and removes the need to copy values from
                    // unmanaged to managed memory and vice versa.
                    IntPtr array = bitmapData.Scan0;
                    int *  pByte = (int *)array.ToPointer();
                    int    bytes = bitmapData.Width * bitmapData.Height;
                    ((Theme)gridLayer.Theme).GetFillColors(pByte, bytes, (T[])gridValues);
                }
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                if (bitmapData != null)
                {
                    bitmap.UnlockBits(bitmapData);

                    // force a collect to reclaim large allocated arrays that have survived the first generations
                    GC.Collect(1, GCCollectionMode.Optimized);
                }
            }
        }
        public void GenerateThemeForQuantityBilFileWithLegendFile()
        {
            const string fileName = @"..\..\..\..\..\test-data\DeltaShell\DeltaShell.Plugins.SharpMapGis.Tests\RasterData\FloatValues.bil";

            RegularGridCoverageLayer rasterLayer           = new RegularGridCoverageLayer();
            GdalFeatureProvider      rasterFeatureProvider = new GdalFeatureProvider {
                Path = fileName
            };

            rasterLayer.DataSource = rasterFeatureProvider;
            IRegularGridCoverage grid = rasterLayer.Grid;

            ITheme theme = DemisMapControlLegendHelper.ConvertLegendToTheme(fileName, "value", grid);

            ICollection colors = new List <string>(new string[]
            {
                "000000",
                "E1E1FE",
                "DCD9FE",
                "D6D0FE",
                "D0C8FF",
                "CBC0FF",
                "C09EFF",
                "B57BFF",
                "A959FF",
                "9E36FF",
                "9314FF"
            });
            ICollection values = new List <double>(new double[]
            {
                -16.9996604919434,
                -13.5799999237061,
                -10.1499996185303,
                -6.73000001907349,
                -3.29999995231628,
                .119999997317791,
                3.54999995231628,
                6.96999979019165,
                10.3900003433228,
                13.8199996948242,
                17.2399997711182
            });

            Assert.IsInstanceOfType(typeof(QuantityTheme), theme);
            foreach (IThemeItem themeItem in theme.ThemeItems)
            {
                Assert.IsInstanceOfType(typeof(QuantityThemeItem), themeItem);
                Assert.IsInstanceOfType(typeof(VectorStyle), themeItem.Style);

                double value = ((QuantityThemeItem)themeItem).Interval.Max;
                Assert.Contains(value, values);
                ((List <double>)values).Remove(value);

                string color = FromColorToBGRString(((SolidBrush)((VectorStyle)themeItem.Style).Fill).Color);
                Assert.Contains(color, colors);
                ((List <string>)colors).Remove(color);
            }

            Assert.IsTrue(colors.Count == 0);
            Assert.IsTrue(values.Count == 0);
        }
        public void GetCoordinateOutsideAfterWithOffset()
        {
            IRegularGridCoverage grid2D = CreatePressureCoverage(1000.0, 0.0);

            grid2D.GetRegularGridCoverageCellAtPosition(1200.0, 100.0);
        }
        public void GetCoordinateOutsideBefore()
        {
            IRegularGridCoverage grid2D = CreatePressureCoverage(0.0, 0.0);

            grid2D.GetRegularGridCoverageCellAtPosition(-10.0, 200.0);
        }
Example #27
0
        public IFeature FindNearestFeature(ICoordinate worldPos, float limit, out ILayer outLayer,
                                           Func <ILayer, bool> condition)
        {
            IFeature nearestFeature = null;

            outLayer = null;
            // Since we are only interested in one geometry object start with the topmost trackersLayer and stop
            // searching the lower layers when an object is found.

            foreach (ILayer mapLayer in MapHelper.GetAllMapLayers(Map.Layers, false))
            {
                if (mapLayer is VectorLayer)
                {
                    var       vectorLayer = mapLayer as VectorLayer;
                    IEnvelope envelope;
                    float     localLimit = limit;

                    if ((!vectorLayer.IsSelectable) || ((null != condition) && (!condition(vectorLayer))))
                    {
                        continue;
                    }
                    // Adjust the marge limit for Layers with a symbol style and if the size of the symbol exceeds
                    // the minimum limit. Ignore layers with custom renderers
                    if ((vectorLayer.Style.Symbol != null) && (0 == vectorLayer.CustomRenderers.Count))
                    {
                        ICoordinate size = MapControlHelper.ImageToWorld(MapControl.Map, vectorLayer.Style.Symbol.Width,
                                                                         vectorLayer.Style.Symbol.Height);
                        if ((size.X > localLimit) || (size.Y > localLimit))
                        {
                            envelope   = MapControlHelper.GetEnvelope(worldPos, size.X, size.Y);
                            localLimit = (float)Math.Max(envelope.Width, envelope.Height);
                        }
                        else
                        {
                            envelope = GetEnvelope(worldPos, localLimit);
                        }
                    }
                    else
                    {
                        envelope = GetEnvelope(worldPos, localLimit);
                    }

                    IFeatureProvider featureProvider = vectorLayer.DataSource;
                    if (null != featureProvider)
                    {
                        // Get features in the envelope
                        IList objectsAt;

                        if (vectorLayer.CustomRenderers.Count > 0)
                        {
                            objectsAt = vectorLayer.CustomRenderers[0].GetFeatures(envelope, vectorLayer);
                        }
                        else
                        {
                            objectsAt = featureProvider.GetFeatures(envelope);
                        }
                        // Mousedown at new position
                        if ((null != objectsAt) && (objectsAt.Count > 0))
                        {
                            double   localDistance;
                            IFeature feature = FindNearestFeature(vectorLayer, objectsAt, worldPos, localLimit,
                                                                  out localDistance);
                            if (null != feature)
                            {
                                nearestFeature = feature;
                                outLayer       = vectorLayer;
                                break;
                            }
                        }
                    }
                }
                else if (mapLayer is IRegularGridCoverageLayer)
                {
                    try
                    {
                        IRegularGridCoverageLayer regularGridCoverageLayer = (IRegularGridCoverageLayer)mapLayer;
                        IRegularGridCoverage      regularGridCoverage      = (IRegularGridCoverage)regularGridCoverageLayer.Coverage;

                        nearestFeature = regularGridCoverage.GetRegularGridCoverageCellAtPosition(worldPos.X, worldPos.Y);

                        outLayer = regularGridCoverageLayer;
                    }
                    catch (Exception)
                    {
                        // GetCoordinateAtPosition will throw exception if x, y is not within the coverage
                    }
                }
            }

            return(nearestFeature);
        }