geojsonsharpmap

Shape is not getting plotted on the map image generated


I am trying to create map image from the attached JSON the image shows correct location but does not plot polygon.

This is happening only in case of one feature having circle shape whereas for other shapes they are rendered fine.

Following function is used to create image from json.

    public static Image CreateMapImage(string json, 
                KnownTileSource baseMapTile = KnownTileSource.BingRoads)
            {
                double maxX = Double.MinValue,
                    maxY = Double.MinValue,
                    minX = Double.MaxValue,
                    minY = Double.MaxValue;

                var map = new SharpMap.Map(new Size(800, 400));
                map.Layers.Add(new TileLayer(
                    KnownTileSources.Create(
                        baseMapTile, bingKey), "BingRoad"));

                JObject rss = JObject.Parse(json);
                foreach (JObject shape in rss["features"])
                {
                    var jsonReader = new NetTopologySuite.IO.GeoJsonReader();
                    var geom = jsonReader.Read<IGeometry>(shape.ToString(Formatting.None));

                    var fp = new GeometryFeatureProvider(geom);
                    var layer = new VectorLayer("geojson", fp);

                    layer.CoordinateTransformation = new
                        CoordinateTransformationFactory().CreateFromCoordinateSystems(
                            GeographicCoordinateSystem.WGS84,
                            ProjectedCoordinateSystem.WebMercator);

                    layer.Style = new SharpMap.Styles.VectorStyle()
                    {
                        Fill = new SolidBrush(Color.FromArgb(100, 255, 0, 0)),
                        Outline = new Pen(Color.Red, 1.5f),
                        EnableOutline = true
                    };

                    maxX = layer.Envelope.MaxX > maxX ? layer.Envelope.MaxX : maxX;
                    maxY = layer.Envelope.MaxY > maxY ? layer.Envelope.MaxY : maxY;
                    minX = layer.Envelope.MinX < minX ? layer.Envelope.MinX : minX;
                    minY = layer.Envelope.MinY < minY ? layer.Envelope.MinY : minY;

                    map.Layers.Add(layer);
                }

                map.ZoomToBox(new Envelope(new GeoPoint(m

inX, minY), new GeoPoint(maxX, maxY)));
                map.Zoom *= 1.1;

                return map.GetMap();
            }

I am using following Geojson file to render the shape

{
	"features": [{
			"id": "4",
			"geometry": {
				"coordinates": [[[73.879909, 18.521356], [73.879617, 18.526641], [73.878744, 18.531869], [73.877299, 18.53698], 
				[73.875299, 18.541921], [73.872765, 18.546636], [73.869725, 18.551074], [73.866212, 18.555186], [73.862265, 18.558928], 
				[73.857928, 18.562258], [73.853246, 18.56514], [73.848273, 18.567542], [73.843062, 18.569438], [73.837671, 18.570808], 
				[73.832158, 18.571635], [73.826584, 18.571912], [73.82101, 18.571635], [73.815497, 18.570808], [73.810105, 18.569438], 
				[73.804894, 18.567542], [73.799921, 18.56514], [73.79524, 18.562258], [73.790902, 18.558928], [73.786955, 18.555186], 
				[73.783442, 18.551074], [73.780402, 18.546636], [73.777868, 18.541921], [73.775868, 18.53698], [73.774423, 18.531869], 
				[73.77355, 18.526641], [73.773258, 18.521356], [73.77355, 18.516071], [73.774423, 18.510843], [73.775868, 18.50573], 
				[73.777868, 18.500789], [73.780402, 18.496072], [73.783442, 18.491633], [73.786955, 18.487519], [73.790902, 18.483776], 
				[73.79524, 18.480444], [73.799921, 18.477561], [73.804894, 18.475158], [73.810105, 18.47326], [73.815497, 18.47189], 
				[73.82101, 18.471062], [73.826584, 18.470785], [73.832158, 18.471062], [73.837671, 18.47189], [73.843062, 18.47326], 
				[73.848273, 18.475158], [73.853246, 18.477561], [73.857928, 18.480444], [73.862265, 18.483776], [73.866212, 18.487519], 
				[73.869725, 18.491633], [73.872765, 18.496072], [73.875299, 18.500789], [73.877299, 18.50573], [73.878744, 18.510843], 
				[73.879617, 18.516071], [73.879909, 18.521356]]],
				"type": "Polygon",
				"bbox": [73.773258, 18.470785, 73.879909, 18.571912]
			},
			"properties": {
				"status": "add",
				"editable": "true",
				"color": {
					"r": 0,
					"g": 255,
					"b": 255,
					"a": 0.45
				},
				"border": {
					"b": 255,
					"g": 255,
					"r": 0,
					"a": 1
				},
				"OBJECTID": "4"
			},
			"type": "Feature",
			"bbox": [73.773258, 18.470785, 73.879909, 18.571912]
		}
	],
	"type": "FeatureCollection"
}


Solution

  • Defining the "reverse" coordinate transformation helped me:

    var ctf = new ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory();
    layer.CoordinateTransformation = ctf.CreateFromCoordinateSystems(
        ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84,
        ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WebMercator);
    
    layer.ReverseCoordinateTransformation = ctf.CreateFromCoordinateSystems(
        ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WebMercator,
        ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84);