Browse our Products

Aspose.GIS for .NET 24.7 Release Notes

Major Features

  • Improved integration of the Aspose.GIS library with persistent geospatial information storage systems.

Full List of Issues Covering all Changes in this Release

KeySummaryCategory
GISNET-1662Prepare example of how to сalсulate GPS Overlapping Coordinates more effective.Enhancement
GISNET-1647Implementation of fast method to Update Original Data in GDB File.Enhancement
GISNET-1618Support GDAL Driver For Linux.Enhancement
GISNET-789Exception “Unexpected end of file” In Shapefile.Bug

Public API and Backward Incompatible Changes

Following members have been added:

  • M:Aspose.Gis.Formats.FileGdb.FileGdbDriver.EditLayer(Aspose.Gis.AbstractPath,Aspose.Gis.DriverOptions)

Following members have been removed:

  • none

Usage examples:

GISNET-1662. Prepare example of how to сalсulate GPS Overlapping Coordinates more effective.

            var pointSetA = Geometry.FromText("GEOMETRYCOLLECTION(POINT (30.645676 52.54734), POINT (30.631256 52.533558), POINT (30.661125 52.533558))",
                SpatialReferenceSystem.Wgs84);
            var pointSetB = Geometry.FromText("GEOMETRYCOLLECTION(POINT (30.653915 52.540867), POINT (30.677261 52.546713), POINT (30.683784 52.532096))",
                            SpatialReferenceSystem.Wgs84);

            IGeometry poligonA = pointSetA.GetExtent().ToPolygon();
            IGeometry poligonB = pointSetB.GetExtent().ToPolygon();
            IGeometry intersection = poligonA.Intersection(poligonB);

            var transformation = SpatialReferenceSystem
                .Wgs84
                .CreateTransformationTo(SpatialReferenceSystem.CreateFromEpsg(102013));

            poligonA = transformation.Transform(poligonA);
            poligonB = transformation.Transform(poligonB);
            intersection = transformation.Transform(intersection);

            var intersectionArea = intersection.GetArea();
            var poligonAArea = poligonA.GetArea();
            var poligonBArea = poligonB.GetArea();

            var poligonAPercentageOfOverlap = intersectionArea / poligonAArea * 100;
            var poligonBPercentageOfOverlap = intersectionArea / poligonBArea * 100;

            // trim the fractional part to the required number of digits (4)
            Assert.AreEqual(23.0407d, Math.Floor(poligonAPercentageOfOverlap * 10000)/10000);
            Assert.AreEqual(21.7240d, Math.Floor(poligonBPercentageOfOverlap * 10000)/10000);

GISNET-1647. Implementation of fast method to Update Original Data in GDB File.

    public class FileGdbEditTests : TestFixtureBase
    {
        public string TestOutPath => "file_gdb";

        [Test]
        public void AddFeatureTest()
        {
            var driver = Drivers.FileGdb;
            var path = Path.Combine(TestOutPath, "add.gdbtable");
            var field = "field";
            // arrange: create temp file
            using (var vectorLayer = driver.CreateLayer(path))
            {
                vectorLayer.Attributes.Add(new FeatureAttribute(field, AttributeDataType.String));
                AddFeature(vectorLayer, field, "0");
                AddFeature(vectorLayer, field, "1");
                AddFeature(vectorLayer, field, "2");
                AddFeature(vectorLayer, field, "3");
                AddFeature(vectorLayer, field, "4");
            }

            // act: add to end
            using (var layer = driver.EditLayer(AbstractPath.FromLocalPath(path)))
            {
                AddFeature(layer, field, "5");
            }

            // assert
            using (var resultLayer = driver.OpenLayer(path))
            {
                Assert.AreEqual(6, resultLayer.Count);
                Assert.AreEqual("0", resultLayer[0].GetValue(field));
                Assert.AreEqual("5", resultLayer[5].GetValue(field));
                Assert.AreEqual(GeometryType.Point, resultLayer.GeometryType);

                Assert.AreEqual(new Point(5, 5) { SpatialReferenceSystem = resultLayer.SpatialReferenceSystem }, resultLayer[5].Geometry);
            }
        }

        [Test]
        public void RemoveFeatureTest()
        {
            var driver = Drivers.FileGdb;
            var path = Path.Combine(TestOutPath, "remove.gdbtable");
            var field = "field";
            // arrange: create temp file
            using (var vectorLayer = driver.CreateLayer(path))
            {
                vectorLayer.Attributes.Add(new FeatureAttribute(field, AttributeDataType.String));
                AddFeature(vectorLayer, field, "0");
                AddFeature(vectorLayer, field, "1");
                AddFeature(vectorLayer, field, "2");
                AddFeature(vectorLayer, field, "3");
                AddFeature(vectorLayer, field, "4");
            }

            // act 
            using (var layer = driver.EditLayer(AbstractPath.FromLocalPath(path)))
            {
                layer.RemoveAt(1);
                layer.RemoveAt(2);
            }

            // assert
            using (var resultLayer = driver.OpenLayer(path))
            {
                Assert.AreEqual(3, resultLayer.Count);
                Assert.AreEqual("0", resultLayer[0].GetValue(field));
                Assert.AreEqual("2", resultLayer[1].GetValue(field));
                Assert.AreEqual("4", resultLayer[2].GetValue(field));
            }
        }

        [Test]
        public void UpdateFeatureTest()
        {
            var driver = Drivers.FileGdb;
            var path = Path.Combine(TestOutPath, "update.gdbtable");
            var field = "field";
            // arrange: create temp file
            using (var vectorLayer = driver.CreateLayer(path))
            {
                vectorLayer.Attributes.Add(new FeatureAttribute(field, AttributeDataType.String));
                AddFeature(vectorLayer, field, "0");
                AddFeature(vectorLayer, field, "1");
                AddFeature(vectorLayer, field, "2");
            }

            // act: update feature
            using (var layer = driver.EditLayer(AbstractPath.FromLocalPath(path)))
            {
                var feature = layer.ConstructFeature();
                feature.SetValue(field, "7");
                feature.Geometry = new Point(7, 7);
                layer.ReplaceAt(1, feature);
            }

            // assert
            using (var resultLayer = driver.OpenLayer(path))
            {
                Assert.AreEqual(3, resultLayer.Count);
                Assert.AreEqual("0", resultLayer[0].GetValue(field));
                Assert.AreEqual("7", resultLayer[1].GetValue(field));
                Assert.AreEqual("2", resultLayer[2].GetValue(field));

                Assert.AreEqual(new Point(7, 7) { SpatialReferenceSystem = resultLayer.SpatialReferenceSystem }, resultLayer[1].Geometry);
            }
        }

        [Test]
        public void RemoveThenAddAndUpdateFeatureTest()
        {
            var driver = Drivers.FileGdb;
            var path = Path.Combine(TestOutPath, "remove-add.gdbtable");
            var field = "field";
            // arrange: create temp file
            using (var vectorLayer = driver.CreateLayer(path))
            {
                vectorLayer.Attributes.Add(new FeatureAttribute(field, AttributeDataType.String));
                AddFeature(vectorLayer, field, "0");
                AddFeature(vectorLayer, field, "1");
                AddFeature(vectorLayer, field, "2");
                AddFeature(vectorLayer, field, "3");
                AddFeature(vectorLayer, field, "4");
            }

            // act: add to end
            using (var layer = driver.EditLayer(AbstractPath.FromLocalPath(path)))
            {
                // original list: //   0,1,2,3,4
                layer.RemoveAt(0);//-> [0], 1,2,3,4
                layer.RemoveAt(0);//-> [1], 2,3,4
                layer.RemoveAt(1);//-> 2, [3] ,4
                AddFeature(layer, field, "x0"); //-> 2,4, [x0]

                var feature = layer.ConstructFeature();
                feature.SetValue(field, 7);
                feature.Geometry = new Point(9, 9);
                layer.ReplaceAt(1, feature);
            }

            // assert
            using (var resultLayer = driver.OpenLayer(path))
            {
                Assert.AreEqual(3, resultLayer.Count);
                Assert.AreEqual("2", resultLayer[0].GetValue(field));
                Assert.AreEqual("7", resultLayer[1].GetValue(field));
                Assert.AreEqual("x0", resultLayer[2].GetValue(field));
                Assert.AreEqual(new Point(9, 9) { SpatialReferenceSystem = resultLayer.SpatialReferenceSystem }, resultLayer[1].Geometry);
            }
        }

        [Test]
        public void AddNewFeatureWithOption()
        {
            var driver = Drivers.FileGdb;
            var outfile = Path.Combine(TestOutPath, "edit-points-new-options.gdbtable");
            // arrange
            using (var layer = driver.CreateLayer(outfile))
            {
                var createdGeometries = new IGeometry[] { new Point(1, 1), new Point(2, 2) };
                DriverAssert.StoreGeometries(createdGeometries, layer);
            }

            var options = new FileGdbOptions() { XYPrecisionModel = PrecisionModel.Rounding(1) };
            // act
            using (var layer = driver.EditLayer(outfile, options))
            {
                var feature = layer.ConstructFeature();
                feature.Geometry = new Point(3.3333, 3.3333);
                layer.Add(feature);
            }

            // assert
            using (var layer = driver.OpenLayer(outfile, options))
            {
                Assert.AreEqual(3, layer.Count);
                Assert.AreEqual(null, layer.SpatialReferenceSystem);
                Assert.AreEqual(GeometryType.Point, layer.GeometryType);
                Assert.AreEqual("Min (X = 1, Y = 1), Max (X = 3.3, Y = 3.3)", layer.GetExtent().ToString());

                Assert.AreEqual(new Point(1, 1), layer[0].Geometry);
                Assert.AreEqual(new Point(2, 2), layer[1].Geometry);
                Assert.AreEqual(new Point(3.3, 3.3), layer[2].Geometry);
            }
        }

        [Test]
        public void PerformanceDeleteTest()
        {
            var driver = Drivers.FileGdb;
            var path = Path.Combine(TestOutPath, "performanceRemove.gdbtable");
            var field = "field";
            // arrange: create temp file
            using (var vectorLayer = driver.CreateLayer(path))
            {
                vectorLayer.Attributes.Add(new FeatureAttribute(field, AttributeDataType.String));
                GenerateFeatures(vectorLayer, field, 999002);
            }

            // act 
            using (var layer = driver.EditLayer(AbstractPath.FromLocalPath(path)))
            {
                layer.RemoveAt(499123);
            }

            // assert
            using (var resultLayer = driver.OpenLayer(path))
            {
                Assert.AreEqual(999001, resultLayer.Count);
            }
        }

        [Test]
        public void PerformanceReplaceTest()
        {
            var driver = Drivers.FileGdb;
            var path = Path.Combine(TestOutPath, "performanceRemove.gdbtable");
            var field = "field";
            // arrange: create temp file
            using (var vectorLayer = driver.CreateLayer(path))
            {
                vectorLayer.Attributes.Add(new FeatureAttribute(field, AttributeDataType.String));
                GenerateFeatures(vectorLayer, field, 999000);
            }

            // act 
            using (var layer = driver.EditLayer(AbstractPath.FromLocalPath(path)))
            {
                var feature = layer.ConstructFeature();
                feature.SetValue(field, "7");
                feature.Geometry = new Point(7, 7);
                layer.ReplaceAt(499000, feature);
            }

            // assert
            using (var resultLayer = driver.OpenLayer(path))
            {
                Assert.AreEqual("7", resultLayer[499000].GetValue(field));
                Assert.AreEqual(new Point(7, 7) { SpatialReferenceSystem = resultLayer.SpatialReferenceSystem }, resultLayer[499000].Geometry);
            }
        }

        private void AddFeature(VectorLayer layer, string attributeName, string value)
        {
            var feature = layer.ConstructFeature();
            feature.SetValue(attributeName, value);
            feature.Geometry = new Point(5, 5);
            layer.Add(feature);
        }

        private void GenerateFeatures(VectorLayer layer, string attributeName, long count)
        {
            for (int i = 0; i < count; i++)
            {
                var feature = layer.ConstructFeature();
                feature.SetValue(attributeName, i);
                layer.Add(feature);
            }
        }
    }

GISNET-1618. Support GDAL Driver For Linux.

            var layer = Drivers.GDAL.OpenLayer("cities.gpkg"), options);

            Assert.AreEqual(1, layer.Count);
            Assert.AreEqual(0, layer.Attributes.Count);
            Assert.AreEqual(GeometryType.LineString, layer.GeometryType);

GISNET-789. Exception “Unexpected end of file” In Shapefile.

      // Use IsIgnoreWrongData to aboid out of range latitude in broken Shapefile
            string sourcePath = Path.Combine("shapefile", @"issues\taxi_zones.shp");
            string destinationPath = "out.shp";
            ConversionOptions options = new ConversionOptions();
            options.SourceDriverOptions = new Gis.Formats.Shapefile.ShapefileOptions { IsIgnoreWrongData = true };
            VectorLayer.Convert(sourcePath, Drivers.Shapefile, destinationPath, Drivers.Shapefile, options);
            using (var layer = VectorLayer.Open(destinationPath, Drivers.Shapefile))
            {
                Assert.AreEqual(263, layer.Count);
                Assert.AreEqual(6, layer.Attributes.Count);
            }