Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make a GeometryCollection in GeoJSON with a single point + polygon?

How do you add a point to a polygon as a single feature? According to the GeoJson specs, this is known as a "GeometryCollection".

Example of a 'GeometryCollection':

{ "type": "GeometryCollection",
"geometries": [
  { "type": "Point",
    "coordinates": [100.0, 0.0]
    },
  { "type": "LineString",
    "coordinates": [ [101.0, 0.0], [102.0, 1.0] ]
    }
 ]
}

I tried adding a point to a polygon feature, but I couldn't get it to show on my mapbox map because I guess it is invalid GeoJson.

Anyone know what the proper way of doing this is? There are not many examples to follow on the web.

My take: [jsfilddle]

var myRegions = {
 "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {},
      "geometries": [
        {
            "type": "Point",
            "coordinates": [
            61.34765625,
            48.63290858589535
            ]
      },
        {
        "type": "Polygon",
        "coordinates": [
          [
            [
              59.94140624999999,
              50.65294336725709
            ],
            [
              54.931640625,
              50.90303283111257
            ],
            [
              51.943359375,
              51.04139389812637
            ],
            [
              50.9765625,
              48.19538740833338
            ],
            [
              52.55859375,
              46.46813299215554
            ],
            [
              52.998046875,
              43.8028187190472
            ],
            [
              54.4921875,
              42.391008609205045
            ],
            [
              57.041015625,
              43.29320031385282
            ],
            [
              59.8974609375,
              45.398449976304086
            ],
            [
              62.5341796875,
              44.08758502824516
            ],
            [
              65.6982421875,
              45.73685954736049
            ],
            [
              68.37890625,
              48.3416461723746
            ],
            [
              65.8740234375,
              49.18170338770663
            ],
            [
              63.720703125,
              49.97948776108648
            ],
            [
              63.80859374999999,
              52.348763181988076
            ],
            [
              61.4794921875,
              52.32191088594773
            ],
            [
              59.9853515625,
              51.86292391360244
            ],
            [
              61.9189453125,
              51.09662294502995
            ],
            [
              60.5126953125,
              50.51342652633956
            ],
            [
              59.94140624999999,
              50.65294336725709
            ]
          ]
        ]
      }
   ]
  }
 ]
};
like image 577
redshift Avatar asked Dec 02 '15 14:12

redshift


People also ask

Can GeoJSON have multiple geometry types?

GeoJSON. GeoJSON is a format for encoding a variety of geographic data structures. GeoJSON supports the following geometry types: Point , LineString , Polygon , MultiPoint , MultiLineString , and MultiPolygon .

What is a GeoJSON point?

GeoJSON is an open standard geospatial data interchange format that represents simple geographic features and their nonspatial attributes. Based on JavaScript Object Notation (JSON), GeoJSON is a format for encoding a variety of geographic data structures.

What is a MultiPolygon GeoJSON?

A multiPolygon is an array of Polygon coordinate arrays. This adheres to the RFC 7946 internet standard when serialized into JSON. When deserialized, this class becomes an immutable object which should be initiated using its static factory methods.

What is GeoJSON LineString?

A linestring represents two or more geographic points that share a relationship and is one of the seven geometries found in the GeoJson spec. This adheres to the RFC 7946 internet standard when serialized into JSON.


1 Answers

As said in GeoJSON spec, a Feature object has exactly one geometry member, which is a Geometry object (or null).

A feature object must have a member with the name "geometry". The value of the geometry member is a geometry object as defined above or a JSON null value.

Among the possible geometry's you can indeed use a GeometryCollection, which must have a member geometries. The latter is an array of other geometries, i.e. your point, polygon, etc., or even another GeometryCollection.

A geometry collection must have a member with the name "geometries". The value corresponding to "geometries" is an array. Each element in this array is a GeoJSON geometry object.

So in your case you could simply do something like:

var myRegions = {
  "type": "FeatureCollection",
  "features": [{
    "type": "Feature", // single feature
    "properties": {},
    "geometry": { // unique geometry member
      "type": "GeometryCollection", // the geometry can be a GeometryCollection
      "geometries": [ // unique geometries member
        { // each array item is a geometry object
          "type": "Point",
          "coordinates": [
            61.34765625,
            48.63290858589535
          ]
        },
        {
          "type": "Polygon",
          "coordinates": [
            [
              [
                59.94140624999999,
                50.65294336725709
              ],
              // more points…
              [
                59.94140624999999,
                50.65294336725709
              ]
            ]
          ]
        }
      ]
    }
  }]
};

Updated jsfiddle: http://jsfiddle.net/rh8ok5t8/18/

like image 94
ghybs Avatar answered Sep 20 '22 11:09

ghybs