The GitHub GeoJSON organization made a proposal about how to make GeoJSON data JSON-LD "enabled" [see here]. But converting the nested array structures of the geometry object doesn't work lossless and creates very complex RDF graphs [see here]. This proposal is compatible with both standards.
The properties object of a GeoJSON feature contains data attached to the geometry object. It's the first place a developer looks for data. We propose to use that object also for JSON-LD data. Using that object and not the whole GeoJSON object avoids the mentioned problem. It doesn't require any changes in the code of JSON-LD or the object.
Without changes the geometry is lost in the JSON-LD object. The @geometry property in the JSON-LD context could be used to define a mapping. The value of that property is mapped to the predicate of the triple or in JSON-LD to the JSON property. The datatype could be also given in the context to define the target format.
The code to map the geometry to a triple is very simple.
GeoJSON.toJSONLD = function (json) {
var properties = _.clone(json.properties);
if (_.has(properties, '@context.@geometry')) {
var geometry = _.get(properties, '@context.@geometry')
properties[geometry] = {
'@value': JSON.stringify(_.omit(json, 'properties')),
'@type': 'http://www.opengis.net/ont/geosparql#geoJSONLiteral'
}
}
return properties;
};
GeoJSON.toGeoJSON = function (properties) {
var json;
if (_.has(properties, '@context.@geometry')) {
var geometry = _.get(properties, '@context.@geometry')
json = JSON.parse(properties[geometry]['@value']);
json.properties = _.omit(properties, geometry);
}
return json;
};
Here is a live example using Leaflet. The function to map the geometry to the JSON-LD object is also very simple and supports GeoJSON and WKT.
function layerToJSONLD(layer) {
var properties = _.clone(layer.feature.properties);
// check if we have a geometry property in the context
if (_.has(properties, '@context.@geometry')) {
var geometry = _.get(properties, '@context.@geometry')
// convert to GeoJSON using Leaflet core
var geojsonLiteral = JSON.stringify(layer.toGeoJSON());
// convert to WKT using Wicket
var wkt = new Wkt.Wkt();
wkt.fromObject(layer);
var wktLiteral =wkt.write();
properties[geometry] = [{
'@value': geojsonLiteral,
'@type': 'http://www.opengis.net/ont/geosparql#geoJSONLiteral'
}, {
'@value': wktLiteral,
'@type': 'http://www.opengis.net/ont/geosparql#wktLiteral'
}]
}
return properties;
}