Authors
- Eduard POROSNICU, European Organisation for the Safety of Air Navigation (EUROCONTROL)
Abstract
LayeredGeoJSON is an extension to GeoJSON that provides a vertical layer extent to all standard GeoJSON geometries. In addition, it also provides the possibility to specify a horizontal "circle" extent for a Point geometry.
Contents
- Introduction
- LayeredGEOJson objets
- Compatibility aspects Table of contents generated with markdown-toc
The purpose of this extension is to enable the use of GeoJSON for coding common airspace structures defined in the aeronautical data domain. In particular, it is intended to be used for the coding of Unmanned Airspace System (UAS) GeoZones. The GeoJSON standard RFC 7946 geometries (Point, LineString, Polygon, etc.) allow the coding of horizontal projections, but does not allow to specify a vertical extent of these geometrical features. While it is possible to declare the vertical extent as feature properties, that would have two limitations:
- it would not allow to specify a different vertical extent for each member of a GeometryCollection. This is needed for airspace structures that are composed of multiple volumes, for example in the form of an "inverted wedding cake"; this may be a common airspace structure for GeoZones;
- it would not facilitate the rendering of such areas in a 3D view, as the naming and location of the vertical layer would be at the discretion of each user community. Thus, this extension of the GeoJSON geometries is proposed, enabling the coding of upper/lower limits for each GeoJSON geometry. The scope of this extension includes all GeoJSON geometries: Point, LineString, Polygon, MultiPoint, ... and GeometryCollection. However, the most common use is expected to include Polygon, MultiPolygon and GeometryCollection. In addition, for the Point geometries, this extension enables the provision of a radius value. This re-uses the Microsoft Azure Maps GeoJSON extension solution for Circle.
...
{
"type": "Polygon",
"coordinates": [
[
[2.585866,49.029301],
[2.610414,48.983358],
[2.731263,48.987301],
[2.704141,49.044704],
[2.585866,49.029301]
]
],
"layer": {
"upper": 150,
"upperReference": "AMSL",
"lower": 50,
"lowerReference": "AMSL"
"uom": "m",
}
}
...
JavaScript Object Notation (JSON), and the terms “object”, “name”, “value”, “array”, and “number”, are defined in IETF RTC 4627.
An additional complex "layer" property is added to all standard GeoJSON geometry types (Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon and GeometryCollection).
The layer object has the following properties, in this order:
- upper = The value of the upper limit of the airspace layer expressed in metres (m) or feet (ft), in relation with the vertical datum specified in the upperReference property. The upper value is a number. A positive value is interpreted as meaning "above" the reference surface.
- upperReference = A code indicating a vertical reference system. Allowed values
- AGL = Above ground level (or above water surface, as applicable)
- AMSL = Above Mean Sea Level
- WGS84 = Above the surface of the WGS-84 ellipsoid (Ellipsoidal height)
- lower = The value of the lower limit of the airspace layer expressed in metres (m) or feet (ft), in relation with the vertical datum specified in the lowerReference property. The lower value is a number. A positive value is interpreted as meaning "above" the reference surface.
- lowerReference = A code indicating a vertical reference system. The same values as for upperReferemnce may be used
- uom = The unit of measurement in which the upper and lower values are expressed. Allowable values:
- m = metres
- ft = feet
In a GeoJSON geometry of type "Point", the layer property appears immediately after the "coordinates" position:
...
{
"type": "Point",
"coordinates": [100.0, 0.0],
"layer": {
"upper": 150,
"upperReference": "AMSL",
"lower": 50,
"lowerReference": "AMSL"
}
}
...
In a GeoJSON geometry of type "Point", it is also possible to add an extent property, as a sibling of the "coordinates" property and it must have two sub-properties:
- "subType" with fixed value "Circle"
- "radius" expressed in metres
...
{
"type": "Point",
"coordinates": [100.0, 0.0],
"layer": {
"upper": 150,
"upperReference": "AMSL",
"lower": 50,
"lowerReference": "AMSL"
},
"extent": {
"subType": "Circle",
"radius": 10000.0
}
}
...
In a GeoJSON geometry of type "LineString", the layer property appears immediately after the "coordinates" property:
...
{
"type": "LineString",
"coordinates": [
[-170, 10],
[170, 11]
],
"layer": {
"upper": 150,
"upperReference": "AMSL",
"lower": 50,
"lowerReference": "AMSL"
}
}
...
In a GeoJSON geometry of type "Polygon", the layer property appears immediately after the "coordinates" array:
...
{
"type": "Polygon",
"coordinates": [[100.0, 0.0],[0, 100.0], [100.0, 100.0]]
"layer": {
"upper": 150,
"upperReference": "AMSL",
"lower": 50,
"lowerReference": "AMSL"
}
}
...
In a GeoJSON geometry of type "MultiPoint", the layer property appears immediately after the "coordinates" array:
...
{
"type": "MultiPoint",
"coordinates": [[100.0, 0.0],[0, 100.0], [100.0, 100.0]],
"layer": {
"upper": 150,
"upperReference": "AMSL",
"lower": 50,
"lowerReference": "AMSL"
}
}
...
In a GeoJSON geometry of type "MultiLineString", the layer property appears immediately after the "coordinates" property:
...
{
"type": "MultiLineString",
"coordinates": [
[
[100.0, 0.0],
[101.0, 1.0]
],
[
[102.0, 2.0],
[103.0, 3.0]
]
],
"layer": {
"upper": 150,
"upperReference": "AMSL",
"lower": 50,
"lowerReference": "AMSL"
}
}
...
In a GeoJSON geometry of type "MultiPolygon", the layer property appears immediately after the "coordinates" array:
...
{
"type": "MultiPolygon",
"coordinates": [
[
[
[180.0, 40.0], [180.0, 50.0], [170.0, 50.0],
[170.0, 40.0], [180.0, 40.0]
]
],
[
[
[-170.0, 40.0], [-170.0, 50.0], [-180.0, 50.0],
[-180.0, 40.0], [-170.0, 40.0]
]
]
],
"layer": {
"upper": 150,
"upperReference": "AMSL",
"lower": 50,
"lowerReference": "AMSL"
}
}
...
In a GeoJSON geometry of type "GeometryCollection", the layer property appears in each of the individual geometry objects that are part of the collection, after the "geometries" array:
...
{
"type": "GeometryCollection",
"geometries": [{
"type": "Point",
"coordinates": [100.0, 0.0],
"layer": {
"upper": 150,
"upperReference": "AMSL",
"lower": 50,
"lowerReference": "AMSL"
}
}, {
"type": "LineString",
"coordinates": [
[101.0, 0.0],
[102.0, 1.0]
],
"layer": {
"upper": 50,
"upperReference": "AMSL",
"lower": 0,
"lowerReference": "AMSL"
}
}],
}
...
The vertical layer data is coded as additional properties in the geometry features, after "coordinates". This is a non-compliance with the GeoJSON RFC 7946, which explicitly indicates "7. GeoJSON Types Are Not Extensible". However, many GeoJSON implementations are tolerant with such extensions if the additional elements appear after "coordinates". Thus, it is expected that GeoJSON implementations will graciously ignore the layer information and will simply render the horizontal projection of the LayeredGeoJSON object.