简体   繁体   中英

How to add altitude coordinates in Feature Collection then serialize to Geojson

I greatly appreciate for any help, I deserialized GeoJson file into feature collection using GeoJson.Net. Then I get the feature from the feature collection. Inside the feature I can loop and get all the type of geometry. From there I can loop each of the type and get the coordinate. However now I am stuck on how to edit to add Altitude equal to 0 for each coordinate then serialize back to geojson.

This is my sample test.geojson file:

{
  "type": "FeatureCollection",
  "name": "MYS_adm2",
  "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
  "features": [
{
    "type": "Feature",
    "id": 0,    
    "properties": {"party": "Republican","count": "2500"},
    "geometry": {
        "type": "Polygon",
        "coordinates": [[
            [-104.05, 48.99],
            [-97.22,  48.98],
            [-96.58,  45.94],
            [-104.03, 45.94],
            [-104.05, 48.99]
        ]]
    }
},
{
    "type": "Feature",
    "id": 1,
    "properties": {"party": "Democrat","count": "1300"},
    "geometry": {
        "type": "MultiPolygon",
        "coordinates": [[[
            [-109.05, 41.00],
            [-102.06, 40.99],
            [-102.03, 36.99],
            [-109.04, 36.99],
            [-109.05, 41.00]
        ]]]
    }
}
  ]
}

This is code how I deserialized:

string filePath = @"D:\test.geojson";
            FeatureCollection collection = JsonConvert.DeserializeObject<FeatureCollection>(File.ReadAllText(filePath)); //1 min 21 s
            var feature = collection.Features;
            foreach (var featureItem in feature)
            {
                if (featureItem.Geometry.Type.Equals(GeoJSONObjectType.Point))
                {
                    Point point = featureItem.Geometry as Point;

                }
                else if (featureItem.Geometry.Type.Equals(GeoJSONObjectType.MultiPoint))
                {

                }
                else if (featureItem.Geometry.Type.Equals(GeoJSONObjectType.Polygon))
                {
                    Polygon polygon = featureItem.Geometry as Polygon;
                    foreach (var Item in polygon.Coordinates)
                    {
                        foreach (var coordinates in Item.Coordinates)
                        {
                            //Here I want to add value 0 altitude coordinate
                            

                        }
                    }
                }
                else if (featureItem.Geometry.Type.Equals(GeoJSONObjectType.MultiPolygon))
                {
                    MultiPolygon multiPolygon = featureItem.Geometry as MultiPolygon;
                    foreach (var Item in multiPolygon.Coordinates)
                    {
                        foreach (var item1 in Item.Coordinates)
                        {
                            foreach (var item2 in item1.Coordinates)
                            {
                                //Here I want to add value 0 altitude coordinate
                            }
                        }
                    }
                }
            }

            //here I want to serialize my FeatureCollection after edit
            File.WriteAllText(@"D:\test_Edit.geojson", JsonConvert.SerializeObject(collection));

My expected output is to add Altitude equal to 0 like below:

{
  "type": "FeatureCollection",
  "name": "MYS_adm2",
  "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
  "features": [
{
    "type": "Feature",
    "id": 0,    
    "properties": {"party": "Republican","count": "2500"},
    "geometry": {
        "type": "Polygon",
        "coordinates": [[
            [-104.05, 48.99, 0],
            [-97.22,  48.98, 0],
            [-96.58,  45.94, 0],
            [-104.03, 45.94, 0],
            [-104.05, 48.99, 0]
        ]]
    }
},
{
    "type": "Feature",
    "id": 1,
    "properties": {"party": "Democrat","count": "1300"},
    "geometry": {
        "type": "MultiPolygon",
        "coordinates": [[[
            [-109.05, 41.00, 0],
            [-102.06, 40.99, 0],
            [-102.03, 36.99, 0],
            [-109.04, 36.99, 0],
            [-109.05, 41.00, 0]
        ]]]
    }
}
  ]
}

Types and some properties are closed from modification, most likely to preserve data integrity. Therefore, to change the values of some properties, they need to be recreated. Having changed your version, I got the following code:

static void Main(string[] args)
        {
            string filePath = @"C:\Users\aleks\Documents\test.geojson.txt";
            FeatureCollection collection = JsonConvert.DeserializeObject<FeatureCollection>(File.ReadAllText(filePath)); //1 min 21 s
            var feature = collection.Features;

            var editedFeatures = new List<Feature>();
            IGeometryObject editedObject = null;

            foreach (var featureItem in feature)
            {
                if (featureItem.Geometry.Type.Equals(GeoJSONObjectType.Point))
                {
                    Point point = featureItem.Geometry as Point;
                }
                else if (featureItem.Geometry.Type.Equals(GeoJSONObjectType.MultiPoint))
                {
                }
                else if (featureItem.Geometry.Type.Equals(GeoJSONObjectType.Polygon))
                {
                    var polygon = featureItem.Geometry as Polygon;

                    var editedLines = new List<LineString>();
                    foreach (var Item in polygon.Coordinates)
                    {
                        var editedcoordinates = new List<Position>();
                        foreach (var coordinates in Item.Coordinates)
                        {
                            editedcoordinates.Add(new Position(coordinates.Latitude, coordinates.Longitude, 0));
                        }
                        editedLines.Add(new LineString(editedcoordinates));
                    }

                    editedObject = new Polygon(editedLines);
                }
                else if (featureItem.Geometry.Type.Equals(GeoJSONObjectType.MultiPolygon))
                {
                    MultiPolygon multiPolygon = featureItem.Geometry as MultiPolygon;

                    var editedPoligons = new List<Polygon>();
                    foreach (var Item in multiPolygon.Coordinates)
                    {
                        var editedLines = new List<LineString>();
                        foreach (var item1 in Item.Coordinates)
                        {
                            var editedcoordinates = new List<Position>();
                            foreach (var item2 in item1.Coordinates)
                            {
                                editedcoordinates.Add(new Position(item2.Latitude, item2.Longitude, 0));
                            }
                            editedLines.Add(new LineString(editedcoordinates));
                        }
                        editedPoligons.Add(new Polygon(editedLines));
                    }
                    editedObject = new MultiPolygon(editedPoligons);
                }

                if (editedObject != null)
                {
                    editedFeatures.Add(new Feature(editedObject, featureItem.Properties, featureItem.Id));
                }
            }

            var editedCollection = new FeatureCollection(editedFeatures);
            editedCollection.CRS = collection.CRS;
            editedCollection.BoundingBoxes = collection.BoundingBoxes;
            //here I want to serialize my FeatureCollection after edit
            File.WriteAllText(@"C:\Users\aleks\Documents\test_Edit.geojson", JsonConvert.SerializeObject(editedCollection));
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM