geojson
The geojson library provides predicates for parsing, generating, and
validating GeoJSON documents as specified by RFC 7946:
It builds on top of the json library for JSON parsing and generation
and complements the geospatial library by providing a standard
interchange format for geometry, features, and feature collections.
API documentation
Open the ../../apis/library_index.html#geojson link in a web browser.
Loading
To load all entities in this library, load the loader.lgt file:
| ?- logtalk_load(geojson(loader)).
Testing
To test this library predicates, load the tester.lgt file:
| ?- logtalk_load(geojson(tester)).
Representation
The library parses GeoJSON documents into native terms using the following representation:
point(Position)orpoint(Position, Options)multi_point(Positions)ormulti_point(Positions, Options)line_string(Positions)orline_string(Positions, Options)multi_line_string(LineStrings)ormulti_line_string(LineStrings, Options)polygon(Rings)orpolygon(Rings, Options)multi_polygon(Polygons)ormulti_polygon(Polygons, Options)geometry_collection(Geometries)orgeometry_collection(Geometries, Options)feature(Geometry, Properties)orfeature(Geometry, Properties, Options)feature_collection(Features)orfeature_collection(Features, Options)
Positions follow the GeoJSON order and are represented as lists of
numbers, e.g. [Longitude, Latitude] or
[Longitude, Latitude, Altitude]. Validation also checks longitude
and latitude values against the RFC 7946 geographic ranges.
The Options lists may contain:
bbox(BBox)for the optional bounding box memberid(Id)for feature identifiersforeign_members(ForeignMembers)for additional non-reserved members, represented either as a list of pairs or as an embedded JSON object term using the selected object representation
Feature geometries and properties may be @null to represent GeoJSON
null.
Examples
Parse a point document:
| ?- geojson::parse(atom('{"type":"Point","coordinates":[100.0,0.0]}'), GeoJSON).
GeoJSON = point([100.0, 0.0])
yes
Generate a GeoJSON feature collection:
| ?- geojson::generate(atom(JSON), feature_collection([
feature(point([102.0, 0.5]), {prop0-value0}),
feature(@null, @null)
], [bbox([100.0, 0.0, 105.0, 1.0])])).
Validate a native GeoJSON term:
| ?- geojson::validate(polygon([[[100.0,0.0],[101.0,0.0],[101.0,1.0],[100.0,1.0],[100.0,0.0]]])).
Inspect validation errors:
| ?- geojson::validate(polygon([[[100.0,0.0],[101.0,0.0],[101.0,1.0],[100.0,1.0]]]), Errors).
Errors = [ring_not_closed([coordinates,0])]
yes
Convert between JSON terms and native GeoJSON terms:
| ?- geojson::json_to_geojson({type-'Point', coordinates-[1,2]}, GeoJSON).
GeoJSON = point([1,2])
yes
| ?- geojson::geojson_to_json(feature(@null, @null, [id(1)]), JSON).
JSON = {type-'Feature', geometry-@null, properties-@null, id-1}
yes
Notes
The library validates the RFC 7946 structural rules for geometry, features, feature collections, linear rings, bounding boxes, and prohibited
crsmembers.Bounding boxes are represented as plain lists of numbers with either four or six elements. Longitude values must stay within
[-180,180], latitude values within[-90,90], south must not exceed north, and three-dimensional boxes also require minimum altitude not to exceed maximum altitude. Bounding box dimensionality must match the represented geometry dimensionality, so two-dimensional geometries use four-element boxes while geometries with altitude use six-element boxes. Mixed two-dimensional and three-dimensional geometry or feature collections are treated as three-dimensional for bounding-box validation. Antimeridian-crossing boxes are accepted, so west may still be greater than east.Parsing rejects duplicate reserved GeoJSON members instead of silently normalizing them.
Properties and foreign member values are recursively validated as JSON values compatible with the selected embedded object representation.
When using the
charsorcodesstring representations, string terms are validated as proper character or character-code lists.Foreign members are preserved but reserved GeoJSON member names are rejected when used as foreign member keys, regardless of whether the foreign members are supplied as pair lists or embedded object terms.
The
geojson/3parametric object mirrors thejson/3customization parameters for embedded object, pair, and string representations.