GeoJSON

This driver implements read/write support for access to features encoded in GeoJSON format. GeoJSON is a dialect based on the JavaScript Object Notation (JSON). JSON is a lightweight plain text format for data interchange and GeoJSON is nothing other than its specialization for geographic content.

GeoJSON is supported as an output format of a number of services: GeoServer, CartoWeb, etc.

The OGR GeoJSON driver translates GeoJSON encoded data to objects of the OGR Simple Features model: Datasource, Layer, Feature, Geometry. The implementation is based on GeoJSON Specification, v1.0.

Starting with GDAL 2.1.0, the GeoJSON driver supports updating existing GeoJSON files. In that case, the default value for the NATIVE_DATA open option will be YES.

Datasource

The OGR GeoJSON driver accepts three types of sources of data:

Starting with GDAL 2.3, the URL/filename/text might be prefixed with GeoJSON: to avoid any ambiguity with other drivers.

Layer

A GeoJSON datasource is translated to single OGRLayer object with pre-defined name OGRGeoJSON:

ogrinfo -ro http://featureserver/data/.geojson OGRGeoJSON
It's also valid to assume that OGRDataSource::GetLayerCount() for GeoJSON datasource always returns 1.

Starting with GDAL 2.2, the layer name is built with the following logic:

  1. If a "name" member is found at the FeatureCollection level, it is used.
  2. Otherwise if the filename is regular (ie not a URL with query parameters), then the filename without extension and path is used as the layer name.
  3. Otherwise OGRGeoJSON is used.

Accessing Web Service as a datasource (i.e. FeatureServer), each request will produce new layer. This behavior conforms to stateless nature of HTTP transaction and is similar to how Web browsers operate: single request == single page.

If a top-level member of GeoJSON data is of any other type than FeatureCollection, the driver will produce a layer with only one feature. Otherwise, a layer will consists of a set of features.

If the NATIVE_DATA open option is set to YES, members at the level of the FeatureCollection will be stored as a serialized JSon object in the NATIVE_DATA item of the NATIVE_DATA metadata domain of the layer object (and "application/vnd.geo+json" in the NATIVE_MEDIA_TYPE of the NATIVE_DATA metadata domain).

Feature

The OGR GeoJSON driver maps each object of following types to new OGRFeature object: Point, LineString, Polygon, GeometryCollection, Feature.

According to the GeoJSON Specification, only the Feature object must have a member with name properties. Each and every member of properties is translated to OGR object of type of OGRField and added to corresponding OGRFeature object.

The GeoJSON Specification does not require all Feature objects in a collection to have the same schema of properties. If Feature objects in a set defined by FeatureCollection object have different schema of properties, then resulting schema of fields in OGRFeatureDefn is generated as union of all Feature properties.

Schema detection will recognized fields of type String, Integer, Real, StringList, IntegerList and RealList. Starting with GDAL 2.0, Integer(Boolean), Date, Time and DateTime fields are also recognized.

It is possible to tell the driver to not to process attributes by setting environment variable ATTRIBUTES_SKIP=YES. Default behavior is to preserve all attributes (as an union, see previous paragraph), what is equal to setting ATTRIBUTES_SKIP=NO.

If the NATIVE_DATA open option is set to YES, the Feature JSon object will be stored as a serialized JSon object in the NativeData property of the OGRFeature object (and "application/vnd.geo+json" in the NativeMediaType property). On write, if a OGRFeature to be written has its NativeMediaType property set to "application/vnd.geo+json" and its NativeData property set to a string that is a serialized JSon object, then extra members of this object (i.e. not the "property" dictionary, nor the first 3 dimensions of geometry coordinates) will be used to enhance the created JSon object from the OGRFeature. See RFC 60 for more details.

Geometry

Similarly to the issue with mixed-properties features, the GeoJSON Specification draft does not require all Feature objects in a collection must have geometry of the same type. Fortunately, OGR objects model does allow to have geometries of different types in single layer - a heterogeneous layer. By default, the GeoJSON driver preserves type of geometries.

However, sometimes there is a need to generate a homogeneous layer from a set of heterogeneous features. For this purpose, it's possible to tell the driver to wrap all geometries with OGRGeometryCollection type as a common denominator. This behavior may be controlled by setting GEOMETRY_AS_COLLECTION=YES in the environment (default is NO).

Environment variables

Open options

(GDAL >= 2.0)

To explain FLATTEN_NESTED_ATTRIBUTES, consider the following GeoJSON fragment:

{
  "type": "FeatureCollection",
  "features":
  [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [ 2, 49 ]
      },
      "properties": {
        "a_property": "foo",
        "some_object": {
          "a_property": 1,
          "another_property": 2
        }
      }
    }
  ]
}

"ogrinfo test.json -al -oo FLATTEN_NESTED_ATTRIBUTES=yes" reports:

OGRFeature(OGRGeoJSON):0
  a_property (String) = foo
  some_object_a_property (Integer) = 1
  some_object_another_property (Integer) = 2
  POINT (2 49)

Layer creation options

VSI Virtual File System API support

Some features below require OGR >= 1.9.0.

The driver supports reading and writing to files managed by VSI Virtual File System API, which includes "regular" files, as well as files in the /vsizip/ (read-write), /vsigzip/ (read-write), /vsicurl/ (read-only) domains.

Writing to /dev/stdout or /vsistdout/ is also supported.

Round-tripping of extra JSon members

See RFC 60 for more details.

Starting with GDAL 2.1, extra JSon members at the FeatureCollection, Feature or geometry levels that are not normally reflected in the OGR abstraction, such as the ones called "extra_XXXXX_member" in the below snippet, are by default preserved when executing ogr2ogr with GeoJSON both at the source and destination. This also applies to extra values in position tuples of geometries, beyond the 3rd dimension (100, 101 in the below example), if the transformation preserves the geometry structure (for example, reprojection is allowed, but not change in the number of coordinates).

{
  "type": "FeatureCollection",
  "extra_fc_member": "foo",
  "features":
  [
    {
      "type": "Feature",
      "extra_feat_member": "bar",
      "geometry": {
        "type": "Point",
        "extra_geom_member": "baz",
        "coordinates": [ 2, 49, 3, 100, 101 ]
      },
      "properties": {
        "a_property": "foo",
      }
    }
  ]
}

This behaviour can be turned off by specifying the -noNativeData switch of the ogr2ogr utility.

RFC 7946 write support

By default, the driver will write GeoJSON files following GeoJSON 2008 specification. When specifying the RFC7946=YES creation option, the RFC 7946 standard will be used instead.

The differences between the 2 versions are mentioned in Appendix B of RFC 7946 and recalled here for what matters to the driver:

Examples

How to dump content of .geojson file:

ogrinfo -ro point.geojson

How to query features from remote service with filtering by attribute:

ogrinfo -ro http://featureserver/cities/.geojson OGRGeoJSON -where "name=Warsaw"

How to translate number of features queried from FeatureServer to ESRI Shapefile:

ogr2ogr -f "ESRI Shapefile" cities.shp http://featureserver/cities/.geojson OGRGeoJSON

How to translate a ESRI Shapefile into a RFC 7946 GeoJSON file:

ogr2ogr -f GeoJSON cities.json cities.shp -lco RFC7946=YES

See Also