Open Geospatial Consortium

Submission Date: 2025-06-02

Approval Date:   2025-08-25

Publication Date:   2026-04-30

External identifier of this OGC® document: http://www.opengis.net/doc/IS/json-fg-1/1.0

Internal reference number of this OGC® document:    21-045r1

Version: 1.0.0

Category: OGC® Implementation Standard

Editor:  Clemens Portele, Panagiotis (Peter) A. Vretanos

OGC Features and Geometries JSON - Part 1: Core

Copyright notice

Copyright © 2026 Open Geospatial Consortium

To obtain additional rights of use, visit https://www.ogc.org/legal/

Warning

This document is an OGC Member approved international standard. This document is available on a royalty free, non-discriminatory basis. Recipients of this document are invited to submit, with their comments, notification of any relevant patent rights of which they are aware and to provide supporting documentation.

Document type:    OGC® Standard

Document subtype:   Implementation

Document stage:    Approved

Document language:  English

License Agreement

Permission is hereby granted by the Open Geospatial Consortium, ("Licensor"), free of charge and subject to the terms set forth below, to any person obtaining a copy of this Intellectual Property and any associated documentation, to deal in the Intellectual Property without restriction (except as set forth below), including without limitation the rights to implement, use, copy, modify, merge, publish, distribute, and/or sublicense copies of the Intellectual Property, and to permit persons to whom the Intellectual Property is furnished to do so, provided that all copyright notices on the intellectual property are retained intact and that each person to whom the Intellectual Property is furnished agrees to the terms of this Agreement.

If you modify the Intellectual Property, all copies of the modified Intellectual Property must include, in addition to the above copyright notice, a notice that the Intellectual Property includes modifications that have not been approved or adopted by LICENSOR.

THIS LICENSE IS A COPYRIGHT LICENSE ONLY, AND DOES NOT CONVEY ANY RIGHTS UNDER ANY PATENTS THAT MAY BE IN FORCE ANYWHERE IN THE WORLD.

THE INTELLECTUAL PROPERTY IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE DO NOT WARRANT THAT THE FUNCTIONS CONTAINED IN THE INTELLECTUAL PROPERTY WILL MEET YOUR REQUIREMENTS OR THAT THE OPERATION OF THE INTELLECTUAL PROPERTY WILL BE UNINTERRUPTED OR ERROR FREE. ANY USE OF THE INTELLECTUAL PROPERTY SHALL BE MADE ENTIRELY AT THE USER’S OWN RISK. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ANY CONTRIBUTOR OF INTELLECTUAL PROPERTY RIGHTS TO THE INTELLECTUAL PROPERTY BE LIABLE FOR ANY CLAIM, OR ANY DIRECT, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM ANY ALLEGED INFRINGEMENT OR ANY LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR UNDER ANY OTHER LEGAL THEORY, ARISING OUT OF OR IN CONNECTION WITH THE IMPLEMENTATION, USE, COMMERCIALIZATION OR PERFORMANCE OF THIS INTELLECTUAL PROPERTY.

This license is effective until terminated. You may terminate it at any time by destroying the Intellectual Property together with all copies in any form. The license will also terminate if you fail to comply with any term or condition of this Agreement. Except as provided in the following sentence, no such termination of this license shall require the termination of any third party end-user sublicense to the Intellectual Property which is in force as of the date of notice of such termination. In addition, should the Intellectual Property, or the operation of the Intellectual Property, infringe, or in LICENSOR’s sole opinion be likely to infringe, any patent, copyright, trademark or other right of a third party, you agree that LICENSOR, in its sole discretion, may terminate this license without any compensation or liability to you, your licensees or any other party. You agree upon termination of any kind to destroy or cause to be destroyed the Intellectual Property together with all copies in any form, whether held by you or by any third party.

Except as contained in this notice, the name of LICENSOR or of any other holder of a copyright in all or part of the Intellectual Property shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Intellectual Property without prior written authorization of LICENSOR or such copyright holder. LICENSOR is and shall at all times be the sole entity that may authorize you or any third party to use certification marks, trademarks or other special designations to indicate compliance with any LICENSOR standards or specifications. This Agreement is governed by the laws of the Commonwealth of Massachusetts. The application to this Agreement of the United Nations Convention on Contracts for the International Sale of Goods is hereby expressly excluded. In the event any provision of this Agreement shall be deemed unenforceable, void or invalid, such provision shall be modified so as to make it valid and enforceable, and as so modified the entire Agreement shall remain in full force and effect. No decision, action or inaction by LICENSOR shall be construed to be a waiver of any rights or remedies available to it.

Table of Contents

i. Abstract

GeoJSON is a very popular exchange format for feature data. GeoJSON is widely supported, including in most implementations of the OGC API - Features - Part 1: Core Standard. However, GeoJSON has intentional restrictions that prevent or limit its use in certain geospatial application contexts. For example, GeoJSON is restricted to using only WGS 84 coordinates in Longitude Latitude axis order, supports only the original Simple Features geometry types, and has no concept of classifying features according to their type.

The OGC Features and Geometries JSON (JSON-FG) Standard specifies GeoJSON extensions that provide standard ways to support these and other additional requirements. The JSON-FG Standardization goal is to focus on capabilities that may require some geospatial expertise, but that are useful in many applications. Edge cases are considered out-of-scope of JSON-FG.

Since JSON-FG specifies extensions to the GeoJSON RFC that still conform to the GeoJSON rules, valid JSON-FG features or feature collections are also valid GeoJSON features or feature collections.

ii. Keywords

The following are keywords to be used by search engines and document catalogues.

ogcdoc, OGC document, JSON, JSON-FG, GeoJSON, feature, geometry

iii. Preface

Attention is drawn to the possibility that some of the elements of this document may be the subject of patent rights. The Open Geospatial Consortium shall not be held responsible for identifying any or all such patent rights.

Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by any implementation of the standard set forth in this document, and to provide supporting documentation.

iv. Security Considerations

The security considerations for GeoJSON as specified in Section 10 of IETF RFC 7946 also apply to JSON-FG.

vi. Submitting organizations

The following organizations submitted this Document to the Open Geospatial Consortium (OGC):

  • CubeWerx

  • Esri

  • Geonovum

  • interactive instruments

vii. Submitters

All questions regarding this submission should be directed to the editor or the submitters:

Name

Affiliation

Clemens Portele (editor)

interactive instruments

Panagiotis (Peter) A. Vretanos (editor)

CubeWerx

Linda van den Brink

Geonovum

Satish Sankaran

Esri

1. Scope

The OGC Features and Geometries JSON (JSON-FG) Standard extends the GeoJSON format to support a limited set of additional capabilities that are out-of-scope for GeoJSON, but that are important for a variety of use cases involving feature data.

The JSON-FG Standard specifies the following mandatory extensions to the GeoJSON format:

  • The ability to use Coordinate Reference Systems (CRSs) other than WGS 84 with axis order longitude/latitude;

  • The ability to encode temporal characteristics of a feature; and

  • A statement to which JSON-FG conformance classes a JSON-FG feature collection, feature, or geometry conforms to.

In addition, the following optional extensions are specified:

  • Support for solids and prisms as geometry types;

  • Support for circular arcs, compound curves, and curve polygons as geometry types;

  • Support for measure values in coordinates;

  • The ability to declare the type and the schema of a feature.

Geographic features, their properties, and their spatial extents that can be represented as GeoJSON objects are encoded as GeoJSON. Additional information not specified in the GeoJSON RFC is mainly encoded in additional members of the GeoJSON objects. The additional members use keys that do not conflict with existing GeoJSON keys. This was done so that existing and future GeoJSON clients can continue to successfully parse and understand GeoJSON encoded content. JSON-FG enabled clients will also be able to parse and understand the additional members.

JSON Schema is used to formally specify the JSON-FG syntax.

2. Conformance

This Standard defines eight requirements classes.

Six requirements classes have JSON-FG root objects as their standardization target type.

  • "Core": The Core requirements class extends GeoJSON with additional members that specify how temporal information, extended geometry information, and coordinate reference system information can be encoded in a JSON-FG object. In addition, metadata is added to declare the JSON-FG conformance classes that a JSON object conforms to. The Core requirements class has a dependency on GeoJSON. This means that a JSON-FG object that conforms to Core must also conform to GeoJSON.

  • "Polyhedra": The Polyhedra requirements class adds support for Polyhedron and MultiPolyhedron geometries in a 3D CRS. The Polyhedra requirements class has a dependency on the Core requirements class. This means that a JSON-FG object that conforms to the Polyhedra conformance class must also conform to the Core conformance class.

  • "Prisms": The Prisms requirements class adds support for Prism, and MultiPrism geometries in a 3D CRS. The Prisms requirements class has a dependency on the Core requirements class. This means that a JSON-FG object that conforms to the Prisms conformance class must also conform to the Core conformance class.

  • "Circular Arcs": The Circular Arcs requirements class adds support for CircularString, CompoundCurve, CurvePolygon, MultiCurve, and MultiSurface geometries to support curves with linear and circular arc interpolation. The Circular Arcs requirements class has a dependency on the Core requirements class. This means that a JSON-FG object that conforms to the Circular Arcs conformance class must also conform to the Core conformance class.

  • "Measures": The Measures requirements class adds support for the Measures: the "measures" member member and measure values in coordinates. The Measures requirements class has a dependency on the Core requirements class. This means that a JSON-FG object that conforms to the Measures conformance class must also conform to the Core conformance class.

  • "Feature Types and Schemas": The Feature Types and Schemas requirements class adds support for feature types and schema references. Features are often categorized by type. This requirements class adds members to a JSON-FG feature or feature collection so that contained features can be tagged with a type value. This requirements class includes guidance about how to include information about the schema of a feature type. The Feature Types and Schemas requirements class has a dependency on the Core requirements class. This means that a JSON-FG object that conforms to the Feature Types and Schemas conformance class must also conform to the Core conformance class.

The "GeoJSON Profiles" requirements class, has GeoJSON documents as its standardization type. The requirements class adds support for GeoJSON Profiles of the GeoJSON media type. The GeoJSON Profiles requirements class has conditional dependencies on GeoJSON and the Core requirements class of this Standard.

The eighth requirements class, "JSON-FG in Web APIs", has Web APIs as its standardization target type. The requirements class specifies how clients can request GeoJSON in the JSON-FG profiles via a Web API.

Conformance with the JSON-FG Standard shall be checked using all the relevant tests specified in Annex A (normative) of this document. The framework, concepts, and methodology for testing, and the criteria to be achieved to claim conformance are specified in the OGC Compliance Testing Policies and Procedures and the OGC Compliance Testing web site.

All requirements-classes and conformance-classes described in this document are owned by the Standard(s) identified.

Table 1. Conformance class URIs
Conformance class URI

Core

http://www.opengis.net/spec/json-fg-1/1.0/conf/core

Polyhedra

http://www.opengis.net/spec/json-fg-1/1.0/conf/polyhedra

Prisms

http://www.opengis.net/spec/json-fg-1/1.0/conf/prisms

Circular Arcs

http://www.opengis.net/spec/json-fg-1/1.0/conf/circular-arcs

Measures

http://www.opengis.net/spec/json-fg-1/1.0/conf/measures

Feature Types and Schemas

http://www.opengis.net/spec/json-fg-1/1.0/conf/types-schemas

GeoJSON Profiles

http://www.opengis.net/spec/json-fg-1/1.0/conf/profiles

JSON-FG in Web APIs

http://www.opengis.net/spec/json-fg-1/1.0/conf/api

3. References

The following normative documents contain provisions that, through reference in this text, constitute provisions of this document. For dated references, subsequent amendments to, or revisions of, any of these publications do not apply. For undated references, the latest edition of the normative document referred to applies.

Internet Engineering Task Force (IETF). RFC 3339: Date and Time on the Internet: Timestamps. Edited by G. Klyne, C. Newman. 2002. Available at https://www.rfc-editor.org/rfc/rfc3339.html

Internet Engineering Task Force (IETF). RFC 7946: The GeoJSON Format. Edited by H. Butler, M. Daly, A. Doyle, S. Gillies, S. Hagen, T. Schaub. 2016. Available at https://www.rfc-editor.org/rfc/rfc7946.html

Open Geospatial Consortium (OGC). OGC 06-103r4: OpenGIS® Implementation Standard for Geographic information - Simple feature access - Part 1: Common architecture. Edited by J. Herring. 2011. Available at https://portal.opengeospatial.org/files/?artifact_id=25355

Open Geospatial Consortium (OGC). OGC API - Features - Part 5/Common - Part 3: Schemas 1.0. Edited by C. Portele, P. Vretanos. 2026. Available at https://docs.ogc.org/is/23-058r2/23-058r2.html

4. Terms, Definitions and Abbreviated Terms

4.1. Terms and Definitions

This document uses the terms defined in OGC Policy Directive 49, which is based on the ISO/IEC Directives, Part 2, Rules for the structure and drafting of International Standards. In particular, the word “shall” (not “must”) is the verb form used to indicate a requirement to be strictly followed to conform to this Standard and OGC documents do not use the equivalent phrases in the ISO/IEC Directives, Part 2.

This document also uses terms defined in the OGC Standard for Modular specifications (OGC 08-131r3), also known as the 'ModSpec'. The definitions of terms such as standard, specification, requirement, and conformance test are provided in the ModSpec.

For the purposes of this document, the following additional terms and definitions apply.

coordinate

one of a sequence of numbers designating the position of a point [OGC Topic 2]

coordinate reference system

coordinate system that is related to an object by a datum [OGC Topic 2]

Note
More information about coordinate reference systems and common problems when dealing with coordinates may be found in the W3C/OGC Spatial Data on the Web Best Practice in the section 'Coordinate Reference Systems (CRS)'.
feature

abstraction of real world phenomena [ISO 19101-1:2014]

Note
More details about the term 'feature' may be found in the W3C/OGC Spatial Data on the Web Best Practice in the section 'Spatial Things, Features and Geometry'.
feature collection

a set of features from a dataset

feature schema

schema that describes the properties of a feature type

feature type

class of features having common characteristics [ISO 19156:2023]

JSON document

an information resource (series of octets) described by the "application/json" media type [JSON Schema 2020-12]

Note
The terms "JSON document," "JSON text," and "JSON value" are interchangeable.
JSON object

an unordered set of name/value pairs mapping the name to a JSON value [JSON Schema 2020-12, modified]

JSON-FG document

a JSON document that contains a JSON-FG root object

JSON-FG feature

a JSON object that validates against the JSON-FG feature schema

JSON-FG feature collection

a JSON object that validates against the JSON-FG feature collection schema

JSON-FG geometry

a JSON object that validates against the JSON-FG geometry schema

JSON-FG object

a JSON object that is either a JSON-FG feature, a JSON-FG feature collection, or a JSON-FG geometry

JSON-FG root object

a JSON-FG object that is not a direct children of another JSON-FG object

<JSON> key

the name of a member

<JSON> member

a name/value pair in a JSON object

position

a sequence of numbers representing a point in a coordinate reference system

primary geometry

the geometry that the publisher considers as the most important spatial characteristic of a feature [OGC API - Features - Part 5: Schemas]

Note
A feature can be described by multiple spatial properties. For example, a radio tower can have a property with a point value that describes the location of the tower and another property with a multi-polygon value that describes the area of coverage. Some feature formats can represent only a single geometry per feature. In those cases, the primary geometry will be used when the feature is encoded in such a format.
Note
The primary geometry of a feature can also vary depending on the zoom level. At a smaller scale, the primary geometry could be a point while a polygon could be used at a larger scale.
primary temporal information

the time instant or time interval that the publisher considers as the most important temporal characteristic of a feature [OGC API - Features - Part 5: Schemas]

Note
A feature can be described by multiple temporal properties. For example, an event can have a property with an instant or interval when the event occurred or will occur and another property when the event was recorded in the dataset. The primary temporal information can also be built from two properties, e.g., when the feature has two properties describing the start instant and end instant of an interval.
profile

additional semantics (constraints, conventions, extensions) that are associated with a resource representation, in addition to those defined by the media type [RFC 6906: The 'profile' Link Relation Type]

publisher

entity responsible for making a resource available [Dublin Core Metadata Initiative - DCMI Metadata Terms]

4.2. Abbreviated Terms

3D

Three Dimensional

API

Application Programming Interface

CAD

Computer Aided Design

CQL2

OGC Common Query Language

CRS

Coordinate Reference System

DGIWG

Defense Geospatial Information Working Group

DIGEST

Digital Geospatial Information Exchange Standard

FACC

Feature Attribute Coding Catalog

IANA

Internet Assigned Numbers Authority

IETF

Internet Engineering Task Force

ISO

International Organization for Standardization

JSON

JavaScript Object Notation

JSON-FG

OGC Features and Geometries JSON

OGC

Open Geospatial Consortium

OWL

Web Ontology Language

RFC

Request for Comments

URI

Uniform Resource Identifier

UTC

Coordinated Universal Time

WGS 84

World Geodetic System 1984

5. Conventions

5.1. Identifiers

The normative provisions in this Standard are denoted by the URI:

http://www.opengis.net/spec/json-fg-1/1.0

All requirements and conformance tests that appear in this document are denoted by partial URIs which are relative to this base.

5.2. Use of JSON terminology

The following terms are used as specified in JSON. In particular:

  • "member" refers to a name/value pair of an object;

  • "key" refers to the name of a member; and

  • "value" refers to the value of a member, which may be an object, array, string, number, boolean, or null.

For example, the GeoJSON "geometry" member has the key "geometry" and one of the GeoJSON geometries (or null) as its value.

5.3. Use of JSON Schema

Where possible, JSON Schema is used to formally specify the JSON-FG syntax. Additional requirements are used where JSON-Schema is not sufficient to express aspects of the JSON-FG syntax such as the relationship between the JSON-FG place member and the fallback GeoJSON geometry member. All schemas are in Annex 'Schemas (Normative)'.

In addition, JSON Schema is used to describe the schema of feature types, see the "featureSchema" member.

5.4. Extensibility

JSON-FG is designed to be extensible. Extensions to the core, to any of the other conformance classes defined in this document or the addition of new capabilities can be specified in revisions to this Standard. Extensions can also be specified in additional documents that would become additional parts of the JSON-FG Standard. Finally, extensions can be specified by communities. However, such extensions will not be vetted by the OGC.

Readers of JSON-FG objects should therefore be prepared to encounter unexpected keys or unexpected values. Keys that are not recognized should be ignored. Unexpected values of a known key should be mapped to null.

The JSON Schemas are designed to support extensions. JSON-FG objects that include custom extensions, but conform to JSON-FG requirements classes will still validate against the normative JSON-FG schemas published in the OGC Schema Repository.

The "$id" member of the schemas does not include information about the version of the Standard or the part of the JSON-FG standard. Future revisions of this Standard or additional parts of JSON-FG will update and extend the JSON-FG schemas. Changes to the JSON-FG schemas should not invalidate existing JSON-FG objects without custom extensions.

The "CustomGeometry", "CustomCurve", and "CustomSurface" objects specified in "geometry-object.json" supports this evolution of the JSON-FG schemas over time. The schema will match any geometries that are not specified by GeoJSON or JSON-FG. If in the future additional object types are added to JSON-FG, the type names would be excluded from the "type" member in "CustomGeometry". See Geometry type "GeodesicString" for an example.

Note
The "$id" member identifies a schema resource with its canonical URI. The member is specified by JSON Schema.

Custom extensions should use a URI in "$id" that is controlled by the community of interest. A HTTP GET request to the URI should return the JSON Schema document.

See Extending JSON-FG for examples of how future parts or communities could extend the schemas.

6. Introduction

6.1. Motivation

JavaScript Object Notation (JSON) is a popular encoding format for geospatial data. The light weight, simple syntax, and clear human and machine readability of JSON as well as universal support in all modern programming languages appeals to developers. The GeoJSON format as defined in IETF RFC 7946 is a very popular JSON encoding for geographic data. GeoJSON is supported by many commercial and open-source geospatial technology products and libraries. GeoJSON is also supported in most deployments of APIs implementing the OGC API Features Standard. However, GeoJSON has limitations that prevent or limit its use in certain cases, including:

  • WGS 84 is the only allowed Coordinate Reference System (CRS);

  • Geometries are restricted to points, curves, and surfaces with linear interpolation; and

  • No general capability is available to specify the schema of a feature, its type, or its temporal characteristics.

6.2. Scenarios

The following general scenarios are useful in understanding the principles that were used in the JSON-FG design.

  1. In order to display features in a 3D scene, a client accesses a Web API that shares a building dataset and that implements the OGC API Features Standard. The scene uses a projected CRS, such as EPSG:5555. The API advertises support for GeoJSON for representing features including JSON-FG extensions as well as support for the projected CRS in addition to WGS 84.

  2. A client accesses a JSON-FG document with building data that is stored locally or as a static file in the cloud (e.g., in an Object Storage or a GitHub repository). Again, the file is accessed to display features in a 3D scene and a time slider is used to suppress features outside of a user-specified time interval.

6.2.1. Using a GeoJSON client

Consider the case where the client implementation only supports GeoJSON and not JSON-FG. An assumption is that the client does support CRS transformations.

In the first scenario (API access), the client requests the GeoJSON representation of the feature using Accept: application/geo+json. This is because the client only knows the GeoJSON feature encoding as specified in RFC 7946. The response should not include the JSON-FG extensions. Further, the response is provided in the WGS 84 CRS with axis order longitude/latitude. The client can then transform the geometry to the projected CRS.

In the second scenario (file access), the client has no access to a media type and has to inspect the file to determine, if the file is a GeoJSON document that it can process. While the JSON document consists of a JSON-FG object, it is also a valid GeoJSON object. Therefore, the client is still able to use and display the features. The client will, however, not understand the additional information introduced by JSON-FG. To avoid issues for GeoJSON clients parsing JSON-FG objects, the names of any JSON-FG extension members must not conflict with the names of existing GeoJSON members to avoid issues for GeoJSON clients parsing JSON-FG objects.

6.2.2. Using a JSON-FG client

The client implementation supports GeoJSON including the JSON-FG extensions.

In the first scenario (API access), the client will typically request the JSON-FG representation of the feature using an Accept: application/geo+json header and a profile query parameter selecting a JSON-FG profile (e.g., profile=jsonfg) and a crs=http://www.opengis.net/def/crs/EPSG/0/5555 query parameter to request the coordinates in the projected CRS. The response will include the headers Content-Type: application/geo+json, Content-Crs: http://www.opengis.net/def/crs/EPSG/0/5555 as well as Link: <http://www.opengis.net/def/profile/OGC/0/jsonfg>; rel="profile" and include the JSON-FG building blocks including the geometry in the requested projected CRS and temporal information.

In the second scenario (file access), the JSON-FG client is in the same position as the GeoJSON client. The client has no access to media type and profile information. The client has to inspect the file to determine the type. The file could be GeoJSON, JSON-FG or some other kind of document that the client does not understand. JSON-FG documents include a "conformsTo" member that declares that the JSON document conforms to one or more JSON-FG 1.0 conformance classes. Therefore, the client can identify the document as a JSON-FG document and process the content. Since the JSON-FG document provides spatial and temporal information about each feature, the client can zoom in on the features and, for example, provide a time slider so that the user can filter the features that are displayed.

7. JSON-FG building blocks

This Clause describes the JSON building blocks required to extend GeoJSON. The subsequent clauses specify the formal requirements.

7.2. General Approach

The GeoJSON RFC specifies in Clauses 6 and 7 that additional members ("foreign members") can be added to GeoJSON objects as long as they do not conflict with members as specified by GeoJSON.

JSON-FG extends GeoJSON in two ways:

  • By adding new JSON members to features, feature collections and geometries; and

  • By specifying additional geometries.

Like GeoJSON, JSON-FG does not place constraints on the information in the "properties" member and JSON-FG readers do not have to parse the "properties" object. This approach avoids name clashes with existing feature properties in the "properties" object.

Some GeoJSON readers, however, only provide access to the pre-defined JSON members in GeoJSON features, such as "id", "geometry", "bbox" and "properties". If the target audience uses such tools, it is recommended to also include the additional JSON-FG members like "time", "place", "featureType", "coordRefSys", and "measures" in the "properties" object.

7.3. Core building blocks

7.3.1. Metadata: the "conformsTo" member

To indicate that a JSON object is a JSON-FG object and to indicate the JSON-FG version and requirements classes implemented in the value, a "conformsTo" member is required to be included in the JSON-FG root object (that is, a JSON-FG geometry, feature, or feature collection that is not a direct child of another JSON-FG object).

The value of the member is an array of strings, where each string is a URI of a conformance class.

Example 1. Conformance declaration using URIs
1
2
3
4
"conformsTo" : [
  "http://www.opengis.net/spec/json-fg-1/1.0/conf/core",
  "http://www.opengis.net/spec/json-fg-1/1.0/conf/polyhedra"
]

7.3.2. Temporal information: the "time" member

Overview

Many features have a geometry property that provides information about the primary spatial characteristics of the feature. In GeoJSON, this information is encoded in the "geometry" member. Features often have temporal information, too. In most cases, time is either an instant (e.g., an event) or an interval (e.g., an activity or a temporal validity). In the OGC API Features Standard the temporal property is reflected in the parameter "datetime" for temporal filtering of features that is supported by all compliant Feature API instances.

JSON-FG adds support for the most common case: Associating a feature with a single temporal instant or interval in the Gregorian calendar.

More complex cases and other temporal coordinate reference systems are out-of-scope for this Standard and might be specified in extensions.

Description

Features can have temporal properties. These properties will typically be included in the "properties" member.

  • In many datasets all temporal properties are instants (represented by a date or a timestamp) and intervals are described using two temporal instants, one for the start and one for the end.

  • Multiple temporal properties are sometimes used to describe different temporal characteristics of a feature. For example, the time instant or interval when the information in the feature is valid (sometimes called "valid time") and the time when the feature was recorded in the dataset (sometimes called "transaction time"). Another example is the Observations & Measurements Standard, where an observation has multiple temporal properties including "phenomenon time," "result time," and "valid time".

As GeoJSON does, JSON-FG does not place constraints on the information in the "properties" member. JSON-FG specifies a new JSON member in a feature (key: "time"). The member describes temporal information (an instant or an interval) that can be used by clients without a need to inspect the "properties" member or to understand the schema of the feature. Clients that are familiar with a dataset can, of course, inspect the information in the "properties" member instead of inspecting the "time" member.

The publisher of the data needs to decide which temporal feature properties are used in the "time" member.

The "time" member is either missing or null (no temporal information) or an object with at least one member.

Table 2. Members of the "time" object
Member Type Description

date

string

An instant with a granularity of a date. See below for more details about dates.

timestamp

string

An instant with the granularity of a timestamp. See below for more details about timestamps.

interval

[ string ]

An interval, described by an array of the two instants (start and end). See below for more details about intervals.

Providing multiple members is valid, if all values intersect. In this case, clients should use the "interval" property and may use the "date" or "timestamp" property to determine the temporal characteristics of the feature.

The "time" object may be extended with additional members. Clients processing a "time" object must be prepared to parse additional members. Clients should ignore members that they do not understand. For example, in cases where the "time" member neither includes a "date," "timestamp," or "interval," a client may process the feature as a feature without temporal information.

Note
The data publisher decides how temporal properties inside the "properties" member are encoded. The schema for the "time" member does not imply a recommendation that temporal feature properties reuse the same schema. For example, it is expected that a date-valued feature attribute will in most cases be represented as string with an RFC 3339 date value.
Instants

An instant is a value that conforms to RFC 3339 (Date and Time on the Internet: Timestamps) and is consistent with one of the following production rules of the ISO 8601 profile specified in the RFC:

  • full-date (e.g., "1969-07-20")

  • date-time (e.g., "1969-07-20T20:17:40Z")

Conceptually, an instant is a "temporal entity with zero extent or duration" [Time Ontology in OWL]. In practice, the temporal position of an instant is described using data types where each value has some duration or granularity. The value should be described with a granularity that is sufficient for the intended use of the data.

In the case of a timestamp the granularity is a second or smaller. All timestamps must be in the time zone UTC ("Z").

In the case of a date the granularity is a day. Dates as instants will be used when a granularity of a day independent of its timezone is sufficient for the intended use of the data. If that is not the case and the timezone is important for the intended use, the temporal information should be provided as an interval with start and end timestamps.

Note
The JSON-FG Standard only provides guidance as to how to represent feature data in JSON. Providing guidance as to how to cast JSON-FG data to other data types is out of scope. The OGC Common Query Language (CQL2) Standard uses the same model of instants and intervals as JSON-FG and includes additional guidance how to compare values.
Example 2. A date
1
"time" : { "date": "1969-07-20" }
Example 3. A timestamp
1
"time" : { "timestamp": "1969-07-20T20:17:40Z" }

Dates and timestamps are the initial range of instant values. The range may be extended in the future to support additional use cases. Clients processing values of time must be prepared to receive other values. Clients should ignore values that they do not understand.

Intervals

An interval is described by start and end instants. Both start and end instants are included in the interval, i.e., the interval is closed.

The unbounded end of an interval is represented by a double-dot string ("..") for the start/end. This follows the convention of ISO 8601-2 for an open start or end.

Example 4. An interval with dates
1
"time" : { "interval": [ "1969-07-16", "1969-07-24" ] }
Example 5. An interval with timestamps
1
"time" : { "interval": [ "1969-07-16T05:32:00Z", "1969-07-24T16:50:35Z" ] }
Example 6. A half-bounded interval
1
"time" : { "interval": [ "2014-04-24T10:50:18Z", ".." ] }

The options described above are the initial range of interval values - the granularity is either days or (sub-)seconds and interval ends may be unbounded. The value range may be extended in the future to support additional use cases. Clients processing values of time must be prepared to receive other values. Clients should ignore values that they do not understand.

7.3.3. Geometry: the "geometry" and "place" members

Overview

Features typically have a geometry that provides information about the primary spatial characteristics of the feature.

In GeoJSON, geometry information is encoded in the "geometry" member. Geometries are encoded according to the OGC Simple Features Standard (2D or 2.5D points, line strings, polygons or aggregations of them) using a WGS 84 CRS (OGC:CRS84 for 2D or OGC:CRS84h for 2.5D).

A key motivation for the development of the JSON-FG Standard is to support additional requirements, especially the ability to represent geometries in other CRSs and in additional geometry types.

To avoid confusing existing GeoJSON readers, such geometries are provided in a new member in the feature with the key "place."

Description

The primary geometry of a feature is provided in the "geometry" and/or "place" members of the feature as specified in the next sub-clause. The value of both members is an object representing a geometry - or null. The "place" member can also be omitted, if the member has no value.

The valid values of the "geometry" member are specified in the GeoJSON standard.

The value range of the "place" member is an extended and extensible version of the value range of the GeoJSON "geometry" member:

Only the capability to declare the coordinate reference system is considered a Core capability. The other capabilities are added by additional building blocks described in subsequent sections.

Future parts of Features and Geometries JSON or community extensions may specify additional members or additional geometry types. JSON-FG readers should be prepared to parse values of "place" that go beyond the schema that is implemented by the reader. Unknown members should be ignored and geometries that use an unknown geometry type should be mapped to null.

Note
The JSON-FG standard does not add a new JSON-FG geometry collection that includes the new JSON-FG geometry types, because geometry collections are rarely used as feature geometries.

All coordinates in a "place" member are in the same coordinate reference system. This includes GeometryCollection geometries, where all geometries must be in the same coordinate reference system.

Use of "geometry" and/or "place"

If the geometry is a valid GeoJSON geometry (that is, one of the GeoJSON geometry types, in WGS 84), the geometry is encoded as the value of the "geometry" member. The "place" member then has the value null or is omitted.

If the geometry cannot be represented as a valid GeoJSON geometry, the geometry is encoded as the value of the "place" member.

In addition, a valid GeoJSON geometry may be provided as the value of the "geometry" member in the WGS 84 CRS as specified in the GeoJSON standard. Otherwise, the "geometry" member is set to null. If present, the geometry that is the value of the "geometry" member is a fallback for readers that support GeoJSON, but not JSON-FG. This fallback geometry could be a simplified version of the value of the "place" member - like the building footprint in the example "building with a polyhedron geometry and the polygon footprint" which is the polygon projection of the solid geometry. The fallback geometry can also be the same point/line string/polygon geometry that is the value of the "place" member, but in a WGS 84 CRS (potentially with fewer vertices to reduce the file size). It is the decision of the publisher, how the fallback geometry in a WGS 84 CRS is derived from the geometry that is the value of the "place" member. In the example, this is the footprint of the building, but it also could be a representative point (to reduce the data volume) or a 3D MultiPolygon representing the outer shell of the polyhedron (for clients that support visualizations in 3D).

The presence of such fallback geometries in JSON-FG features is indicated by a link from the JSON document to the "http://www.opengis.net/def/profile/OGC/0/jsonfg-plus" profile (see Requirements Class "GeoJSON Profiles").

Note
GeoJSON states that "geometry" is null, if the feature is "unlocated". A real-world entity is obviously not unlocated when "place" has a value. However, the GeoJSON representation of the feature can still considered to be "unlocated", if a representation in a WGS 84 CRS cannot be determined. Examples for such situations are: a local engineering CRS or a planetary CRS is used for the geometry in "place", or if the known consumers of the JSON document do not need the fallback geometry.

7.3.4. Reference systems: the "coordRefSys" member

Overview

Without any other information, the following coordinate reference system (CRS) defaults apply to JSON-FG objects:

  • Geographic CRS: WGS 84 with axis order longitude, latitude and optional ellipsoidal height, either "http://www.opengis.net/def/crs/OGC/0/CRS84" (2D) or "http://www.opengis.net/def/crs/OGC/0/CRS84h" (3D); and

  • Temporal CRS: DateTime in Gregorian calendar, "http://www.opengis.net/def/crs/OGC/0/GregorianDateTime".

Note
In the GregorianDateTime temporal CRS, all granularities of ISO 8601 are valid values according to OGC Abstract Specification Topic 2: Referencing by coordinates, section D.3. That is, both dates and timestamps are valid values in the CRS.

In the JSON-FG Standard, a new key "coordRefSys" is defined and can be used to assert the CRS of a JSON-FG geometry at the feature collection, feature, or geometry levels.

The "coordRefSys" key does not apply to the GeoJSON "geometry" member. This key only applies to geometries in the "place" member and those that may appear in the "properties" member.

If a CRS is asserted for a JSON-FG object, that assertion will typically be made at the root level of JSON-FG objects, either at the feature collection level or the feature level depending on the contents.

Description

Spatio-temporal objects are specified relative to some reference system.

GeoJSON (both the most recent RFC 7946 and the obsolete version) fixed the CRS for geometries to the "WGS84 datum, and with [an axis order of] longitude and latitude [and coordinate] units of decimal degrees". The obsolete version supported other CRSs through defining the key "crs" for specifying the CRS. In RFC 7946 the "crs" member was removed, but a prior arrangement provision was added that if all parties agree, coordinates could be represented in a different reference system. The result is that there is no interoperable way to unambiguously specify a different CRS in GeoJSON. As such, the only safe approach is to continue using OGC:CRS84(h) for GeoJSON and ignore the prior arrangement provision and the old "crs" key.

It is also important to note that the "crs" member applied to the geometry in the "geometry" member, while the "coordRefSys" member from JSON-FG does not apply to the geometry in the "geometry" member.

Additional JSON-FG building blocks like the "place" member are not bound by the restrictions in GeoJSON and so the JSON-FG Standard provides for handling CRSs in JSON-FG objects in a way that does not interfere with anything, past or present, defined in any of the GeoJSON specifications. The GeoJSON building blocks can continue to operate as always, but JSON-FG building blocks provide enhanced CRS support.

Reference system values

A reference system can be specified in a JSON-FG object using a "coordRefSys" member in one of three ways:

  • As a CRS reference using the URI of a simple CRS;

  • As a CRS reference using the URI of a simple CRS accompanied by an optional epoch value (for dynamic CRSs); or

  • As an array of simple CRS references denoting an ad hoc compound CRS.

Example 7. A simple reference system value by reference (URI).
1
"http://www.opengis.net/def/crs/EPSG/0/3857"
Example 8. A reference system value by reference (URI) and with an epoch.

The epoch is the point in time, expressed as a decimal year, to which coordinates in a dynamic coordinate reference system are referenced. The epoch 2017.23 is March 25, 2017 in the Gregorian calendar.

1
2
3
4
5
{
  "type": "Reference",
  "href": "http://www.opengis.net/def/crs/EPSG/0/4979",
  "epoch": 2017.23
}
Example 9. A ad hoc compound reference system value (using URIs)
1
2
3
4
5
6
7
8
[
  {
    "type": "Reference",
    "href": "http://www.opengis.net/def/crs/EPSG/0/4258",
    "epoch": 2016.47
  },
  "http://www.opengis.net/def/crs/EPSG/0/7837"
]
Scoping rules

Used at the feature collection level, the "coordRefSys" key asserts the CRS for JSON-FG geometries found anywhere in the feature collection that are not otherwise tagged with CRS information in the feature or geometry.

Used at the feature level, the "coordRefSys" key asserts the CRS for JSON-FG geometries found anywhere in the feature that are not otherwise tagged with CRS information in the geometry.

Used at the geometry level, the "coordRefSys" key asserts the CRS for the JSON-FG geometry within which the key is contained. For a GeometryCollection, all geometries in the collection must be in the same CRS (this constraint is "inherited" from the OGC Simple Feature Access Standard) and cannot include a "coordRefSys" member.

Where all objects on the same level are in the same CRS, declaring the CRS on the parent level instead of declaring it in all parallel objects is recommended.

Coordinate order

The order in which coordinates for JSON-FG geometries are expressed is defined in the OGC Axis Order Policy and shall be in the axis order defined by the closest-to-scope CRS metadata.

Additional coordinate reference systems

For unknown coordinate reference systems, such as with CAD engineering drawings, the following CRS identifiers can be used:

  • "http://www.opengis.net/def/crs/OGC/0/Engineering2D" for 2D coordinates (x, y); and

  • "http://www.opengis.net/def/crs/OGC/0/Engineering3D" for 3D coordinates (x, y, z).

7.4. Building blocks for 3D geometries

7.4.1. Polyhedron

A solid is defined by its bounding surfaces. Each bounding surface is a closed, simple surface, also called a shell.

Each solid has a unique exterior shell and any number of shells that are inside the exterior shell and that describe voids. The interior shells do not intersect each other and cannot contain another interior shell.

A polyhedron is a solid where each shell is a multi-polygon. 'Closed' means that the multi-polygon shell is watertight, it splits space into two distinct regions: inside and outside of the shell. 'Simple' means that the polygons that make up the shell do not intersect, they only touch each other along their common boundaries.

Cologne Cathedral LoD 2
Figure 1. A complex Polyhedron (Cologne Cathedral).

The JSON representation of the coordinates of a polyhedron is a non-empty array of multi-polygon arrays. Each multi-polygon array is a shell. The first shell is the exterior boundary, all other shells are voids.

Note
As in a GeoJSON Polygon, the first and last positions of each ring have identical values.

The dimension of all positions is three.

The Cologne Cathedral with polyhedron geometries is provided as an example in Annex C.

7.4.2. MultiPolyhedron

A multi-polyhedron is a collection of polyhedron objects. These are arbitrary aggregations. There is no assumption regarding the topological relationships between the polyhedron objects, but in most cases the polyhedron objects will not intersect each other.

Note
According to ISO 19107:2020 ("Spatial schema"), the geometry of the multi-polyhedron is the set theoretic union of all polyhedron objects. For example, if there are overlapping polyhedron objects, the volume of the multi-polyhedron will be smaller than the sum of the polyhedron volumes.

The collection of polyhedron objects is represented as a JSON array. The order of the polyhedron objects in the array is not significant.

7.4.3. Prism

A prism is defined by a base shape (e.g. Polygon or Circle) that is then extruded from some optional lower limit to an upper limit.

The limits are measured relative to a specified 3D CRS. That is either the default 3D CRS (OGC:CRS84h) or another 3D CRS specified using the coordRefSys key.

If the base shape is a point, then the extrusion is a line extending from the lower limit to the upper limit.

A pylon feature with a base shape of a point is provided as an example in Annex C.

If the base shape is a line string, then the extrusion is a ribbon following the path of the line string and extending from the lower limit to the upper limit.

A fence feature with a base shape of a line string is provided as an example in Annex C.

If the base shape is a polygon, then the extrusion is a solid whose footprint takes the shape of the specified polygon and extended from the lower limit to the upper limit. If the polygon base shape contains holes, these manifest as voids in the extruded shape.

Buildings LoD 1
Figure 2. Extruded polygons (building footprints extruded with the height of the building, City of Cologne/Germany).

7.4.4. MultiPrism

A multi-prism is an array of prism objects. The order of the prism geometries in the array is not significant.

The following figure shows a 3D rendering of Toronto City Hall. The feature with a MultiPrism geometry is provided as an example in Annex C.

Toronto City Hall
Figure 3. Toronto City Hall

7.5. Building blocks for circular arcs

7.5.1. CircularString

A circular string is defined by a sequence of an odd number of positions with a minimum of three positions. For each set of three consecutive positions, the geometry is a circular arc passing from the first position through the intermediate position to the third position.

Only the first two coordinates of each position are used to determine the path of the circular arc through the three positions in the horizontal plane. The third and fourth coordinates (Z and M), if provided, are linearly interpolated along the arc. This is consistent with the definition of circular string definition in ISO/IEC 13249-3:2016.

To support validation of the odd number of positions, a maximum number of 11 positions are allowed in a circular string (that is, a maximum number of five circular arcs in a circular string).

Example 10. A circular arc
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
    "conformsTo": [
        "http://www.opengis.net/spec/json-fg-1/1.0/conf/core"         ,
        "http://www.opengis.net/spec/json-fg-1/1.0/conf/circular-arcs"
    ],
    "coordRefSys": "http://www.opengis.net/def/crs/OGC/0/CRS84",
    "type": "CircularString",
    "coordinates": [
        [4.5368482, 51.5913298],
        [4.5371346, 51.591267],
        [4.5373782, 51.591154]
    ]
}

A circle is a circular string with five positions where the first and last positions have identical values and both arcs have the same radius.

Example 11. A circle
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
    "conformsTo": [
        "http://www.opengis.net/spec/json-fg-1/1.0/conf/core"         ,
        "http://www.opengis.net/spec/json-fg-1/1.0/conf/circular-arcs"
    ],
    "coordRefSys": "http://www.opengis.net/def/crs/OGC/0/CRS84",
    "type": "CircularString",
    "coordinates": [
        [4.5390810, 51.5902305],
        [4.5390200, 51.5902275],
        [4.5390248, 51.5901896],
        [4.5390857, 51.5901925],
        [4.5390810, 51.5902305]
    ]
}

7.5.2. CompoundCurve

A compound curve is a sequence of curves that are connected end-to-end. The curves can be line string or circular string objects. The end of one curve is the start of the next curve.

Example 12. A compound curve with two line strings and two arcs
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
{
  "conformsTo": [
    "http://www.opengis.net/spec/json-fg-1/1.0/conf/core"         ,
    "http://www.opengis.net/spec/json-fg-1/1.0/conf/circular-arcs"
  ],
  "coordRefSys": "http://www.opengis.net/def/crs/OGC/0/CRS84",
  "type": "CompoundCurve",
  "geometries": [
    {
      "type": "LineString",
      "coordinates": [
        [4.5362932, 51.5906989],
        [4.5362737, 51.5906938]
      ]
    },
    {
      "type": "CircularString",
      "coordinates": [
        [4.5362737, 51.5906938],
        [4.5362567, 51.5906829],
        [4.5362591, 51.5906678]
      ]
    },
    {
      "type": "LineString",
      "coordinates": [
        [4.5362591, 51.5906678],
        [4.5363324, 51.5906866]
      ]
    },
    {
      "type": "CircularString",
      "coordinates": [
        [4.5363324, 51.5906866],
        [4.5363173, 51.5906983],
        [4.5363037, 51.5906992]
      ]
    }
  ]
}

7.5.3. CurvePolygon

A curve polygon is a surface where each ring is a closed line string, circular string, or compound curve. The first ring is the exterior boundary and, all other rings are interior boundaries.

Example 13. A curve polygon with three holes
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
{
  "conformsTo": [
    "http://www.opengis.net/spec/json-fg-1/1.0/conf/core"         ,
    "http://www.opengis.net/spec/json-fg-1/1.0/conf/circular-arcs"
  ],
  "coordRefSys": "http://www.opengis.net/def/crs/OGC/0/CRS84",
  "type": "CurvePolygon",
  "geometries": [
    {
      "type": "CompoundCurve",
      "geometries": [
        {
          "type": "LineString",
          "coordinates": [
            [4.5338392, 51.5876096],
            [4.5338372, 51.5875992],
            [4.5338387, 51.5875854],
            [4.5338432, 51.5875765],
            [4.53385, 51.5875645],
            [4.533862, 51.5875545],
            [4.5338775, 51.5875463],
            [4.5338987, 51.5875382],
            [4.5340357, 51.5875219],
            [4.5343521, 51.5876139],
            [4.534375, 51.5876242],
            [4.5344021, 51.5876406],
            [4.5344278, 51.587658],
            [4.5344358, 51.5876634],
            [4.534465, 51.5876871],
            [4.5344773, 51.5877001],
            [4.5344844, 51.587712],
            [4.5344963, 51.5877425],
            [4.5345072, 51.5877705],
            [4.5346201, 51.5880602],
            [4.534656, 51.5881525]
          ]
        },
        {
          "type": "CircularString",
          "coordinates": [
            [4.534656, 51.5881525],
            [4.5346344, 51.5881829],
            [4.534582, 51.5881765]
          ]
        },
        {
          "type": "LineString",
          "coordinates": [
            [4.534582, 51.5881765],
            [4.5342674, 51.5879419],
            [4.5342416, 51.5879227],
            [4.5338484, 51.5876294],
            [4.5338392, 51.5876096]
          ]
        }
      ]
    },
    {
      "type": "CompoundCurve",
      "geometries": [
        {
          "type": "CircularString",
          "coordinates": [
            [4.5341598, 51.5876371],
            [4.5341706, 51.58766],
            [4.5342062, 51.5876689],
            [4.5342097, 51.5876777],
            [4.5342197, 51.5876843],
            [4.53426, 51.5876781],
            [4.534248, 51.5876533],
            [4.5342459, 51.5876527],
            [4.5342436, 51.5876522],
            [4.534242, 51.5876303],
            [4.5342153, 51.5876161]
          ]
        },
        {
          "type": "CircularString",
          "coordinates": [
            [4.5342153, 51.5876161],
            [4.5341997, 51.5875805],
            [4.5341419, 51.5875723],
            [4.5341085, 51.5876093],
            [4.5341598, 51.5876371]
          ]
        }
      ]
    },
    {
      "type": "CompoundCurve",
      "geometries": [
        {
          "type": "CircularString",
          "coordinates": [
            [4.5343077, 51.5877972],
            [4.5343035, 51.587787],
            [4.5342904, 51.5877803]
          ]
        },
        {
          "type": "LineString",
          "coordinates": [
            [4.5342904, 51.5877803],
            [4.534257, 51.5877672]
          ]
        },
        {
          "type": "CircularString",
          "coordinates": [
            [4.534257, 51.5877672],
            [4.5342434, 51.5877661],
            [4.5342353, 51.587773]
          ]
        },
        {
          "type": "LineString",
          "coordinates": [
            [4.5342353, 51.587773],
            [4.5342128, 51.5878414]
          ]
        },
        {
          "type": "CircularString",
          "coordinates": [
            [4.5342128, 51.5878414],
            [4.5342283, 51.587859],
            [4.5342598, 51.5878633],
            [4.5342756, 51.5878582],
            [4.5342863, 51.5878494]
          ]
        },
        {
          "type": "LineString",
          "coordinates": [
            [4.5342863, 51.5878494],
            [4.5342909, 51.5878242],
            [4.5343077, 51.5877972]
          ]
        }
      ]
    },
    {
      "type": "CompoundCurve",
      "geometries": [
        {
          "type": "CircularString",
          "coordinates": [
            [4.5344643, 51.5879556],
            [4.534435, 51.5879509],
            [4.5344047, 51.5879514],
            [4.5343948, 51.5879579],
            [4.5343912, 51.5879667]
          ]
        },
        {
          "type": "LineString",
          "coordinates": [
            [4.5343912, 51.5879667],
            [4.5343966, 51.5879775],
            [4.5343984, 51.5879963]
          ]
        },
        {
          "type": "CircularString",
          "coordinates": [
            [4.5343984, 51.5879963],
            [4.5344143, 51.5880128],
            [4.5344439, 51.5880182],
            [4.5344795, 51.5880095],
            [4.5345035, 51.587991],
            [4.5344961, 51.587968],
            [4.5344643, 51.5879556]
          ]
        }
      ]
    }
  ]
}

7.5.4. MultiCurve

A multi-curve is a set of curves (line string, circular string or compound curve objects). There is no assumption regarding the topological relationships between the curves.

Example 14. A multi-curve
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
{
  "conformsTo": [
    "http://www.opengis.net/spec/json-fg-1/1.0/conf/core"         ,
    "http://www.opengis.net/spec/json-fg-1/1.0/conf/circular-arcs"
  ],
  "coordRefSys": "http://www.opengis.net/def/crs/OGC/0/CRS84",
  "type": "MultiCurve",
  "geometries": [
    {
      "type": "CircularString",
      "coordinates": [ 
        [4.5342436, 51.5876522],
        [4.5342459, 51.5876527],
        [4.534248, 51.5876533],
        [4.53426, 51.5876781],
        [4.5342197, 51.5876843],
        [4.5342097, 51.5876777],
        [4.5342062, 51.5876689],
        [4.5342181, 51.5876546],
        [4.5342436, 51.5876522]
      ]
    },
    {
      "type": "CompoundCurve",
      "geometries": [
        {
          "type": "LineString",
          "coordinates": [
            [4.5343077, 51.5877972],
            [4.5342909, 51.5878242],
            [4.5342863, 51.5878494]
          ]
        },
        {
          "type": "CircularString",
          "coordinates": [
            [4.5342863, 51.5878494],
            [4.5342756, 51.5878582],
            [4.5342598, 51.5878633],
            [4.5342283, 51.587859],
            [4.5342128, 51.5878414]
          ]
        },
        {
          "type": "LineString",
          "coordinates": [
            [4.5342128, 51.5878414],
            [4.5342353, 51.587773]
          ]
        },
        {
          "type": "CircularString",
          "coordinates": [
            [4.5342353, 51.587773],
            [4.5342434, 51.5877661],
            [4.534257, 51.5877672]
          ]
        },
        {
          "type": "LineString",
          "coordinates": [
            [4.534257, 51.5877672],
            [4.5342904, 51.5877803]
          ]
        },
        {
          "type": "CircularString",
          "coordinates": [
            [4.5342904, 51.5877803],
            [4.5343035, 51.587787],
            [4.5343077, 51.5877972]
          ]
        }
      ]
    }
  ]
}

7.5.5. MultiSurface

A multi-surface is a set of surfaces (polygon or curve polygon objects). There is no assumption regarding the topological relationships between the surfaces.

Example 15. A multi-surface
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
{
  "conformsTo": [
    "http://www.opengis.net/spec/json-fg-1/1.0/conf/core"         ,
    "http://www.opengis.net/spec/json-fg-1/1.0/conf/circular-arcs"
  ],
  "coordRefSys": "http://www.opengis.net/def/crs/OGC/0/CRS84",
  "type": "MultiSurface",
  "geometries": [
    {
      "type": "CurvePolygon",
      "geometries": [
        {
          "type": "CompoundCurve",
          "geometries": [
            {
              "type": "LineString",
              "coordinates": [
                [4.5394946, 51.5897917],
                [4.5394459, 51.5898523],
                [4.5393432, 51.5899799],
                [4.5392349, 51.5901145]
              ]
            },
            {
              "type": "CircularString",
              "coordinates": [
                [4.5392349, 51.5901145],
                [4.5392371, 51.5900823],
                [4.5392512, 51.5900513]
              ]
            },
            {
              "type": "LineString",
              "coordinates": [
                [4.5392512, 51.5900513],
                [4.53959, 51.589627],
                [4.5396133, 51.5895978]
              ]
            },
            {
              "type": "CircularString",
              "coordinates": [
                [4.5396133, 51.5895978],
                [4.5396386, 51.5895773],
                [4.5396723, 51.5895622],
                [4.539708, 51.5895541],
                [4.539746, 51.5895521]
              ]
            },
            {
              "type": "LineString",
              "coordinates": [
                [4.539746, 51.5895521],
                [4.5397526, 51.5895531],
                [4.5397841, 51.5895576],
                [4.5397785, 51.5895728],
                [4.5397595, 51.5895698]
              ]
            },
            {
              "type": "CircularString",
              "coordinates": [
                [4.5397595, 51.5895698],
                [4.5396912, 51.5895764],
                [4.5396416, 51.5896063]
              ]
            },
            {
              "type": "LineString",
              "coordinates": [
                [4.5396416, 51.5896063],
                [4.5396008, 51.5896577],
                [4.5395147, 51.5897661],
                [4.5394946, 51.5897917]
              ]
            }
          ]
        }
      ]
    },
    {
      "type": "Polygon",
      "coordinates": [
        [
          [4.5394946, 51.5897917],
          [4.5395147, 51.5897661],
          [4.5400849, 51.5899434],
          [4.5401059, 51.5899168],
          [4.5401459, 51.5899291],
          [4.5401338, 51.5899444],
          [4.5401042, 51.5899353],
          [4.5400773, 51.5899689],
          [4.5400581, 51.5899634],
          [4.5400153, 51.5899531],
          [4.5394946, 51.5897917]
        ]
      ]
    }
  ]
}

7.6. Building blocks for measures

In most cases, geometries are restricted to coordinates according to a coordinate reference system.

The OGC Simple Feature Access Standard also supports an additional measure value for each position (m coordinate).

A typical use case is linear referencing, where the measure value in a curve is the distance of each position along the geometry from the start of the geometry to the position.

7.6.1. Measures: the "measures" member

If a geometry includes measure values, each position of the geometry has to contain a measure value (or m coordinate). The number of coordinates in each position is the dimension of the CRS in "coordRefSys" plus one for the measure value.

The presence of measure values in a geometry is indicated by a "measures" member.

The value of the "measures" member is an object with the following properties.

  • "enabled": A Boolean value that indicates whether the geometry has measure values or not. The property is required.

  • "unit": This optional property is the unit of the measure of the measure values. This property only applies if the value of the "enabled" property is true.

  • "description": An optional description of the meaning of the measure values. The description only applies if the value of the "enabled" property is true.

The scoping rules are the same as for the "coordRefSys" member.

7.7. Building blocks for feature types and schemas

7.7.1. Feature types: the "featureType" member

Overview

Features are often categorized by type. Typically, all features of the same type have the same schema and the same properties.

Many GIS clients depend on knowledge about the feature type when processing feature data. For example, when associating a style with a feature in order to render that feature on a map display.

GeoJSON is schema-less in the sense that it has no concept of feature types or feature schemas.

In JSON-FG, a feature is an instance of a single feature type. If a feature is associated with multiple feature types, the primary type should be declared.

The related section Feature schemas: the "featureSchema" member specifies the schema for each feature type, if such information is available.

The "featureType" member

The feature type of a feature is declared in a member of the feature with the key "featureType". The value is a string, which should be a code, convenient for the use in filter expressions.

Data specifications often specify codes for feature types. Where data is based on such a data specification, those code will in general be used. An example is the DIGEST 2.1 Feature and Attribute Coding Catalogue (FACC) Data Dictionary of the Defence Geospatial Information Working Group (DGIWG).

Note
A feature type that "just" identifies a concept, but has no associated or no well-defined schema, will not include a schema reference in the "featureSchema" member (see below) for the feature type.
Note
The IANA link relations include a link relation "type" which can, in addition, be used to reference a resource that describes a feature type beyond the code in the "featureType" member.
Homogeneous feature collections

Some clients will process feature collections differently depending on whether the collection is homogeneous with respect to the feature type or the geometry type. These clients will benefit from information that declares the feature and/or geometry type for all features in a collection.

For a feature collection where all features have the same "featureType" value, the "featureType" member can and should be added once for the feature collection. The "featureType" member can then be omitted in the features. Declaring the feature type once signals to clients that the feature collection is homogeneous with respect to the type, which clients can use to optimize their processing.

For a feature collection where all features in the feature collection have the same geometry type as their primary geometry (point, curve, surface, solid, including homogeneous aggregates), a "geometryDimension" member can and should be added once for the feature collection with the dimension of the geometry (0 for points, 1 for curves, 2 for surfaces, 3 for solids, null/not set for mixed dimensions or unknown). Declaring the geometry dimension once signals to clients that the feature collection is homogeneous with respect to the dimension, which clients can use to optimize their processing.

7.7.2. Feature schemas: the "featureSchema" member

Overview

A JSON-FG feature schema is metadata about a feature that clients can use to understand the content of JSON-FG features, such as a textual description of the feature properties or their value range.

JSON-FG follows the approach of OGC API - Features - Part 5, that is, the feature schema is a logical schema. It can not be used to directly validate a JSON document. However, a schema for validation of a JSON-FG feature or feature collection can be derived from the logical schema, if needed. The schemas of the feature properties in the logical schemas can be reused when constructing a JSON Schema for validation.

This Standard provides guidance on how to include information about the feature schemas in a JSON-FG feature or feature collection.

The "featureSchema" member

If all features in the JSON document have the same feature schema (either a single feature or a homogeneous feature collection), the URI of the feature schema can and should be provided in a top-level JSON member "featureSchema" with the feature schema URI as the value.

{
  "type": "FeatureCollection",
  "featureType": "Airport",
  "featureSchema": "https://demo.ldproxy.net/zoomstack/collections/airports/schema",
  "geometryDimension": 0,
  "conformsTo": [ "http://www.opengis.net/spec/json-fg-1/1.0/conf/core", "http://www.opengis.net/spec/json-fg-1/1.0/conf/types-schemas" ],
  "features": [ ... ]
}

If the features in the JSON document reference multiple feature types, the value of "featureSchema" is an object, where each key is the feature type that the schema describes.

{
  "type": "FeatureCollection",
  "featureSchema": {
    "Airport": "https://demo.ldproxy.net/zoomstack/collections/airports/schema",
    "RailwayStation": "https://demo.ldproxy.net/zoomstack/collections/railway_stations/schema"
  },
  "conformsTo": [ "http://www.opengis.net/spec/json-fg-1/1.0/conf/core", "http://www.opengis.net/spec/json-fg-1/1.0/conf/types-schemas" ],
  "features": [ ... ]
}
Referencing schema for JSON Schema validation

The JSON Schema specification recommends using a "describedby" link relation to a schema that can be used to validate a JSON document:

RECOMMENDATION: Instances described by a schema provide a link to a downloadable JSON Schema using the link relation "describedby" […​].
— JSON Schema

Where JSON Schema validation is important, such links can be added. For example, OGC API Features already specifies a general "links" member with an array of link objects based on RFC 8288 (Web linking) and feature responses from APIs implementing OGC API Features will already include a "links" member.

7.8. GeoJSON Profiles

This Standard defines several variations of a resource that are represented in the same format or media type. Named variations of a resource are called "profiles".

A profile does not alter the semantics of the resource representation itself. In addition to those defined by the media type, profiles enable clients to "understand" additional semantics that are associated with the resource representation.

The JSON-FG Standard leverages the concept of profiles to define a set of named variations of GeoJSON resources:

  • RFC 7946 ("rfc7946"): GeoJSON as specified in RFC 7946;

  • JSON-FG ("jsonfg"): JSON-FG as specified in this Standard; and

  • JSON-FG with improved support for GeoJSON readers ("jsonfg-plus"): JSON-FG with a geometry in the "geometry" member in WGS 84 to support GeoJSON readers that do not support JSON-FG.

This supports all variations using "application/geo+json" as the media type for JSON-FG documents, but still distinguish the variations.

Each profile is defined by a URI and a set of constraints on the JSON-FG representation. The constraints are defined in terms of the members that are required or optional in the JSON-FG representation.

If a JSON-FG document is sent over HTTP, the profile can be indicated in the HTTP header "Link" using the link relation "profile". The value of the link relation is the URI of the profile. The link can also be used in a JSON-FG document to indicate the profile of the document.

The following examples show the same feature in the three profiles. The feature is an airport in Islay, Scotland, with a geometry in the EPSG:27700 coordinate reference system.

Example 16. HTTP response with a feature in the profile "RFC 7946".
HTTP/2 200
Content-Crs: <http://www.opengis.net/def/crs/EPSG/0/27700>
Content-Language: en
Content-Type: application/geo+json
Date: Sun, 27 Apr 2025 13:19:31 GMT
Link: <http://www.opengis.net/def/profile/OGC/0/rfc7946>; rel="profile"
Vary: Accept,Accept-Language,Accept-Encoding
Content-Length: 160

{
    "type": "Feature",
    "id": 13,
    "geometry": { "type": "Point", "coordinates": [132440.63, 651435.92] },
    "properties": {"name": "Islay Airport"}
}
Example 17. HTTP response with a feature in the profile "JSON-FG".
HTTP/2 200
Content-Crs: <http://www.opengis.net/def/crs/EPSG/0/27700>
Content-Language: en
Content-Type: application/geo+json
Date: Sun, 27 Apr 2025 13:19:31 GMT
Link: <http://www.opengis.net/def/profile/OGC/0/jsonfg>; rel="profile"
Vary: Accept,Accept-Language,Accept-Encoding
Content-Length: 500

{
    "type": "Feature",
    "featureType": "Airport",
    "featureSchema": "https://demo.ldproxy.net/zoomstack/collections/airports/schema",
    "coordRefSys": "http://www.opengis.net/def/crs/EPSG/0/27700",
    "conformsTo": ["http://www.opengis.net/spec/json-fg-1/1.0/conf/core","http://www.opengis.net/spec/json-fg-1/1.0/conf/types-schemas"],
    "id": 13,
    "geometry": null,
    "properties": {"name": "Islay Airport"},
    "place": { "type": "Point", "coordinates": [132440.63, 651435.92] }
}
Example 18. HTTP response with a feature in the profile "JSON-FG with improved support for GeoJSON readers".
HTTP/2 200
Content-Crs: <http://www.opengis.net/def/crs/EPSG/0/27700>
Content-Language: en
Content-Type: application/geo+json
Date: Sun, 27 Apr 2025 13:19:31 GMT
Link: <http://www.opengis.net/def/profile/OGC/0/jsonfg-plus>; rel="profile"
Vary: Accept,Accept-Language,Accept-Encoding
Content-Length: 556

{
    "type": "Feature",
    "featureType": "Airport",
    "featureSchema": "https://demo.ldproxy.net/zoomstack/collections/airports/schema",
    "coordRefSys": "http://www.opengis.net/def/crs/EPSG/0/27700",
    "conformsTo": ["http://www.opengis.net/spec/json-fg-1/1.0/conf/core","http://www.opengis.net/spec/json-fg-1/1.0/conf/types-schemas"],
    "id": 13,
    "geometry": { "type": "Point", "coordinates": [-6.2580609, 55.6824121] },
    "properties": {"name": "Islay Airport"},
    "place": { "type": "Point", "coordinates": [132440.63, 651435.92] }
}

8. Requirements Class "Core"

Requirements Class

http://www.opengis.net/spec/json-fg-1/1.0/req/core

Target type

JSON-FG root objects

Dependency

RFC 7946: The GeoJSON Format

Indirect Dependency

RFC 3339: Date and Time on the Internet: Timestamps

Indirect Dependency

Simple feature access - Part 1: Common architecture

The Requirements Class "Core" specifies provisions for JSON-FG root objects.

A JSON-FG root object is a JSON object:

  • That is either a feature collection, feature, or geometry;

  • That is not contained in another JSON-FG object;

  • That meets all requirements described in this clause; and

  • That meets all requirements stated in the GeoJSON standard for feature collections, features, and GeoJSON geometries.

In requirements and recommendations in Clauses 8 to 13, the following terms are used as follows:

  • JSON-FG root object: Refers to the standardization target;

  • JSON-FG object: Refers to a JSON object that is either a JSON-FG root object or a JSON-FG feature collection, JSON-FG feature, or JSON-FG geometry embedded in a JSON-FG root object;

  • JSON-FG feature collection: Refers to a JSON-FG object that is a feature collection ("type" is "FeatureCollection");

  • JSON-FG feature: Refers to a JSON-FG object that is a feature ("type" is "Feature"); and

  • JSON-FG geometry: Refers to a JSON-FG object that is a geometry ("type" is one of "Point," "MultiPoint," "LineString," "MultiLineString," "Polygon," "MultiPolygon," "GeometryCollection," "Polyhedron," "MultiPolyhedron," "Prism," "MultiPrism," "CircularString," "CompoundCurve," "CurvePolygon," "MultiCurve," or "MultiSurface").

8.1. Structure of a JSON-FG root object

Requirement 1

/req/core/schema-valid

A

The JSON-FG root object SHALL validate against the JSON Schema of a JSON-FG root object.

Note
While every JSON-FG root object must validate against the schema, executing the validation is only necessary when testing conformance. Implementations reading or writing JSON-FG do not have to perform validation. It is also not necessary to publish application- or community-specific schemas that describe the schema of the feature properties to conform to the Core requirements class.

8.2. Metadata

8.2.1. Conformance declaration

Requirement 2

/req/core/metadata

A

The JSON-FG root object SHALL include a "conformsTo" member.

B

The "conformsTo" member SHALL include at least the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/core".

C

Every other JSON-FG object SHALL NOT include a "conformsTo" member.

D

If the "place" value in any JSON-FG feature is of geometry type "Polyhedron" or "MultiPolyhedron", the "conformsTo" member of the JSON-FG root object SHALL include the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/polyhedra".

E

If the "place" value in any JSON-FG feature is of geometry type "Prism" or "MultiPrism", the "conformsTo" member of the JSON-FG root object SHALL include the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/prisms".

F

If the "place" value in any JSON-FG feature is of geometry type "CircularString," "CompoundCurve," "CurvePolygon," "MultiCurve," or "MultiSurface," the "conformsTo" member of the JSON-FG root object SHALL include the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/circular-arcs".

G

If any JSON-FG object includes a "measures" member, the "conformsTo" member of the JSON-FG root object SHALL include the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/measures".

H

If any JSON-FG object includes a "featureType" or "featureSchema" member, the "conformsTo" member of the JSON-FG root object SHALL include the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/types-schemas".

Note
Strictly, items A to C of this requirement are not necessary as these statements are implied by requirement /req/core/schema-valid. These items are, however, included for clarity.

8.3. Temporal information

8.3.1. Instants

Requirement 3

/req/core/instant

A

If the "time" value in any JSON-FG feature includes a "date" member, the value SHALL conform to RFC 3339 (Date and Time on the Internet: Timestamps) and match the production rule full-date.

B

If the "time" value in any JSON-FG feature includes a "timestamp" member, the value SHALL conform to RFC 3339 (Date and Time on the Internet: Timestamps) and match the production rule date-time.

Note
Strictly, this requirement is not necessary as it is implied by requirement /req/core/schema-valid. It is, however, included for clarity.

8.3.2. Intervals

Requirement 4

/req/core/interval

A

If the "time" value in any JSON-FG feature includes an "interval" member, each array item SHALL be a string that is a double-dot ("..") or conforms to RFC 3339 (Date and Time on the Internet: Timestamps) and match one of the following production rules: full-date (a date) or date-time (a timestamp).

B

If the start is a date, the end SHALL be a date, too, or "..".

C

If the start is a timestamp, the end SHALL be a timestamp, too, or "..".

D

If neither the start and the end are "..", the start SHALL be earlier than or equal to the end.

Note
Strictly, items A to C of this requirement are not necessary as the statements are implied by requirement /req/core/schema-valid. They are, however, included for clarity.

8.3.3. Instants and intervals

Requirement 5

/req/core/instant-and-interval

A

If the "time" value in any JSON-FG feature includes both a "date" and a "timestamp" member, the full-date parts SHALL be identical.

B

If the "time" value in any JSON-FG feature includes both a "timestamp" and an "interval" member with start/end dates, the interval SHALL contain the date of the timestamp, or in case start and end of the interval are identical, the date of the timestamp SHALL be identical to the date of both interval ends.

C

If the "time" value in any JSON-FG feature includes both a "timestamp" and an "interval" member with start/end timestamps, the interval SHALL contain the timestamp, or in case start and end of the interval are identical, the timestamp SHALL be identical to both interval ends.

D

If the "time" value in any JSON-FG feature includes both a "date" and an "interval" member with start/end dates, the interval SHALL contain the date, or in case start and end of the interval are identical, the date SHALL be identical to both interval ends.

E

If the "time" value in any JSON-FG feature includes both a "date" and an "interval" member with start/end timestamps, the interval SHALL include timestamps on the date, or in case start and end of the interval are identical, the date SHALL be identical to the date of both interval ends.

8.3.4. Time zones

Requirement 6

/req/core/utc

A

Timestamps in the "time" member in any JSON-FG feature SHALL use "Z" (UTC) as the time zone.

Note
Strictly, this requirement is not necessary as it is implied by requirement /req/core/schema-valid. It is, however, included for clarity.

8.4. Geometry

8.4.1. Coordinate dimension

Requirement 7

/req/core/coordinate-dimension

A

All positions in a geometry in the "geometry" members in any JSON-FG feature SHALL have the same dimension.

B

All positions in a geometry in the "place" members in any JSON-FG feature SHALL have the same dimension.

Note
This requirement applies only to geometries in a feature, not to geometries that are used in another context.

8.4.2. "geometry" in longitude/latitude

Requirement 8

/req/core/geometry-wgs84

A

The first element of each position in the "geometry" members in any JSON-FG feature SHALL be between -180 and +180.

B

The second element of each position in the "geometry" members in any JSON-FG feature SHALL be between -90 and +90.

Note
The unit of the values is decimal degrees.

8.4.3. "geometry" without JSON-FG extensions

Requirement 9

/req/core/geometry-no-jsonfg-extension

A

The "geometry" members in any JSON-FG feature SHALL not include any members specified by JSON-FG (from this Standard: "coordRefSys", "measures").

Note
Strictly, this requirement is not necessary as it is implied by requirement /req/core/schema-valid. It is, however, included for clarity.

8.4.4. geometries are valid

Requirement 10

/req/core/valid-geometry

A

Any JSON-FG geometry of type "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" or "GeometryCollection" SHALL be a valid geometry according to Simple feature access - Part 1: Common architecture.

Note
If the geometry type is not one the types, the validity of the geometry is specified in the requirements class that defines the geometry type.
Note
This requirement also applies to geometries that are embedded in other geometries. For example, the "CompoundCurve" geometry specified in the Requirements Class "Circular Arcs" can include "LineString" geometries and the "Prism" geometry specified in the Requirements Class "Prisms" can have any 2D base geometry including those of type "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", or "MultiPolygon".

8.4.5. No point, line string or polygon geometry in WGS 84 longitude/latitude in "place"

Requirement 11

/req/core/place-geometries

A

If the "place" value in any JSON-FG feature is of geometry type "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon" or "GeometryCollection" and does not include a "measures" member the CRS SHALL not be "http://www.opengis.net/def/crs/OGC/0/CRS84" or "http://www.opengis.net/def/crs/OGC/0/CRS84h" (WGS 84 with axis order longitude/latitude).

The CRS of a "place" geometry is determined as follows:

  • If the geometry has a member "coordRefSys", the CRS is identified by the value.

    • Otherwise inspect the parent object and repeat until the JSON-FG root object.

  • If no "coordRefSys" member has been found, the CRS is "http://www.opengis.net/def/crs/OGC/0/CRS84", if the position has two coordinates (excluding a measure coordinate), or "http://www.opengis.net/def/crs/OGC/0/CRS84h", if the position has three coordinates (excluding a measure coordinate).

  • Otherwise the CRS is identified by the value of "coordRefSys" member.

8.4.6. All primary geometries are in the same CRS

Requirement 12

/req/core/same-crs

A

A "coordRefSys" member SHALL only be included in the JSON-FG root object and not in any other JSON-FG objects.

This includes geometries that are embedded in other geometries. For example,

  • the "CompoundCurve" geometry specified in the Requirements Class "Circular Arcs" includes embedded curve geometries, which cannot include a "coordRefSys" member;

  • the "Prism" geometry specified in the Requirements Class "Prisms" includes an embedded 2D base geometry, which cannot include a "coordRefSys" member.

Note
Strictly, this requirement is not necessary as it is implied by requirement /req/core/schema-valid. It is, however, included for clarity.

8.4.7. Fallback geometry in "geometry"

Requirement 13

/req/core/fallback

A

If both the "place" and the "geometry" member in a JSON-FG feature are not null, the values of both members SHALL not be identical.

Note
Strictly, this requirement is not necessary as it is implied by requirement /req/core/place-geometries. It is, however, included for clarity.

8.4.8. Axis order of coordinates

Requirement 14

/req/core/axis-order

A

In any JSON-FG geometry, the coordinates of each position SHALL be expressed according to the OGC Axis Order Policy and SHALL be in the axis order defined by the closest-to-scope CRS.

8.4.9. Coordinate values in "place"

Recommendation 1

/rec/core/place-crs

A

The first element of each position in the "place" members in any JSON-FG feature SHOULD be in the valid range for the first coordinate axis of the CRS.

B

The second element of each position in the "place" members in any JSON-FG feature SHOULD be in the valid range for the second coordinate axis of the CRS.

See the description above how to determine the CRS of a JSON-FG geometry.

Note
This is only a recommendation, and not a requirement. This is because there are often valid reasons to have coordinates outside of the range, for example outside of a UTM zone that covers most of the area of a dataset.

9. Requirements Class "Polyhedra"

Requirements Class

http://www.opengis.net/spec/json-fg-1/1.0/req/polyhedra

Target type

JSON-FG root objects

Dependency

Requirements Class "Core"

The "Polyhedra" Requirements Class adds provisions for volumetric geometries in a 3D CRS that may be of type Polyhedron or MultiPolyhedron.

9.1. Metadata

9.1.1. Conformance declaration

Requirement 15

/req/polyhedra/metadata

A

The "conformsTo" member of the JSON-FG root object SHALL include the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/polyhedra".

9.2. Geometry

9.2.1. Coordinates

Requirement 16

/req/polyhedra/coordinates

A

All positions in a "Polyhedron" or "MultiPolyhedron" geometry (JSON-FG geometry with "type" set to "Polyhedron" or "MultiPolyhedron") SHALL have a coordinate dimension of three (3) - or four (4), if measure values are included (see Requirements Class "Measures").

B

The CRS of each Polyhedron geometry SHALL be have three dimensions (a 3D CRS or an ad-hoc compound CRS consisting of a horizontal 2D CRS and a vertical CRS).

9.2.2. Geometries are valid

Requirement 17

/req/polyhedra/valid-geometry

A

If a JSON-FG geometry is of type "Polyhedron", the elements in the "coordinates" array SHALL meet the following requirements.

  • Each element is a closed, simple multi-polygon geometry (a shell).

  • The coordinates of the first and last position in each ring of each polygon in each shell SHALL be identical.

  • If the shell is viewed from the outside of the solid, the orientation of each polygon in the first element (the outer shell) SHALL be counterclockwise.

  • If the shell is viewed from the outside of the solid, the orientation of each polygon in all other shells (the voids) SHALL be clockwise.

  • No element (shell) intersects another element (shell).

  • All coordinates in the elements from the second element to the last element (the voids) are inside the simple polyhedron specified by the first element (the outer shell).

  • In the elements from the second element to the last element (the voids) there is no element where all coordinates of the element are inside the shell specified by another element (no void contains another void).

B

If a JSON-FG geometry is of type "MultiPolyhedron", each element in the "coordinates" array SHALL be a valid polyhedron geometry (see A).

Clients should, if possible, be tolerant and also accept shells with an incorrect orientation.

10. Requirements Class "Prisms"

Requirements Class

http://www.opengis.net/spec/json-fg-1/1.0/req/prisms

Target type

JSON-FG root objects

Dependency

Requirements Class "Core"

The "Prisms" Requirements Class adds provisions for extruded geometries in a 3D CRS that may be of type Prism or MultiPrism.

10.1. Metadata

10.1.1. Conformance declaration

Requirement 18

/req/prisms/metadata

A

The "conformsTo" member of the JSON-FG root object SHALL include the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/prisms".

10.2. Geometry

10.2.1. Coordinates

Requirement 19

/req/prisms/coordinates

A

All positions in the "base" member of a JSON-FG geometry of type "Prism" SHALL have a coordinate dimension of two (2) - or three (3), if measure values are included (see Requirements Class "Measures").

B

The "lower" and "upper" values of each Prism SHALL be in the valid range for the third coordinate axis of the CRS.

C

In a Prism, the "lower" value SHALL be equal or smaller than the "upper" value.

D

The CRS of each Prism geometry SHALL have three dimensions (a 3D CRS or an ad-hoc compound CRS consisting of a horizontal 2D CRS and a vertical CRS).

Note
There is no need to state a requirement that base geometries have to be valid, as this is already stated in the Requirements Class "Core" requirements class for Simple Feature geometries or in the requirements class that defines the base geometry for other geometry types.

11. Requirements Class "Circular Arcs"

The "Circular Arcs" Requirements Class adds provisions for curve geometries that may be of type CircularString, CompoundCurve, CurvePolygon, MultiCurve, or MultiSurface.

Requirements Class

http://www.opengis.net/spec/json-fg-1/1.0/req/circular-arcs

Target type

JSON-FG root objects

Dependency

Requirements Class "Core"

11.1. Metadata

11.1.1. Conformance declaration

Requirement 20

/req/circular-arcs/metadata

A

The "conformsTo" member of the JSON-FG root object SHALL include the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/circular-arcs".

11.2. Geometry

11.2.1. Geometries are valid

Requirement 21

/req/circular-arcs/valid-geometry

A

In any JSON-FG geometry of type "CircularString", the items in the "coordinates" array SHALL meet the following requirements:

  • The items are a sequence of one, two, three, four, or five connected circular arcs, where each arc is a sequence of three positions and the first position of each connected arc is not repeated (that is, the circular string consists of three, five, seven, nine, or eleven positions);

  • The first, second and third position of each circular arc are different; and

  • The first, second and third position of each circular arc are not collinear.

B

In any JSON-FG geometry of type "CompoundCurve", each item in the "geometries" array except the first item SHALL meet the following requirement:

  • The first position of each item is identical to the last position of the previous item (that is, all items are consecutive).

C

In any JSON-FG geometry of type "CurvePolygon", each item in the "geometries" array SHALL meet the following requirement:

  • The first and last position of each curve geometry is identical (that is, each item is a closed ring).

Note
The valid geometry items in the "CompoundCurve", "CurvePolygon", "MultiCurve", and "MultiSurface" geometries are implicitly specified by the JSON Schema for the JSON-FG geometries.

12. Requirements Class "Measures"

Requirements Class

http://www.opengis.net/spec/json-fg-1/1.0/req/measures

Target type

JSON-FG root objects

Dependency

Requirements Class "Core"

The "Measures" Requirements Class adds provisions for geometries with a third or fourth coordinate representing a measure, often called the "m coordinate."

12.1. Metadata

12.1.1. Conformance declaration

Requirement 22

/req/measures/metadata

A

The "conformsTo" member of the JSON-FG root object SHALL include the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/measures".

12.2. Geometry

12.2.1. Coordinates

Requirement 23

/req/measures/coordinates

A

If a JSON-FG geometry has m coordinates, each position SHALL have three coordinates (in case of a 2D CRS) or four coordinates (in case of a 3D CRS).

Whether a "place" geometry contains m coordinates is determined as follows.

  • If the geometry has a member "measures" with "enabled" set to true, the geometry has m coordinates. If the geometry has a member "measures" with "enabled" set to false, the geometry does not have m coordinates.

    • Otherwise inspect the parent object and repeat until the JSON-FG root object.

  • If no "measures" member has been found, the geometry does not have m coordinates.

12.2.2. All positions in a primary geometry use m coordinates or not

Requirement 24

/req/measures/sub-geometries

A

No JSON-FG geometry that is directly embedded in another JSON-FG geometry (in members "geometries" or "base") SHALL include a "measures" member.

For example, - the "CompoundCurve" geometry specified in the Requirements Class "Circular Arcs" includes embedded curve geometries, which cannot include a "measures" member; - the "Prism" geometry specified in the Requirements Class "Prisms" includes an embedded 2D base geometry, which cannot include a "measures" member.

Note
Strictly, this requirement is not necessary as it is implied by requirement /req/core/schema-valid. It is, however, included for clarity.

13. Requirements Class "Feature Types and Schemas"

Requirements Class

http://www.opengis.net/spec/json-fg-1/1.0/req/types-schemas

Target type

JSON-FG root objects

Dependency

Requirements Class "Core"

Indirect Dependency

OGC API - Features - Part 5: Schemas

The Requirements Class "Feature Types and Schemas" adds provisions for feature type classifications and schemas.

13.1. Metadata

13.1.1. Conformance declaration

Requirement 25

/req/types-schemas/metadata

A

The "conformsTo" member of the JSON-FG root object SHALL include the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/types-schemas".

13.2. Feature type(s)

13.2.1. "featureType" is present

Requirement 26

/req/types-schemas/feature-type

A

If the JSON-FG root object is a feature, the feature SHALL have a member "featureType".

B

If the JSON-FG root object is a feature collection, either the feature collection SHALL have a member "featureType" or each feature SHALL have a member "featureType."

13.2.2. Value in "geometryDimension"

Requirement 27

/req/types-schemas/geometry-dimension

A

If the JSON-FG root object is a feature collection with a member "geometryDimension" that is not null, the geometry type of the primary geometry of each feature in the "place" member - or if "place" is null, in the "geometry" member - SHALL be consistent with the value (0: only points; 1: only curves; 2: only surfaces; 3: only solids or prisms).

13.2.3. Homogeneous feature collections

Recommendation 2

/rec/types-schemas/homogeneous-collection

A

If the JSON-FG root object is a feature collection and each feature is of the same feature type, the feature type information SHOULD be specified in the feature collection.

B

If the JSON-FG root object is a feature collection and the primary geometry of each feature has the same dimension, the feature collection SHOULD contain a member "geometryDimension."

13.3. Feature schema

13.3.1. Feature schemas conform to OGC API - Features - Part 5: Schemas

Requirement 28

/req/types-schemas/feature-schemas

A

If the JSON-FG root object is a feature or feature collection with a "featureSchema" member, all referenced schemas SHALL conform to OGC API - Features - Part 5: Schemas.

13.3.2. Single feature schema implies one feature type

Requirement 29

/req/types-schemas/single-feature-schema

A

If the JSON-FG root object is a feature or feature collection with a "featureSchema" member where the value is a string (URI), all "featureType" members in the JSON document SHALL have the same value.

14. Requirements Class "GeoJSON Profiles"

Requirements Class

http://www.opengis.net/spec/json-fg-1/1.0/req/profiles

Target type

GeoJSON documents

Conditional Dependency

RFC 7946: The GeoJSON Format

Conditional Dependency

Requirements Class "Core"

The Requirements Class "GeoJSON Profiles" adds provisions for three GeoJSON profiles.

14.1. Profile "RFC 7946"

Requirement 30

/req/profiles/rfc7946

Condition

A JSON document has a link to the profile "http://www.opengis.net/def/profile/OGC/0/rfc7946".

A

The JSON document SHALL be a GeoJSON feature, feature collection or geometry that conforms to RFC 7946 (The GeoJSON Format).

B

The JSON document SHALL not include a JSON-FG conformance class URI in a "conformsTo" member of the root object, if one is provided.

C

The JSON document SHALL not include a "place" member in any feature.

Permission 1

/per/profiles/rfc7946

Condition

A JSON document has a link to the profile "http://www.opengis.net/def/profile/OGC/0/rfc7946".

A

The JSON document MAY include coordinates in the "geometry" member that are not in WGS 84, if a prior arrangement exists (that is, by explicitly requesting the use of the coordinate reference system when generating the JSON document).

Creators of GeoJSON according to this profile may decide to also include the obsolete "crs" member. This supports the case if the geometry in "geometry" is not in WGS 84 longitude/latitude and the developer wants to support GeoJSON readers that already supported the now obsolete version. The obsolete "crs" member is a JSON object with two members: "type" and "properties". The "type" member has the value "name" and the "properties" member is a JSON object with one member, "name," which has the value of the CRS URI.

Example 19. A feature with the obsolete "crs" member.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
  "crs": {
    "type": "name",
    "properties": {
      "name": "urn:ogc:def:crs:EPSG::25832"
    }
  },
  "geometry": {
    "type": "Point",
    "coordinates": [ 358000, 5531000 ]
  },
  "properties": {
    "name": "Lieser"
  }
}

14.2. Profile "JSON-FG"

Requirement 31

/req/profiles/jsonfg

Condition

A JSON document has a link to the profile "http://www.opengis.net/def/profile/OGC/0/jsonfg".

A

The JSON document SHALL conform to the Requirements Class "Core".

14.3. Profile "JSON-FG with improved support for GeoJSON readers"

Requirement 32

/req/profiles/jsonfg-plus

Condition

A JSON document has a link to the profile "http://www.opengis.net/def/profile/OGC/0/jsonfg-plus".

A

The JSON document SHALL conform to the Requirements Class "Core".

B

If the feature has a non-null "place" member each feature in the JSON document SHALL include a non-null "geometry" member.

Recommendation 3

/rec/profiles/properties

A

If JSON-FG features are expected to be parsed by clients that only allow access to the JSON members in the GeoJSON Feature schema ("id," "geometry," "bbox," and "properties"), additional JSON-FG members in the Feature schema ("time," "place," "coordRefSys," "measures," and "featureType") SHOULD also be included in the "properties" object.

15. Requirements Class "JSON-FG in Web APIs"

Requirements Class

http://www.opengis.net/spec/json-fg-1/1.0/req/api

Target type

Web APIs

Dependency

OGC API - Features - Part 5: Schemas 1.0, Requirements Class "Profile Query Parameter"

Indirect Dependency

Requirements Class "GeoJSON Profiles"

The Requirements Class "JSON-FG in Web APIs" adds provisions for requesting specific GeoJSON profiles in Web APIs that support JSON-FG as a response media type.

Requirement 33

/req/api/profile-parameter

A

The Web API SHALL support the query parameter "profile" on GET/HEAD operations that support GeoJSON as a response media type.

B

The query parameter "profile" SHALL support at least the values "rfc7946" and "jsonfg."

Recommendation 4

/rec/api/profile-default

A

The query parameter "profile" SHOULD use "rfc7946" as the default GeoJSON profile.

16. Media Types

JSON-FG documents conform to GeoJSON. The media type is application/geo+json.

JSON-FG documents can be identified by the presence of the "conformsTo" member in the root object that identifies JSON-FG conformance classes that the document conforms to.

See also Requirements Class "GeoJSON Profiles" for the use of a link to a profile to identify the GeoJSON profile used in the particular representation.

Note
Earlier drafts of JSON-FG used the media types application/fg+json and application/vnd.ogc.fg+json. Implementations may continue to support these media types for backward compatibility. However, the media type application/geo+json is the preferred media type for JSON-FG documents conforming to this Standard.

Annex A: Abstract Test Suite (Normative)

This test suite uses the Given-When-Then notation to specify the tests.

The test suite is organized into sections that correspond to the requirements classes in the main body of the document. Each section contains a set of tests that validate the requirements specified in that requirements class.

A.1. Conformance Class "Core"

Conformance Class

http://www.opengis.net/spec/json-fg-1/1.0/conf/core

Target type

JSON-FG root objects

Requirements class

A.1.1. Conformance Test 1

Test id:

/conf/core/schema-valid

Requirements:

/req/core/schema-valid, /req/core/metadata, /req/core/instant, /req/core/interval A to C, /req/core/utc, /req/core/geometry-no-jsonfg-extension, /req/core/same-crs

Test purpose:

Validate the JSON-FG root object against the JSON Schema.

Test method:

Given:

  • The JSON-FG root object under test;

When:

  • the JSON object is validated against the schema "jsonfg-root-object.json" using a JSON Schema validator (the strictest validation level should be used);

Then:

  • assert that JSON object passes validation.

A.1.2. Conformance Test 2

Test id:

/conf/core/metadata-geometry-extension

Requirements:

/req/core/metadata D-F

Test purpose:

Assert that the "conformsTo" member declares all JSON-FG geometry extensions that are used.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

When:

  • collect all "place" values from any JSON-FG feature in the JSON-FG root object;

Then:

  • if any "place" value is of type "Polyhedron" or "MultiPolyhedron", assert that the "conformsTo" member of the JSON-FG root object includes the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/polyhedra";

  • if any "place" value is of type "Prism" or "MultiPrism", assert that the "conformsTo" member of the JSON-FG root object includes the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/prisms";

  • if any "place" value is of type "CircularString", "CompoundCurve", "CurvePolygon", "MultiCurve", or "MultiSurface", assert that the "conformsTo" member of the JSON-FG root object includes the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/circular-arcs";

A.1.3. Conformance Test 3

Test id:

/conf/core/metadata-measures

Requirements:

/req/core/metadata G

Test purpose:

Assert that the "conformsTo" member declares all JSON-FG extensions that are used.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

When:

  • determine, if any JSON-FG object in the JSON-FG root object includes a "measures" member;

Then:

  • if yes, assert that the "conformsTo" member of the JSON-FG root object includes the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/measures";

A.1.4. Conformance Test 4

Test id:

/conf/core/metadata-types-schemas

Requirements:

/req/core/metadata H

Test purpose:

Assert that the "conformsTo" member declares all JSON-FG geometry extensions that are used.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

When:

  • determine, if any JSON-FG object in the JSON-FG root object includes a "featureType" or "featureSchema" member;

Then:

  • if yes, assert that the "conformsTo" member of the JSON-FG root object includes the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/types-schemas";

A.1.5. Conformance Test 5

Test id:

/conf/core/interval-start-end

Requirements:

/req/core/interval D

Test purpose:

Assert that the start of an interval not after the end of the interval.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

When:

  • collect all intervals from any JSON-FG feature with a "time" member that includes an "interval" member with a "start" and "end" member that is not "..";

Then:

  • assert for all intervals that start is before or equal to end.

A.1.6. Conformance Test 6

Test id:

/conf/core/instant-and-interval-a

Requirements:

/req/core/instant-and-interval A

Test purpose:

Assert the consistency between multiple members in a "time" member.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

When:

  • collect all date/timestamp pairs from any JSON-FG feature with a "time" member that includes both a "date" and "timestamp" member;

Then:

  • assert that year, month and day are identical for each pair.

A.1.7. Conformance Test 7

Test id:

/conf/core/instant-and-interval-bc

Requirements:

/req/core/instant-and-interval B/C

Test purpose:

Assert the consistency between multiple members in a "time" member.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

When:

  • collect all date/timestamp pairs from any JSON-FG feature with a "time" member that includes both a "interval" and "timestamp" member;

Then:

  • if the interval has date granularity, assert that the day of the timestamp is included in the interval;

  • if the interval has timestamp granularity, assert that the timestamp is included in the interval.

A.1.8. Conformance Test 8

Test id:

/conf/core/instant-and-interval-de

Requirements:

/req/core/instant-and-interval D/E

Test purpose:

Assert the consistency between multiple members in a "time" member.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

When:

  • collect all date/timestamp pairs from any JSON-FG feature with a "time" member that includes both a "interval" and "date" member;

Then:

  • if the interval has date granularity, assert that the date is included in the interval;

  • if the interval has timestamp granularity, assert that the date is included in the interval or that the date is the start or end day of the interval.

A.1.9. Conformance Test 9

Test id:

/conf/core/coordinate-dimension-geometry

Requirements:

/req/core/coordinate-dimension A

Test purpose:

Assert that all positions in "geometry" members have the same number of coordinates.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

  • the JSON-FG root object is a JSON-FG feature or feature collection;

When:

  • collect the values of all "geometry" members (geometries) from all JSON-FG features in the JSON object;

  • collect all position arrays inside the geometries (lowest array level inside "coordinates" members);

Then:

  • assert that all position arrays have the same item count;

  • assert that the item count is at least 2.

A.1.10. Conformance Test 10

Test id:

/conf/core/coordinate-dimension-place

Requirements:

/req/core/coordinate-dimension B

Test purpose:

Assert that all positions in "place" members have the same number of coordinates.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

  • the JSON-FG root object is a JSON-FG feature or feature collection;

When:

  • collect the values of all "place" members (geometries) from all JSON-FG features in the JSON object;

  • collect all position arrays inside the geometries (lowest array level inside "coordinates" members);

Then:

  • assert that all position arrays have the same item count;

  • assert that the item count is at least 2.

A.1.11. Conformance Test 11

Test id:

/conf/core/geometry-wgs84

Requirements:

/req/core/geometry-wgs84

Test purpose:

Assert that all positions in "geometry" members are in WGS 84 longitude/latitude.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

  • the JSON-FG root object is a JSON-FG feature or feature collection;

When:

  • collect the values of all "geometry" members (geometries) from all JSON-FG features in the JSON object;

  • collect all position arrays inside the geometries (lowest array level inside "coordinates" members);

Then:

  • assert that the first value in each position array is between -180 and 180;

  • assert that the second value in each position array is between -90 and 90.

A.1.12. Conformance Test 12

Test id:

/conf/core/geometry-no-jsonfg-extension

Requirements:

/req/core/geometry-no-jsonfg-extension

Test purpose:

Assert that all "geometry" members do not include JSON-FG extensions.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

  • the JSON-FG root object is a JSON-FG feature or feature collection;

When:

  • collect the values of all "geometry" members (geometries) from all JSON-FG features in the JSON object;

Then:

  • assert that no geometry contains a "coordRefSys" or "measures" member.

A.1.13. Conformance Test 13

Test id:

/conf/core/valid-geometry

Requirements:

/req/core/valid-geometry

Test purpose:

Assert that Simple Feature geometries are valid.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

When:

  • collect all JSON-FG geometries, where "type" is one of "Point", "LineString", "Polygon", "MultiPoint", "MultiLineString", "MultiPolygon", or "GeometryCollection";

Then:

  • assert that each geometry is valid according to the Simple Feature specification.

Note
It is recommended to use a library that implements the Simple Feature specification to validate the geometries.

A.1.14. Conformance Test 14

Test id:

/conf/core/place-geometries

Requirements:

/req/core/place-geometries, /req/core/fallback

Test purpose:

Assert that the geometries in "place" members are not valid GeoJSON geometries.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

  • the JSON-FG root object is a JSON-FG feature or feature collection;

When:

  • collect the values of all "place" members (geometries) from all JSON-FG features in the JSON object, where "type" is one of "Point", "LineString", "Polygon", "MultiPoint", "MultiLineString", "MultiPolygon", or "GeometryCollection" and where the geometry does not include a "measures" member;

  • for each geometry, determine the CRS using the scoping rule in No point, line string or polygon geometry in WGS 84 longitude/latitude in "place";

Then:

  • assert that no geometry is in CRS "http://www.opengis.net/def/crs/OGC/0/CRS84" or "http://www.opengis.net/def/crs/OGC/0/CRS84h".

A.1.15. Conformance Test 15

Test id:

/conf/core/axis-order

Requirements:

/req/core/axis-order

Test purpose:

Assert that all geometries use the axis order specified in the CRS.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

When:

Then:

  • assert that the first two coordinates of each position array in each geometry are consistent with the value range of the first two axes of the CRS.

Note
"consistent with the value range" means that the first coordinate is in the range of the first axis and the second coordinate is in the range of the second axis. As indicated by /rec/core/place-crs, the range should not be used strictly, but should include a buffer in case of a projected CRS.

A.2. Conformance Class "Polyhedra"

Conformance Class

http://www.opengis.net/spec/json-fg-1/1.0/conf/polyhedra

Target type

JSON-FG root objects

Requirements class

Dependency

Condition

The "conformsTo" member of the JSON object include the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/polyhedra".

A.2.1. Conformance Test 16

Test id:

/conf/polyhedra/coordinates

Requirements:

/req/polyhedra/coordinates

Test purpose:

Assert that the number of coordinates is consistent with the CRS.

Test method:

Given:

When:

  • collect all JSON-FG geometries with "type" set to "Polyhedron" or "MultiPolyhedron";

  • collect all position arrays inside the geometries (lowest array level inside "coordinates" members);

  • check for each geometry the CRS (see [determine-crs]);

  • the CRS definition for each CRS is available;

  • check for each geometry whether m coordinates are included by checking for a "measures" member with "enabled" set to true (see [determine-m]);

Then:

  • assert that all position arrays have 3 items if no m coordinates are included and 4 items if m coordinates are included;

  • assert that each CRS is a 3D CRS or an ad-hoc compound CRS consisting of a horizontal 2D CRS and a vertical CRS;

A.2.2. Conformance Test 17

Test id:

/conf/polyhedra/valid-geometry

Requirements:

/req/polyhedra/valid-geometry

Test purpose:

Assert that polyhedron geometries are valid.

Test method:

Given:

When:

  • collect all JSON-FG geometries with "type" set to "Polyhedron" or "MultiPolyhedron";

Then:

  • assert that all conditions for a valid polyhedron geometry stated in the requirement are met.

Note
It is recommended to use a library that implements polyhedron geometries to perform geometrical and topological validation.

A.3. Conformance Class "Prisms"

Conformance Class

http://www.opengis.net/spec/json-fg-1/1.0/conf/prisms

Target type

JSON-FG root objects

Requirements class

Dependency

Condition

The "conformsTo" member of the JSON object include the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/prisms".

A.3.1. Conformance Test 18

Test id:

/conf/prisms/coordinates

Requirements:

/req/prisms/coordinates

Test purpose:

Assert that the number of coordinates is consistent with the CRS.

Test method:

Given:

When:

  • collect all JSON-FG geometries with "type" set to "Prism" or "MultiPrism";

  • collect all position arrays inside the "base" geometries (lowest array level inside "coordinates" members);

  • collect all "lower" and "upper" values;

  • check for each geometry the CRS (see [determine-crs]);

  • the CRS definition for each CRS is available;

  • check for each geometry whether m coordinates are included by checking for a "measures" member with "enabled" set to true (see [determine-m]);

Then:

  • assert that all position arrays have 2 items if no m coordinates are included and 3 items if m coordinates are included;

  • assert that each CRS is a 3D CRS or an ad-hoc compound CRS consisting of a horizontal 2D CRS and a vertical CRS;

  • assert that the "lower" and "upper" values are in the valid range for the third coordinate axis of the CRS;

  • assert that the "lower" value is equal or smaller than the "upper" value.

A.4. Conformance Class "Circular Arcs"

Conformance Class

http://www.opengis.net/spec/json-fg-1/1.0/conf/circular-arcs

Target type

JSON-FG root objects

Requirements class

Dependency

Condition

The "conformsTo" member of the JSON object include the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/circular-arcs".

A.4.1. Conformance Test 19

Test id:

/conf/circular-arcs/valid-geometry-circular-string

Requirements:

/req/circular-arcs/valid-geometry A

Test purpose:

assert that circular string geometries are valid.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

When:

  • collect all JSON-FG geometries with "type" set to "CircularString";

Then:

  • assert that the first, second and third position of each circular arc are all different;

  • assert that the first, second and third position of each circular arc are not collinear.

A.4.2. Conformance Test 20

Test id:

/conf/circular-arcs/valid-geometry-compound-curve

Requirements:

/req/circular-arcs/valid-geometry B

Test purpose:

assert that compound curve geometries are valid.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

When:

  • collect all JSON-FG geometries with "type" set to "CompoundCurve";

Then:

  • assert that - starting with the second item in "geometries", the first position of each item is identical to the last position of the previous item.

A.4.3. Conformance Test 21

Test id:

/conf/circular-arcs/valid-geometry-curve-polygon

Requirements:

/req/circular-arcs/valid-geometry B

Test purpose:

assert that curve polygon geometries are valid.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

When:

  • collect all JSON-FG geometries with "type" set to "CurvePolygon;"

Then:

  • assert that for each item in "geometries", the first position is identical to the last position.

A.5. Conformance Class "Measures"

Conformance Class

http://www.opengis.net/spec/json-fg-1/1.0/conf/measures

Target type

JSON-FG root objects

Requirements class

Dependency

Condition

The "conformsTo" member of the JSON object include the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/measures".

A.5.1. Conformance Test 22

Test id:

/conf/measures/coordinates

Requirements:

/req/measures/coordinates

Test purpose:

Assert that the number of coordinates is consistent with the measure declaration.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

When:

  • collect all JSON-FG geometries;

  • collect all position arrays inside the geometries (lowest array level inside "coordinates" members);

  • check for each geometry the CRS (see [determine-crs]);

  • the CRS definition for each CRS is available;

  • check for each geometry whether m coordinates are included by checking for a "measures" member with "enabled" set to true (see [determine-m]);

Then:

  • assert that all positions in JSON-FG geometries with m coordinates have either 3 coordinates (in case of a 2D CRS) or four coordinates (in case of a 3D CRS).

A.6. Conformance Class "Feature Types and Schemas"

Conformance Class

http://www.opengis.net/spec/json-fg-1/1.0/conf/types-schemas

Target type

JSON-FG root objects

Requirements class

Dependency

Condition

The "conformsTo" member of the JSON object include the value "http://www.opengis.net/spec/json-fg-1/1.0/conf/types-schemas".

A.6.1. Conformance Test 23

Test id:

/conf/types-schemas/feature-type-1

Requirements:

/req/types-schemas/feature-type A

Test purpose:

assert that the feature type is declared for each feature.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

  • the JSON-FG root object is a JSON-FG feature;

Then:

  • assert that the feature includes a "featureType" member.

A.6.2. Conformance Test 24

Test id:

/conf/types-schemas/feature-type-2

Requirements:

/req/types-schemas/feature-type B

Test purpose:

assert that the feature type is declared for each feature.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

  • the JSON-FG root object is a JSON-FG feature collection;

Then:

  • assert that either the feature collection includes a "featureType" member or that each feature includes "featureType" member.

A.6.3. Conformance Test 25

Test id:

/conf/types-schemas/geometry-dimension

Requirements:

/req/types-schemas/geometry-dimension

Test purpose:

Assert that the geometry types are consistent with the "geometryDimension" value.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

  • the JSON-FG root object is a JSON-FG feature collection;

  • the member "geometryDimension" is provided and not null;

When:

  • collect the type of the primary geometry of all JSON-FG features in the feature collection (the primary geometry is the value of the "place" member or if "place" is not provided or null, the value of the "geometry" member);

Then:

  • assert that the geometry types are consistent with the "geometryDimension" value

    • 0: no geometry is of type "LineString", "MultiLineString", "CircularString", "CompoundCurve", "MultiCurve", "Polygon", "MultiPolygon", "CurvePolygon", "MultiSurface", "Polyhedron", "MultiPolyhedron", "Prism" or "MultiPrism;"

    • 1: no geometry is of type "Point", "MultiPoint", "Polygon", "MultiPolygon", "CurvePolygon", "MultiSurface", "Polyhedron", "MultiPolyhedron", "Prism" or "MultiPrism;"

    • 2: no geometry is of type "Point", "MultiPoint", "LineString", "MultiLineString", "CircularString", "CompoundCurve", "MultiCurve", "Polyhedron", "MultiPolyhedron", "Prism" or "MultiPrism;"

    • 3: no geometry is of type "Point", "MultiPoint", "LineString", "MultiLineString", "CircularString", "CompoundCurve", "MultiCurve", "Polygon", "MultiPolygon", "CurvePolygon", or "MultiSurface."

A.6.4. Conformance Test 26

Test id:

/conf/types-schemas/feature-schemas

Requirements:

/req/types-schemas/feature-schemas

Test purpose:

Assert that all feature schemas are valid.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

  • the JSON-FG root object is a JSON-FG feature or feature collection;

When:

  • collect all schemas referenced from "featureSchema" members;

Then:

Note
This test requires that a test suite for OGC API - Features - Part 5: Schemas is available.

A.6.5. Conformance Test 27

Test id:

/conf/types-schemas/single-feature-schema

Requirements:

/req/types-schemas/single-feature-schema

Test purpose:

Assert that all features of of the same type.

Test method:

Given:

  • The JSON-FG root object under test;

  • the JSON-FG root object has passed the conformance test /conf/core/schema-valid;

  • the JSON-FG root object is a JSON-FG feature or feature collection;

  • the JSON-FG root object has a "featureSchema" member with a value that is a string;

When:

  • collect all "featureType" members;

Then:

  • assert that all "featureType" members in the JSON document have the same value.

A.7. Conformance Class "GeoJSON Profiles"

Conformance Class

http://www.opengis.net/spec/json-fg-1/1.0/conf/profiles

Target type

GeoJSON documents

Requirements class

A.7.1. Conformance Test 28

Test id:

/conf/profiles/rfc7946

Requirements:

/req/profiles/rfc7946

Test purpose:

Assert that the GeoJSON document is GeoJSON without JSON-FG extensions.

Test method:

Given:

  • The GeoJSON document under test has a link to "http://www.opengis.net/def/profile/OGC/0/rfc7946" with link relation type "profile" (the link is either represented in a "Link" header, if the GeoJSON document has been fetched via HTTP, or in a link object in the array of a "links" member of the GeoJSON document);

Then:

  • assert that the GeoJSON document is a GeoJSON feature, feature collection or geometry that conforms to RFC 7946 (The GeoJSON Format);

  • assert that the GeoJSON document does not include a JSON-FG conformance class URI in a "conformsTo" member of the root object, if one is provided;

  • assert that no GeoJSON feature includes a "place" member.

A.7.2. Conformance Test 29

Test id:

/conf/profiles/json-fg

Requirements:

/req/profiles/jsonfg

Test purpose:

Assert that the GeoJSON document is a JSON-FG document.

Test method:

Given:

  • The GeoJSON document under test has a link to "http://www.opengis.net/def/profile/OGC/0/jsonfg" with link relation type "profile" (the link is either represented in a "Link" header, if the GeoJSON document has been fetched via HTTP, or in a link object in the array of a "links" member of the GeoJSON document);

Then:

A.7.3. Conformance Test 30

Test id:

/conf/profiles/jsonfg-plus

Requirements:

/req/profiles/jsonfg-plus

Test purpose:

Assert that the GeoJSON document is a JSON-FG document with improved support for GeoJSON readers.

Test method:

Given:

  • The GeoJSON document under test has a link to "http://www.opengis.net/def/profile/OGC/0/jsonfg-plus" with link relation type "profile" (the link is either represented in a "Link" header, if the GeoJSON document has been fetched via HTTP, or in a link object in the array of a "links" member of the GeoJSON document);

When:

  • collect all JSON-FG features;

Then:

  • assert that each JSON-FG feature in the GeoJSON document has a "geometry" member that is not null, if the feature has a "place" member that is not null;

A.8. Conformance Class "JSON-FG in Web APIs"

Conformance Class

http://www.opengis.net/spec/json-fg-1/1.0/conf/api

Target type

Web APIs

Requirements class

A.8.1. Conformance Test 31

Test id:

/conf/api/profile-parameter-rfc7946

Requirements:

/req/api/profile-parameter

Test purpose:

Assert that the Web API supports the "profile" query parameter.

Test method:

Given:

  • The Web API under test;

  • a URI to request a GeoJSON document;

When:

  • the URI is requested with a query parameter "profile" set to "rfc7946" and the "Accept" header set to "application/geo+json";

Then:

  • assert the response has a "Content-Type" header with the value "application/geo+json";

  • assert the response has a "Link" header with a link to "http://www.opengis.net/def/profile/OGC/0/rfc7946" with link relation type "profile";

  • assert that the response payload passes conformance test /conf/profiles/rfc7946.

A.8.2. Conformance Test 32

Test id:

/conf/api/profile-parameter-jsonfg

Requirements:

/req/api/profile-parameter

Test purpose:

Assert that the Web API supports the "profile" query parameter.

Test method:

Given:

  • The Web API under test;

  • a URI to request a GeoJSON document;

When:

  • the URI is requested with a query parameter "profile" set to "jsonfg" and the "Accept" header set to "application/geo+json";

Then:

  • assert the response has a "Content-Type" header with the value "application/geo+json";

  • assert the response has a "Link" header with a link to "http://www.opengis.net/def/profile/OGC/0/jsonfg" with link relation type "profile";

  • assert that the response payload passes conformance test /conf/profiles/jsonfg.

Annex B: Schemas (Normative)

B.1. JSON Schema of a JSON-FG root object

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schemas.opengis.net/json-fg/jsonfg-root-object.json",
  "title": "a JSON-FG root object",
  "description": "A JSON-FG root object is a JSON-FG object that is not a direct child of another JSON-FG object. This JSON Schema is part of JSON-FG version 1.0.0.",
  "allOf": [
    {"$ref": "jsonfg-object.json"},
    {
      "type": "object",
      "required": ["conformsTo"],
      "properties": { "conformsTo": {"$ref": "conformsto.json"} }
    }
  ]
}

B.2. JSON Schema of a JSON-FG feature collection

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schemas.opengis.net/json-fg/featurecollection.json",
  "title": "a JSON-FG Feature Collection",
  "description": "This JSON Schema is part of JSON-FG version 1.0.0.",
  "type": "object",
  "required": ["type", "features"],
  "properties": {
    "type": {"const": "FeatureCollection"},
    "featureType": {"$ref": "featuretype.json"},
    "geometryDimension": {"type": "integer", "minimum": 0, "maximum": 3},
    "featureSchema": {"$ref": "featureschema.json"},
    "coordRefSys": {"$ref": "coordrefsys.json"},
    "measures": {"$ref": "measures.json"},
    "features": {
      "type": "array",
      "items": {
        "allOf": [
          {"$ref": "feature.json"},
          {
            "not": {
              "type": "object",
              "properties": {"coordRefSys": {}},
              "required": ["coordRefSys"]
            }
          },
          {
            "not": {
              "type": "object",
              "properties": {"conformsTo": {}},
              "required": ["conformsTo"]
            }
          }
        ]
      }
    }
  }
}

B.3. JSON Schema of a JSON-FG feature

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "https://schemas.opengis.net/json-fg/feature.json",
    "title": "a JSON-FG Feature",
    "description": "This JSON Schema is part of JSON-FG version 1.0.0.",
    "type": "object",
    "required": ["type", "geometry", "properties"],
    "properties": {
        "type": {"const": "Feature"},
        "id": {"oneOf": [{"type": "number"}, {"type": "string"}]},
        "featureType": {"$ref": "featuretype.json"},
        "featureSchema": {"$ref": "featureschema.json"},
        "time": {"$ref": "time.json"},
        "coordRefSys": {"$ref": "coordrefsys.json"},
        "measures": {"$ref": "measures.json"},
        "place": {
            "allOf": [
                {"$ref": "place.json"},
                {"not": {"type": "object", "properties": {"coordRefSys": {}}, "required": ["coordRefSys"]}},
                {"not": {"type": "object", "properties": {"measures": {}}, "required": ["measures"]}},
                {"not": {"type": "object", "properties": {"conformsTo": {}}, "required": ["conformsTo"]}}
            ]
        },
        "geometry": {"allOf": [{"$ref": "geometry.json"}, {"not": {"type": "object", "properties": {"conformsTo": {}}, "required": ["conformsTo"]}}]},
        "properties": {"oneOf": [{"type": "null"}, {"type": "object"}]}
    }
}

B.4. JSON Schema of a JSON-FG geometry

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schemas.opengis.net/json-fg/geometry-object.json",
  "title": "a JSON-FG geometry",
  "description": "This JSON Schema is part of JSON-FG version 1.0.0.",
  "oneOf": [
    {"$ref": "#/$defs/Point"             },
    {"$ref": "#/$defs/MultiPoint"        },
    {"$ref": "#/$defs/LineString"        },
    {"$ref": "#/$defs/MultiLineString"   },
    {"$ref": "#/$defs/Polygon"           },
    {"$ref": "#/$defs/MultiPolygon"      },
    {"$ref": "#/$defs/GeometryCollection"},
    {"$ref": "#/$defs/Polyhedron"        },
    {"$ref": "#/$defs/MultiPolyhedron"   },
    {"$ref": "#/$defs/Prism"             },
    {"$ref": "#/$defs/MultiPrism"        },
    {"$ref": "#/$defs/CircularString"    },
    {"$ref": "#/$defs/CompoundCurve"     },
    {"$ref": "#/$defs/CurvePolygon"      },
    {"$ref": "#/$defs/MultiCurve"        },
    {"$ref": "#/$defs/MultiSurface"      },
    {"$ref": "#/$defs/CustomGeometry"    }
  ],
  "$defs": {
    "CustomGeometry": {
      "title": "A custom geometry",
      "description": "A custom geometry object type that is not one of the standard GeoJSON geometry types or one of the JSON-FG extensions. It is defined as an object with a \"type\" member that is not one of the GeoJSON or JSON-FG types. This is a mechanism to keep the schema extensible so that validation will also validate JSON-FG root objects with new geometry types that are not (yet) standardized. Readers of JSON-FG root objects that encouter an unknown geometry type should ignore it and treat it as if the value would be 'null'.",
      "type": "object",
      "required": ["type"],
      "properties": {
        "type": {
          "type": "string",
          "not": {
            "enum": [
              "Feature",            "FeatureCollection",  "Point",
              "MultiPoint",         "LineString",         "MultiLineString",
              "Polygon",            "MultiPolygon",       "Polyhedron",
              "MultiPolyhedron",    "Prism",              "MultiPrism",
              "CircularString",     "CompoundCurve",      "CurvePolygon",
              "MultiCurve",         "MultiSurface",       "GeometryCollection"
            ]
          }
        }
      }
    },
    "CustomCurve": {
      "title": "A custom curve object",
      "description": "A custom curve object type that is not one of the standard GeoJSON curve types or one of the JSON-FG extensions. It is defined as an object with a \"type\" member that is not one of the GeoJSON or JSON-FG types. This is a mechanism to keep the schema extensible so that validation will also validate JSON-FG root objects with new geometry types that are not (yet) standardized. Readers of JSON-FG root objects that encouter an unknown curve type should ignore it and treat it as if the value would be 'null'.",
      "type": "object",
      "required": ["type"],
      "properties": {
        "type": {
          "type": "string",
          "not": { "enum": ["LineString", "CircularString", "CompoundCurve"] }
        }
      }
    },
    "CustomSurface": {
      "title": "A custom surface object",
      "description": "A custom surface object type that is not one of the standard GeoJSON surface types or one of the JSON-FG extensions. It is defined as an object with a \"type\" member that is not one of the GeoJSON or JSON-FG types. This is a mechanism to keep the schema extensible so that validation will also validate JSON-FG root objects with new geometry types that are not (yet) standardized. Readers of JSON-FG root objects that encouter an unknown surface type should ignore it and treat it as if the value would be 'null'.",
      "type": "object",
      "required": ["type"],
      "properties": {
        "type": {
          "type": "string",
          "not": { "enum": ["Polygon", "CurvePolygon"] }
        }
      }
    },
    "Point": {
      "title": "GeoJSON Point with additional 'coordRefSys' and 'measures' members",
      "type": "object",
      "required": ["type", "coordinates"],
      "properties": {
        "type"       : {"const": "Point"                            },
        "coordRefSys": {                  "$ref": "coordrefsys.json"},
        "measures"   : {                  "$ref": "measures.json"   },
        "coordinates": {                  "$ref": "#/$defs/position"},
        "bbox"       : {                  "$ref": "#/$defs/bbox"    }
      }
    },
    "LineString": {
      "title": "GeoJSON LineString with additional 'coordRefSys' and 'measures' members",
      "type": "object",
      "required": ["type", "coordinates"],
      "properties": {
        "type": {"const": "LineString"},
        "coordRefSys": {"$ref": "coordrefsys.json"},
        "measures": {"$ref": "measures.json"},
        "coordinates": {
          "type": "array",
          "minItems": 2,
          "items": {"$ref": "#/$defs/position"}
        },
        "bbox": {"$ref": "#/$defs/bbox"}
      }
    },
    "Polygon": {
      "title": "GeoJSON Polygon with additional 'coordRefSys' and 'measures' members",
      "type": "object",
      "required": ["type", "coordinates"],
      "properties": {
        "type": {"const": "Polygon"},
        "coordRefSys": {"$ref": "coordrefsys.json"},
        "measures": {"$ref": "measures.json"},
        "coordinates": {
          "type": "array",
          "items": {
            "type": "array",
            "minItems": 4,
            "items": {"$ref": "#/$defs/position"}
          }
        },
        "bbox": {"$ref": "#/$defs/bbox"}
      }
    },
    "MultiPoint": {
      "title": "GeoJSON MultiPoint with additional 'coordRefSys' and 'measures' members",
      "type": "object",
      "required": ["type", "coordinates"],
      "properties": {
        "type": {"const": "MultiPoint"},
        "coordRefSys": {"$ref": "coordrefsys.json"},
        "measures": {"$ref": "measures.json"},
        "coordinates": {
          "type": "array",
          "items": {"$ref": "#/$defs/position"}
        },
        "bbox": {"$ref": "#/$defs/bbox"}
      }
    },
    "MultiLineString": {
      "title": "GeoJSON MultiLineString with additional 'coordRefSys' and 'measures' members",
      "type": "object",
      "required": ["type", "coordinates"],
      "properties": {
        "type": {"const": "MultiLineString"},
        "coordRefSys": {"$ref": "coordrefsys.json"},
        "measures": {"$ref": "measures.json"},
        "coordinates": {
          "type": "array",
          "items": {
            "type": "array",
            "minItems": 2,
            "items": {"$ref": "#/$defs/position"}
          }
        },
        "bbox": {"$ref": "#/$defs/bbox"}
      }
    },
    "MultiPolygon": {
      "title": "GeoJSON MultiPolygon with additional 'coordRefSys' and 'measures' members",
      "type": "object",
      "required": ["type", "coordinates"],
      "properties": {
        "type": {"const": "MultiPolygon"},
        "coordRefSys": {"$ref": "coordrefsys.json"},
        "measures": {"$ref": "measures.json"},
        "coordinates": {
          "type": "array",
          "items": {
            "type": "array",
            "items": {
              "type": "array",
              "minItems": 4,
              "items": {"$ref": "#/$defs/position"}
            }
          }
        },
        "bbox": {"$ref": "#/$defs/bbox"}
      }
    },
    "GeometryCollection": {
      "title": "GeoJSON GeometryCollection with additional 'coordRefSys' and 'measures' members",
      "type": "object",
      "required": ["type", "geometries"],
      "properties": {
        "type": {"const": "GeometryCollection"},
        "coordRefSys": {"$ref": "coordrefsys.json"},
        "measures": {"$ref": "measures.json"},
        "geometries": {
          "type": "array",
          "items": {
            "allOf": [
              {
                "oneOf": [
                  {"$ref": "#/$defs/Point"          },
                  {"$ref": "#/$defs/MultiPoint"     },
                  {"$ref": "#/$defs/LineString"     },
                  {"$ref": "#/$defs/MultiLineString"},
                  {"$ref": "#/$defs/Polygon"        },
                  {"$ref": "#/$defs/MultiPolygon"   }
                ]
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"coordRefSys": {}},
                  "required": ["coordRefSys"]
                }
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"measures": {}},
                  "required": ["measures"]
                }
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"conformsTo": {}},
                  "required": ["conformsTo"]
                }
              }
            ]
          }
        },
        "bbox": {"$ref": "#/$defs/bbox"}
      }
    },
    "Polyhedron": {
      "title": "JSON-FG Polyhedron",
      "type": "object",
      "required": ["type", "coordinates"],
      "properties": {
        "type": {"const": "Polyhedron"},
        "coordRefSys": {"$ref": "coordrefsys.json"},
        "measures": {"$ref": "measures.json"},
        "coordinates": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "array",
                "minItems": 4,
                "items": {"$ref": "#/$defs/position3d"}
              }
            }
          }
        },
        "bbox": {"$ref": "#/$defs/bbox3d"}
      }
    },
    "MultiPolyhedron": {
      "title": "JSON-FG MultiPolyhedron",
      "type": "object",
      "required": ["type", "coordinates"],
      "properties": {
        "type": {"const": "MultiPolyhedron"},
        "coordRefSys": {"$ref": "coordrefsys.json"},
        "measures": {"$ref": "measures.json"},
        "coordinates": {
          "type": "array",
          "items": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "array",
                "minItems": 1,
                "items": {
                  "type": "array",
                  "minItems": 4,
                  "items": {"$ref": "#/$defs/position3d"}
                }
              }
            }
          }
        },
        "bbox": {"$ref": "#/$defs/bbox3d"}
      }
    },
    "Prism": {
      "title": "JSON-FG Prism",
      "type": "object",
      "required": ["type", "base", "upper"],
      "properties": {
        "type": {"const": "Prism"},
        "coordRefSys": {"$ref": "coordrefsys.json"},
        "measures": {"$ref": "measures.json"},
        "base": {
          "allOf": [
            {
              "oneOf": [
                {"$ref": "#/$defs/Point"          },
                {"$ref": "#/$defs/MultiPoint"     },
                {"$ref": "#/$defs/LineString"     },
                {"$ref": "#/$defs/MultiLineString"},
                {"$ref": "#/$defs/Polygon"        },
                {"$ref": "#/$defs/MultiPolygon"   }
              ]
            },
            {
              "not": {
                "type": "object",
                "properties": {"coordRefSys": {}},
                "required": ["coordRefSys"]
              }
            },
            {
              "not": {
                "type": "object",
                "properties": {"measures": {}},
                "required": ["measures"]
              }
            },
            {
              "not": {
                "type": "object",
                "properties": {"conformsTo": {}},
                "required": ["conformsTo"]
              }
            }
          ]
        },
        "lower": {"type": "number"},
        "upper": {"type": "number"},
        "bbox": {"$ref": "#/$defs/bbox3d"}
      }
    },
    "MultiPrism": {
      "title": "JSON-FG Multi-Prism",
      "type": "object",
      "required": ["type", "prisms"],
      "properties": {
        "type": {"const": "MultiPrism"},
        "coordRefSys": {"$ref": "coordrefsys.json"},
        "measures": {"$ref": "measures.json"},
        "prisms": {
          "type": "array",
          "items": {
            "allOf": [
              {"$ref": "#/$defs/Prism"},
              {
                "not": {
                  "type": "object",
                  "properties": {"coordRefSys": {}},
                  "required": ["coordRefSys"]
                }
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"measures": {}},
                  "required": ["measures"]
                }
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"conformsTo": {}},
                  "required": ["conformsTo"]
                }
              }
            ]
          }
        },
        "bbox": {"$ref": "#/$defs/bbox3d"}
      }
    },
    "CircularString": {
      "title": "JSON-FG CircularString",
      "type": "object",
      "required": ["type", "coordinates"],
      "properties": {
        "type": {"const": "CircularString"},
        "coordRefSys": {"$ref": "coordrefsys.json"},
        "measures": {"$ref": "measures.json"},
        "coordinates": {
          "type": "array",
          "oneOf": [
            {"minItems":  3, "maxItems":  3},
            {"minItems":  5, "maxItems":  5},
            {"minItems":  7, "maxItems":  7},
            {"minItems":  9, "maxItems":  9},
            {"minItems": 11, "maxItems": 11}
          ],
          "items": {"$ref": "#/$defs/position"}
        },
        "bbox": {"$ref": "#/$defs/bbox"}
      }
    },
    "CompoundCurve": {
      "title": "JSON-FG CompoundCurve",
      "type": "object",
      "required": ["type", "geometries"],
      "properties": {
        "type": {"const": "CompoundCurve"},
        "coordRefSys": {"$ref": "coordrefsys.json"},
        "measures": {"$ref": "measures.json"},
        "geometries": {
          "type": "array",
          "minItems": 1,
          "items": {
            "allOf": [
              {
                "oneOf": [
                  {"$ref": "#/$defs/LineString"    },
                  {"$ref": "#/$defs/CircularString"},
                  {"$ref": "#/$defs/CustomCurve"   }
                ]
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"coordRefSys": {}},
                  "required": ["coordRefSys"]
                }
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"measures": {}},
                  "required": ["measures"]
                }
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"conformsTo": {}},
                  "required": ["conformsTo"]
                }
              }
            ]
          }
        },
        "bbox": {"$ref": "#/$defs/bbox"}
      }
    },
    "CurvePolygon": {
      "title": "JSON-FG CurvePolygon",
      "type": "object",
      "required": ["type", "geometries"],
      "properties": {
        "type": {"const": "CurvePolygon"},
        "coordRefSys": {"$ref": "coordrefsys.json"},
        "measures": {"$ref": "measures.json"},
        "geometries": {
          "type": "array",
          "minItems": 1,
          "items": {
            "allOf": [
              {
                "oneOf": [
                  {"$ref": "#/$defs/CompoundCurve" },
                  {"$ref": "#/$defs/LineString"    },
                  {"$ref": "#/$defs/CircularString"},
                  {"$ref": "#/$defs/CustomCurve"   }
                ]
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"coordRefSys": {}},
                  "required": ["coordRefSys"]
                }
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"measures": {}},
                  "required": ["measures"]
                }
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"conformsTo": {}},
                  "required": ["conformsTo"]
                }
              }
            ]
          }
        },
        "bbox": {"$ref": "#/$defs/bbox"}
      }
    },
    "MultiCurve": {
      "title": "JSON-FG MultiCurve",
      "type": "object",
      "required": ["type", "geometries"],
      "properties": {
        "type": {"const": "MultiCurve"},
        "coordRefSys": {"$ref": "coordrefsys.json"},
        "measures": {"$ref": "measures.json"},
        "geometries": {
          "type": "array",
          "minItems": 1,
          "items": {
            "allOf": [
              {
                "oneOf": [
                  {"$ref": "#/$defs/CompoundCurve" },
                  {"$ref": "#/$defs/LineString"    },
                  {"$ref": "#/$defs/CircularString"},
                  {"$ref": "#/$defs/CustomCurve"   }
                ]
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"coordRefSys": {}},
                  "required": ["coordRefSys"]
                }
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"measures": {}},
                  "required": ["measures"]
                }
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"conformsTo": {}},
                  "required": ["conformsTo"]
                }
              }
            ]
          }
        },
        "bbox": {"$ref": "#/$defs/bbox"}
      }
    },
    "MultiSurface": {
      "title": "JSON-FG MultiSurface",
      "type": "object",
      "required": ["type", "geometries"],
      "properties": {
        "type": {"const": "MultiSurface"},
        "coordRefSys": {"$ref": "coordrefsys.json"},
        "measures": {"$ref": "measures.json"},
        "geometries": {
          "type": "array",
          "minItems": 1,
          "items": {
            "allOf": [
              {
                "oneOf": [
                  {"$ref": "#/$defs/CurvePolygon" },
                  {"$ref": "#/$defs/Polygon"      },
                  {"$ref": "#/$defs/CustomSurface"}
                ]
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"coordRefSys": {}},
                  "required": ["coordRefSys"]
                }
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"measures": {}},
                  "required": ["measures"]
                }
              },
              {
                "not": {
                  "type": "object",
                  "properties": {"conformsTo": {}},
                  "required": ["conformsTo"]
                }
              }
            ]
          }
        },
        "bbox": {"$ref": "#/$defs/bbox"}
      }
    },
    "position": {
      "type": "array",
      "minItems": 2,
      "maxItems": 4,
      "items": {"type": "number"}
    },
    "position3d": {
      "type": "array",
      "minItems": 3,
      "maxItems": 4,
      "items": {"type": "number"}
    },
    "bbox": {
      "oneOf": [ {"$ref": "#/$defs/bbox2d"}, {"$ref": "#/$defs/bbox3d"} ]
    },
    "bbox2d": {
      "type": "array",
      "minItems": 4,
      "maxItems": 4,
      "items": {"type": "number"}
    },
    "bbox3d": {
      "type": "array",
      "minItems": 6,
      "maxItems": 6,
      "items": {"type": "number"}
    }
  }
}

B.5. JSON Schema of the "conformsTo" member

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schemas.opengis.net/json-fg/conformsto.json",
  "title": "the value of the 'conformsTo' member",
  "description": "This JSON Schema is part of JSON-FG version 1.0.0.",
  "type": "array",
  "minItems": 1,
  "items": {"type": "string", "format": "uri"},
  "contains": {"const": "http://www.opengis.net/spec/json-fg-1/1.0/conf/core"},
  "uniqueItems": true
}

B.6. JSON Schema of the "time" member

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "https://schemas.opengis.net/json-fg/time.json",
    "title": "the value of the 'time' member",
    "description": "This JSON Schema is part of JSON-FG version 1.0.0.",
    "oneOf": [
        {"type": "null"},
        {
            "type": "object",
            "minProperties": 1,
            "properties": {
                "date": {"$ref": "#/$defs/date"     },
                "timestamp": {"$ref": "#/$defs/timestamp"},
                "interval": {"$ref": "#/$defs/interval" }
            }
        }
    ],
    "$defs": {
        "date": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$"},
        "timestamp": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$"},
        "interval": {
            "type": "array",
            "minItems": 2,
            "maxItems": 2,
            "items": {
                "anyOf": [
                    {
                        "oneOf": [ {"$ref": "#/$defs/date"}, {"type": "string", "const": ".."} ]
                    },
                    {
                        "oneOf": [ {"$ref": "#/$defs/timestamp"}, {"type": "string", "const": ".."} ]
                    }
                ]
            }
        }
    }
}

B.7. JSON Schema of the "place" member

1
2
3
4
5
6
7
{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "https://schemas.opengis.net/json-fg/place.json",
    "title": "the value of the 'place' member",
    "description": "This JSON Schema is part of JSON-FG version 1.0.0.",
    "oneOf": [ {"type": "null"}, {"$ref": "geometry-object.json"} ]
}

B.8. JSON Schema of the "coordRefSys" member

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schemas.opengis.net/json-fg/coordrefsys.json",
  "title": "the value of the 'coordRefSys' member",
  "description": "This JSON Schema is part of JSON-FG version 1.0.0.",
  "oneOf": [
    {"$ref": "#/$defs/single-refsys"},
    {
      "type": "array",
      "items": {"$ref": "#/$defs/single-refsys"},
      "minItems": 2
    }
  ],
  "$defs": {
    "single-refsys": {
      "oneOf": [
        {"$ref": "#/$defs/refsys-simpleref"},
        {"$ref": "#/$defs/refsys-byref"    },
        {"$ref": "#/$defs/refsys-custom"   }
      ]
    },
    "refsys-simpleref": {"type": "string", "format": "uri-reference"},
    "refsys-byref": {
      "type": "object",
      "required": ["type", "href"],
      "properties": {
        "type" : {"type": "string", "const": "Reference"}     ,
        "href" : {"type": "string", "format": "uri-reference"},
        "epoch": {"type": "number"}
      }
    },
    "refsys-custom": {
      "type": "object",
      "required": ["type"],
      "properties": {
        "type": { "type": "string", "not": {"const": "Reference"} }
      }
    }
  }
}

B.9. JSON Schema of the "measures" member

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schemas.opengis.net/json-fg/measures.json",
  "title": "the value of the 'measures' member",
  "description": "This JSON Schema is part of JSON-FG version 1.0.0.",
  "type": "object",
  "properties": {
    "enabled"    : {"type": "boolean"},
    "unit"       : {"type": "string" },
    "description": {"type": "string" }
  },
  "required": ["enabled"]
}

B.10. JSON Schema of the "geometry" member

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schemas.opengis.net/json-fg/geometry.json",
  "title": "the geometries allowed as values of the 'geometry' member",
  "description": "This JSON Schema is part of JSON-FG version 1.0.0.",
  "allOf": [
    {
      "oneOf": [
        {"type": "null"}                                          ,
        {"$ref": "geometry-object.json#/$defs/Point"}             ,
        {"$ref": "geometry-object.json#/$defs/MultiPoint"}        ,
        {"$ref": "geometry-object.json#/$defs/LineString"}        ,
        {"$ref": "geometry-object.json#/$defs/MultiLineString"}   ,
        {"$ref": "geometry-object.json#/$defs/Polygon"}           ,
        {"$ref": "geometry-object.json#/$defs/MultiPolygon"}      ,
        {"$ref": "geometry-object.json#/$defs/GeometryCollection"}
      ]
    },
    {
      "not": {
        "type": "object",
        "properties": {"coordRefSys": {}},
        "required": ["coordRefSys"]
      }
    },
    {
      "not": {
        "type": "object",
        "properties": {"measures": {}},
        "required": ["measures"]
      }
    }
  ]
}

B.11. JSON Schema of the "featureType" member

1
2
3
4
5
6
7
{
  "$schema"    : "https://json-schema.org/draft/2020-12/schema"             ,
  "$id"        : "https://schemas.opengis.net/json-fg/featuretype.json",
  "title"      : "the value of the 'featureType' member"                    ,
  "description": "This JSON Schema is part of JSON-FG version 1.0.0."       ,
  "type"       : "string"
}

B.12. JSON Schema of the "featureSchema" member

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schemas.opengis.net/json-fg/featureschema.json",
  "title": "the value of the 'featureSchema' member",
  "description": "This JSON Schema is part of JSON-FG version 1.0.0.",
  "oneOf": [
    {"type": "string", "format": "uri"},
    {
      "type": "object",
      "additionalProperties": {"type": "string", "format": "uri"}
    }
  ]
}

Annex C: Examples (Informative)

C.1. A building feature

The following feature instance is an example of a building feature that includes severel new JSON-FG capabilities.

Example 20. Building with a polyhedron geometry and the polygon footprint
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
{
   "type": "Feature",
   "id": "DENW19AL0000giv5BL",
   "conformsTo": [
      "http://www.opengis.net/spec/json-fg-1/1.0/conf/core"         ,
      "http://www.opengis.net/spec/json-fg-1/1.0/conf/types-schemas",
      "http://www.opengis.net/spec/json-fg-1/1.0/conf/polyhedra"
   ],
   "featureType": "app:building",
   "featureSchema": "https://example.org/data/v1/collections/buildings/schema",
   "time": { "interval": ["2014-04-24T10:50:18Z", ".."] },
   "coordRefSys": "http://www.opengis.net/def/crs/EPSG/0/5555",
   "place": {
      "type": "Polyhedron",
      "coordinates": [
         [
            [
               [
                  [479816.670, 5705861.672, 100],
                  [479822.187, 5705866.783, 100],
                  [479829.666, 5705858.785, 100],
                  [479824.155, 5705853.684, 100],
                  [479816.670, 5705861.672, 100]
               ]
            ],
            [
               [
                  [479816.670, 5705861.672, 110],
                  [479824.155, 5705853.684, 110],
                  [479829.666, 5705858.785, 120],
                  [479822.187, 5705866.783, 120],
                  [479816.670, 5705861.672, 110]
               ]
            ],
            [
               [
                  [479816.670, 5705861.672, 110],
                  [479816.670, 5705861.672, 100],
                  [479824.155, 5705853.684, 100],
                  [479824.155, 5705853.684, 110],
                  [479816.670, 5705861.672, 110]
               ]
            ],
            [
               [
                  [479824.155, 5705853.684, 110],
                  [479824.155, 5705853.684, 100],
                  [479829.666, 5705858.785, 100],
                  [479829.666, 5705858.785, 120],
                  [479824.155, 5705853.684, 110]
               ]
            ],
            [
               [
                  [479829.666, 5705858.785, 120],
                  [479829.666, 5705858.785, 100],
                  [479822.187, 5705866.783, 100],
                  [479822.187, 5705866.783, 120],
                  [479829.666, 5705858.785, 120]
               ]
            ],
            [
               [
                  [479822.187, 5705866.783, 120],
                  [479822.187, 5705866.783, 100],
                  [479816.670, 5705861.672, 100],
                  [479816.670, 5705861.672, 110],
                  [479822.187, 5705866.783, 120]
               ]
            ]
         ]
      ]
   },
   "geometry": {
      "type": "Polygon",
      "coordinates": [
         [
            [8.7092045, 51.5035285, 100],
            [8.7093128, 51.5034570, 100],
            [8.7093919, 51.5035030, 100],
            [8.7092837, 51.5035747, 100],
            [8.7092045, 51.5035285, 100]
         ]
      ]
   },
   "links": [
      {
         "href": "https://example.org/data/v1/collections/cadastralparcel/items/05297001600313______",
         "rel": "http://www.opengis.net/def/rel/ogc/1.0/within",
         "title": "Cadastral parcel 313 in district Wünnenberg (016)"
      },
      {
         "href" : "https://inspire.ec.europa.eu/featureconcept/Building",
         "rel"  : "type"                                                ,
         "title": "This feature is of type 'building'"
      }
   ],
   "properties": {
      "lastChange": "2014-04-24T10:50:18Z",
      "built": "2012-03",
      "function": "Agricultural building",
      "height_m": 20.0,
      "owners": [
         {"href": "https://example.org/john-doe", "title": "John Doe"},
         {"href": "https://example.org/jane-doe", "title": "Jane Doe"}
      ]
   }
}

C.2. A road segment feature with measure values

The following feature instance is an example of a road segment feature.

Example 21. A road element with measure values
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
{
  "type": "Feature",
  "id": "3713041O3613255A",
  "conformsTo": [
    "http://www.opengis.net/spec/json-fg-1/1.0/conf/core"    ,
    "http://www.opengis.net/spec/json-fg-1/1.0/conf/measures"
  ],
  "coordRefSys": "http://www.opengis.net/def/crs/OGC/0/CRS84",
  "measures": {
    "enabled": true,
    "unit": "km",
    "description": "Kilometers along the road based on the kilometer markers. Positions between two physical markers are interpolated."
  },
  "geometry": null,
  "place": {
    "type": "LineString",
    "coordinates": [
      [7.9379077, 52.2841795, 227.396],
      [7.9386618, 52.2856218, 227.227],
      [7.9389695, 52.2862999, 227.149],
      [7.9395120, 52.2876169, 226.998],
      [7.9397562, 52.2883001, 226.920],
      [7.9401802, 52.2896330, 226.769],
      [7.9405226, 52.2910055, 226.614],
      [7.9412150, 52.2945101, 226.222],
      [7.9415283, 52.2959768, 226.057],
      [7.9416385, 52.2964391, 226.005],
      [7.9421299, 52.2981305, 225.814],
      [7.9426214, 52.2995303, 225.655],
      [7.9429592, 52.3003909, 225.556],
      [7.9434566, 52.3015636, 225.422],
      [7.9438507, 52.3024014, 225.325],
      [7.9443588, 52.3034069, 225.208]
    ]
  },
  "time": {"instant": "2022-10-21T18:00:00Z"},
  "properties": {
    "road.title": "A1",
    "road.class": "A",
    "road.number": 1,
    "num": "8",
    "type": "Abschnitt",
    "lr_start": 0,
    "length_m": 2188,
    "adminarea.name": "Bundesrepublik Deutschland",
    "adminarea.knz": "00000000000",
    "netzstand": "2022-10-21T18:00:00Z"
  }
}

C.3. A circle geometry

The following feature instance is an example of a circle as a JSON-FG outside of a feature context.

Example 22. A circle
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
    "conformsTo": [
        "http://www.opengis.net/spec/json-fg-1/1.0/conf/core"         ,
        "http://www.opengis.net/spec/json-fg-1/1.0/conf/circular-arcs"
    ],
    "coordRefSys": "http://www.opengis.net/def/crs/OGC/0/CRS84",
    "type": "CircularString",
    "coordinates": [
        [4.5390985, 51.5902952],
        [4.5389154, 51.5902383],
        [4.5390067, 51.5901243],
        [4.5391898, 51.5901811],
        [4.5390985, 51.5902952]
    ]
}

C.4. Simple prism geometries

The following are simple examples of prism geometries in a feature.

Example 23. A pylon as a entruded point
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
    "type": "Feature",
    "id": "pylon.1",
    "conformsTo" : [ "http://www.opengis.net/spec/json-fg-1/1.0/conf/core", "http://www.opengis.net/spec/json-fg-1/1.0/conf/prisms" ],
    "featureType": "pylon",
    "time": {
        "interval": [
            "2022-07-12T16:47:18Z",
            ".."
        ]
    },
    "geometry": null,
    "coordRefSys": "http://www.opengis.net/def/crs/EPSG/0/7415",
    "place": {
        "type": "Prism",
        "base": {
            "type": "Point",
            "coordinates": [
                81220.15,
                455113.71
            ]
        },
        "lower": 2.02,
        "upper": 8.02
    },
    "properties": null
}
Example 24. A fence as an extruded line string
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
    "type": "Feature",
    "id": "fence.1",
    "conformsTo" : [ "http://www.opengis.net/spec/json-fg-1/1.0/conf/core", "http://www.opengis.net/spec/json-fg-1/1.0/conf/prisms" ],
    "featureType": "fence",
    "time": {
        "interval": [
            "2022-07-12T16:55:18Z",
            ".."
        ]
    },
    "geometry": null,
    "coordRefSys": "http://www.opengis.net/def/crs/EPSG/0/7415",
    "place": {
        "type": "Prism",
        "base": {
            "type": "LineString",
            "coordinates": [
                [
                    81220.15,
                    455113.71
                ],
                [
                    81223.15,
                    455116.71
                ]
            ]
        },
        "lower": 2.02,
        "upper": 3.22
    },
    "properties": null
}

C.5. Toronto City Hall

The following object is a feature representing the Toronto City Hall with the geometry as a MultiPrism (extruded polygons).

Example 25. Toronto City Hall with a prism geometry
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
{
  "type": "Feature",
  "id": "CWFID.Toronto3D.0.177482",
  "bbox": [-79.384481,43.653199,90.848,-79.383449,43.653866,190.348],
  "conformsTo" : [ "http://www.opengis.net/spec/json-fg-1/1.0/conf/core", "http://www.opengis.net/spec/json-fg-1/1.0/conf/prisms" ],
  "geometry": null,
  "coordRefSys": "http://www.opengis.net/def/crs/OGC/0/CRS84h",
  "place": {
    "type": "MultiPrism",
    "prisms": [
      {
        "type": "Prism",
        "base": {
          "type": "Polygon",
          "coordinates": [ [
          [ -79.38420744, 43.65327075 ], [ -79.38426426, 43.65334167 ],
          [ -79.38426868, 43.65334677 ], [ -79.38427927, 43.65336015 ],
          [ -79.38428875, 43.65337394 ], [ -79.38429712, 43.65338812 ],
          [ -79.38430433, 43.65340262 ], [ -79.38431036, 43.65341741 ],
          [ -79.3843152, 43.65343242 ], [ -79.38431883, 43.65344762 ],
          [ -79.38432123, 43.65346294 ], [ -79.3843224, 43.65347834 ],
          [ -79.38432233, 43.65349376 ], [ -79.38432102, 43.65350915 ],
          [ -79.38431948, 43.6535188 ], [ -79.38431595, 43.65353474 ],
          [ -79.3843112, 43.65355051 ], [ -79.38430524, 43.65356607 ],
          [ -79.3842981, 43.65358135 ], [ -79.3842898, 43.65359633 ],
          [ -79.38428036, 43.65361094 ], [ -79.38426981, 43.65362515 ],
          [ -79.38425819, 43.65363892 ], [ -79.38424553, 43.65365219 ],
          [ -79.38423187, 43.65366492 ], [ -79.38421725, 43.65367709 ],
          [ -79.38417654, 43.65371806 ], [ -79.38420552, 43.65373513 ],
          [ -79.38418786, 43.65375189 ], [ -79.38421657, 43.65378312 ],
          [ -79.38421681, 43.65378352 ], [ -79.38421977, 43.6537872 ],
          [ -79.38422373, 43.65379035 ], [ -79.38422563, 43.6537915 ],
          [ -79.38422976, 43.6537931 ], [ -79.38423433, 43.65379387 ],
          [ -79.38423901, 43.65379374 ], [ -79.38424349, 43.65379273 ],
          [ -79.38424744, 43.65379091 ], [ -79.38425571, 43.65378517 ],
          [ -79.38427731, 43.65376936 ], [ -79.38429803, 43.65375295 ],
          [ -79.38430275, 43.65374947 ], [ -79.38432397, 43.653733 ],
          [ -79.38434429, 43.65371593 ], [ -79.38436365, 43.6536983 ],
          [ -79.38438204, 43.65368012 ], [ -79.38439942, 43.65366142 ],
          [ -79.38441576, 43.65364224 ], [ -79.38443105, 43.65362261 ],
          [ -79.38444525, 43.65360255 ], [ -79.38445834, 43.6535821 ],
          [ -79.38446164, 43.65357546 ], [ -79.38446789, 43.65356096 ],
          [ -79.38447295, 43.65354621 ], [ -79.3844768, 43.65353127 ],
          [ -79.38447942, 43.65351619 ], [ -79.38448082, 43.65350103 ],
          [ -79.38448097, 43.65348583 ], [ -79.38447989, 43.65347065 ],
          [ -79.38447757, 43.65345554 ], [ -79.38447403, 43.65344056 ],
          [ -79.38446927, 43.65342576 ], [ -79.38446331, 43.65341119 ],
          [ -79.38445913, 43.65340284 ], [ -79.38444852, 43.65338352 ],
          [ -79.38443676, 43.65336456 ], [ -79.38442389, 43.65334598 ],
          [ -79.38440993, 43.65332782 ], [ -79.3843949, 43.65331011 ],
          [ -79.38437883, 43.65329289 ], [ -79.38429148, 43.65320376 ],
          [ -79.38428751, 43.6532014 ], [ -79.38428284, 43.65319977 ],
          [ -79.38427777, 43.65319898 ], [ -79.3842726, 43.65319909 ],
          [ -79.38426761, 43.65320009 ], [ -79.38426308, 43.65320192 ],
          [ -79.38425928, 43.65320447 ], [ -79.38422428, 43.6532376 ],
          [ -79.38423947, 43.65325843 ], [ -79.38420744, 43.65327075 ] ] ]
        },
        "lower": 90.848,
        "upper": 170.248
      },
      {
        "type": "Prism",
        "base": {
          "type": "Polygon",
          "coordinates": [ [
          [ -79.38425596, 43.65347139], [ -79.38425407, 43.65345755],
          [ -79.38425095, 43.65344382], [ -79.3842466, 43.65343028],
          [ -79.38424107, 43.65341696], [ -79.38423436, 43.65340393],
          [ -79.38422651, 43.65339124], [ -79.38421754, 43.65337895],
          [ -79.38420749, 43.6533671], [ -79.38419641, 43.65335576],
          [ -79.38418435, 43.65334495], [ -79.38417134, 43.65333473],
          [ -79.38415745, 43.65332515], [ -79.38415032, 43.65332085],
          [ -79.38413487, 43.65331243], [ -79.38411871, 43.65330474],
          [ -79.38410191, 43.65329781], [ -79.38408454, 43.65329169],
          [ -79.38406665, 43.65328639], [ -79.38404834, 43.65328193],
          [ -79.38402966, 43.65327833], [ -79.38401072, 43.65327561],
          [ -79.38399156, 43.65327377], [ -79.38397229, 43.65327284],
          [ -79.38395297, 43.6532728], [ -79.38393369, 43.65327366],
          [ -79.38391453, 43.65327542], [ -79.38389555, 43.65327806],
          [ -79.38387686, 43.65328158], [ -79.38385851, 43.65328597],
          [ -79.38384059, 43.6532912], [ -79.38382316, 43.65329726],
          [ -79.38377823, 43.65331886], [ -79.38377272, 43.65332226],
          [ -79.38375815, 43.65333206], [ -79.38374445, 43.6533425],
          [ -79.38373217, 43.65335314], [ -79.38372086, 43.65336434],
          [ -79.38371058, 43.65337604], [ -79.38370136, 43.6533882],
          [ -79.38369325, 43.65340077], [ -79.38368627, 43.65341369],
          [ -79.38368046, 43.65342692], [ -79.38367585, 43.65344039],
          [ -79.38367245, 43.65345405], [ -79.38367027, 43.65346784],
          [ -79.38366933, 43.65348171], [ -79.38366963, 43.65349559],
          [ -79.38367117, 43.65350943], [ -79.38367394, 43.65352316],
          [ -79.38367793, 43.65353674], [ -79.38368312, 43.6535501],
          [ -79.38368949, 43.65356319], [ -79.38369702, 43.65357595],
          [ -79.38370567, 43.65358833], [ -79.38371541, 43.65360028],
          [ -79.38372619, 43.65361174], [ -79.38373797, 43.65362268],
          [ -79.38375071, 43.65363304], [ -79.38376434, 43.65364277],
          [ -79.38377882, 43.65365185], [ -79.38379407, 43.65366022],
          [ -79.38381004, 43.65366786], [ -79.38382665, 43.65367473],
          [ -79.38384384, 43.65368081], [ -79.38386154, 43.65368607],
          [ -79.38387968, 43.65369048], [ -79.38389816, 43.65369403],
          [ -79.38391693, 43.6536967], [ -79.3839359, 43.65369849],
          [ -79.38395498, 43.65369938], [ -79.3839741, 43.65369937],
          [ -79.38399318, 43.65369846], [ -79.38401214, 43.65369666],
          [ -79.3840309, 43.65369396], [ -79.38404938, 43.65369039],
          [ -79.3840675, 43.65368596], [ -79.38408519, 43.65368069],
          [ -79.38409529, 43.65367711], [ -79.38411206, 43.65367038],
          [ -79.3841282, 43.65366288], [ -79.38414363, 43.65365464],
          [ -79.38415829, 43.65364569], [ -79.38417213, 43.65363606],
          [ -79.38418508, 43.65362582], [ -79.38419709, 43.65361498],
          [ -79.38420811, 43.6536036], [ -79.3842181, 43.65359173],
          [ -79.384227, 43.65357941], [ -79.38423479, 43.65356671],
          [ -79.38424143, 43.65355366], [ -79.3842469, 43.65354033],
          [ -79.38425116, 43.65352677], [ -79.38425421, 43.65351304],
          [ -79.38425603, 43.65349919], [ -79.38425662, 43.65348529],
          [ -79.38425596, 43.65347139] ] ]
        },
        "lower": 90.848,
        "upper": 110.443
      },
      {
        "type": "Prism",
        "base": {
          "type": "Polygon",
          "coordinates": [ [
          [ -79.38359865, 43.65342466 ], [ -79.38360028, 43.65340244 ],
          [ -79.38360314, 43.65338028 ], [ -79.38361027, 43.65333574 ],
          [ -79.38357134, 43.6533332 ], [ -79.38357522, 43.65331185 ],
          [ -79.38352233, 43.65329164 ], [ -79.38352003, 43.65329026 ],
          [ -79.38351644, 43.65328911 ], [ -79.38351253, 43.65328884 ],
          [ -79.38350869, 43.65328945 ], [ -79.3835053, 43.6532909 ],
          [ -79.3835037, 43.65329218 ], [ -79.38349774, 43.65329778 ],
          [ -79.38349274, 43.65330386 ], [ -79.38348879, 43.65331035 ],
          [ -79.38348459, 43.65332514 ], [ -79.38347433, 43.65336425 ],
          [ -79.3834653, 43.65340352 ], [ -79.38345749, 43.65344293 ],
          [ -79.3834509, 43.65348245 ], [ -79.38344964, 43.65349816 ],
          [ -79.38344911, 43.65351849 ], [ -79.38344982, 43.65353881 ],
          [ -79.38345176, 43.65355909 ], [ -79.38345495, 43.65357929 ],
          [ -79.38345936, 43.65359937 ], [ -79.38346498, 43.65361929 ],
          [ -79.38347182, 43.653639 ], [ -79.38347233, 43.65364019 ],
          [ -79.38347929, 43.6536548 ], [ -79.38348742, 43.65366908 ],
          [ -79.38349667, 43.653683 ], [ -79.38350702, 43.65369651 ],
          [ -79.38351844, 43.65370955 ], [ -79.38353088, 43.65372209 ],
          [ -79.3835443, 43.65373409 ], [ -79.38355866, 43.65374549 ],
          [ -79.38357392, 43.65375627 ], [ -79.38357791, 43.65375872 ],
          [ -79.38359719, 43.65376982 ], [ -79.38361722, 43.6537802 ],
          [ -79.38363794, 43.65378983 ], [ -79.3836593, 43.6537987 ],
          [ -79.38368125, 43.65380677 ], [ -79.38370373, 43.65381403 ],
          [ -79.38372669, 43.65382046 ], [ -79.38375006, 43.65382605 ],
          [ -79.38376671, 43.65383005 ], [ -79.38380024, 43.65383742 ],
          [ -79.38383412, 43.65384392 ], [ -79.38386829, 43.65384954 ],
          [ -79.38390271, 43.65385428 ], [ -79.38393734, 43.65385814 ],
          [ -79.38397213, 43.65386111 ], [ -79.38400705, 43.65386317 ],
          [ -79.38406372, 43.65386581 ], [ -79.38406875, 43.65386502 ],
          [ -79.38407338, 43.65386338 ], [ -79.38407734, 43.65386098 ],
          [ -79.3840804, 43.65385798 ], [ -79.3840824, 43.65385452 ],
          [ -79.38408321, 43.65385082 ], [ -79.38408279, 43.65384708 ],
          [ -79.38407132, 43.65380444 ], [ -79.38404493, 43.65379985 ],
          [ -79.38405299, 43.65377541 ], [ -79.3839733, 43.65376425 ],
          [ -79.38395719, 43.65376204 ], [ -79.38393186, 43.65375781 ],
          [ -79.38390684, 43.65375271 ], [ -79.38388219, 43.65374674 ],
          [ -79.38385795, 43.65373994 ], [ -79.38383418, 43.65373229 ],
          [ -79.38381095, 43.65372384 ], [ -79.3837883, 43.65371459 ],
          [ -79.38376628, 43.65370457 ], [ -79.38374494, 43.6536938 ],
          [ -79.38373894, 43.65369035 ], [ -79.3837226, 43.65368021 ],
          [ -79.38370709, 43.6536694 ], [ -79.38369246, 43.65365795 ],
          [ -79.38367876, 43.65364592 ], [ -79.38366605, 43.65363333 ],
          [ -79.38365435, 43.65362023 ], [ -79.38364371, 43.65360666 ],
          [ -79.38363417, 43.65359267 ], [ -79.38362576, 43.6535783 ],
          [ -79.38361849, 43.65356361 ], [ -79.38361241, 43.65354864 ],
          [ -79.38360908, 43.65353548 ], [ -79.38360453, 43.65351348 ],
          [ -79.38360121, 43.65349135 ], [ -79.38359912, 43.65346915 ],
          [ -79.38359826, 43.65344691 ], [ -79.38359865, 43.65342466 ] ]
          ]
        },
        "lower": 90.848,
        "upper": 190.348
      }
    ]
  },
  "properties": {
    "common_name": "Toronto City Hall",
    "address": "100 Queen St. West",
    "perimeter": 497.009462084,
    "poly_area": 3553.573425347
  }
}

C.6. Cologne Cathedral

The file cologne-cathedral.json is a JSON-FG feature collection that contains a CityGML building feature with 87 building part features representing the Cologne Cathedral in Level of Detail 2. Each building part has a Polyhedron geometry. The building part feature also contain additional geometries in the "properties" section. Due to the size of the example, it is not embedded, but referenced.

C.7. A homogeneous feature collection

The following feature collection consists of airport features from the Zoomstack dataset of Ordnance Survey Great Britain. All features have the same feature type ("Airport") with a point geometry (geometry dimension: 0).

The feature collection has been reduced to the first two and the last feature to reduce the size of the example.

Example 26. Airports in Great Britain
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
  "type": "FeatureCollection",
  "conformsTo" : [ "http://www.opengis.net/spec/json-fg-1/1.0/conf/core", "http://www.opengis.net/spec/json-fg-1/1.0/conf/types-schemas" ],
  "coordRefSys": "http://www.opengis.net/def/crs/EPSG/0/27700",
  "featureType": "Airport",
  "featureSchema": "https://demo.ldproxy.net/zoomstack/collections/airports/schema",
  "geometryDimension": 0,
  "features": [
    {
      "type": "Feature",
      "id": 1,
      "geometry": { "type": "Point", "coordinates": [-1.6930015, 60.3216821] },
      "properties": {"name": "Papa Stour Airstrip"},
      "place": { "type": "Point", "coordinates": [417057.93, 1159772.2] }
    },
    {
      "type": "Feature",
      "id": 2,
      "geometry": { "type": "Point", "coordinates": [-1.2922268, 59.8782666] },
      "properties": {"name": "Sumburgh Airport"},
      "place": { "type": "Point", "coordinates": [439723.69, 1110559.95] }
    },
    {
      "type": "Feature",
      "id": 46,
      "geometry": { "type": "Point", "coordinates": [0.9384272, 50.9556174] },
      "properties": {"name": "Lydd Airport"},
      "place": { "type": "Point", "coordinates": [606468.75, 121465.11] }
    }
  ]
}

C.8. Extending JSON-FG

This section illustrates how JSON-FG can be extended with:

  • A new geometry type "GeodesicString" for a geodesic curve;

  • A new temporal data type for a time series;

  • The capability to provide a coordinate reference system definition as a PROJJSON object.

If the extension could be specified in a hypothetical part 2 of JSON-FG, the extension could update the JSON Schema definitions as described in the following sub-sections.

If the same extensions are specified by a community, the relevant JSON-FG schemas could be copied from this Standard and extended as described in the following sub-sections. Unchanged schemas such as the JSON Schemas for the "geometry" and "featureType" members or for a link do not need to be copied and can reference the JSON-FG schemas.

C.8.1. Geometry type "GeodesicString"

A GeoJSON LineString is a sequence of straight lines through two or more positions with the assumption that Euclidean geometry is used. That is, while GeoJSON uses geographic coordinates (longitude and latitude) on an ellipsoid, the path between two positions is computed in a Cartesian coordinate system by applying the Pseudo Plate Carrée projection. In other words, the path between two positions is a straight line in the Cartesian coordinate system, not the shortest path on the WGS 84 ellipsoid.

To support geodesic curves on the reference ellipsoid, a new geometry type "GeodesicString" could be defined. The new geometry type would be a sequence of geodesic lines between two or more positions on the ellipsoid.

A GeodesicString requires that the coordinates are in a geographic coordinate reference system (CRS) with longitude and latitude as the horizontal coordinates.

Geometrical computations of a GeodesicString - including computation of length or area - should be performed on the curved surface that approximates the earth’s surface. Details are provided, for example, in the drafts of Features and Geometry - Part 2: Metrics.

If the "bbox" member is provided, it will be the bounding box that contains all positions along the path of the geodesic string. That is, it will in general be larger than the bounding box of the positions in the "coordinates" member.

The schema definition for a new geometry "GeodesicString" shown below could be added as \#/$defs/GeodesicString in the JSON Schema of geometries ("geometry-object.json").

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
    "title": "GeodesicString",
    "description": "A sequence of geodesic lines between two or more positions on the curved surface of the coordinate reference system. A GeodesicString requires that the coordinates are in a geographic coordinate reference system.",
    "type": "object",
    "required": ["type", "coordinates"],
    "properties": {
        "type": { "type": "string", "const": "GeodesicString" },
        "coordinates": {
            "type": "array",
            "minItems": 2,
            "items": {"$ref": "#/$defs/position"}
        },
        "bbox": {"$ref": "#/$defs/bbox"}
    }
}

"GeodesicString" would also be added to #/$defs/CustomGeometry/properties/type/not/enum in "geometry-object.json" to declare the new JSON-FG geometry type.

C.8.2. A temporal data type for a time series;

The schema definition for the time series object shown below could be added as #/$defs/timeSeries in the JSON Schema of the "time" member.

1
2
3
4
5
6
7
8
{
    "type": "array",
    "minItems": 1,
    "items": {
        "type": "string",
        "format": "date-time"
    }
}

The following member would then be added to #/oneOf/1/properties.

1
2
3
"timeSeries": {
    "$ref": "#/$defs/timeSeries"
}

C.8.3. Coordinate reference system as PROJJSON

The schema definition for the by-value CRS object shown below could be added as #/$defs/refsys-byvalue in the JSON Schema of the "coordRefSys" member.

1
2
3
4
5
6
7
8
9
{
    "type": "object",
    "required": ["type", "value"],
    "properties": {
        "type": { "type": "string", "const": "PROJJSON" },
        "value": {"$ref": "https://proj.org/en/latest/schemas/v0.7/projjson.schema.json#/definitions/crs"},
        "epoch": {"type": "number"}
    }
}

"PROJJSON" would also be added to #/$defs/refsys-custom/properties/type/not/enum and { "$ref": "#/$defs/refsys-byvalue" } would be added to #/$defs/single-refsys/oneOf.

Annex D: Revision History

Date Release Editor Primary clauses modified Description

2022-01-07

0.0

C. Portele

all

initial version

2022-08-08

0.1

C. Portele, P. Vretanos

all

first draft release

2022-09-19

0.1.1

C. Portele

Annex B, Annex C

#65: correct examples, use pattern for date/time validation, reorganize example files

2023-10-10

0.2

C. Portele, P. Vretanos

all

second draft release; for submission to the OGC Architecture Board for review

2023-10-25

0.2.1

C. Portele

all

address comments from OGC Architecture Board review; add link to draft of OGC API Features Part 5: Schemas

2024-02-20

0.2.2

C. Portele

all

address comments from OGC October 2023 Code Sprint; upgrade to new CRSs registered by the OGC Naming Authority

2025-05-12

0.3.0

C. Portele

all

address comments from the Public Request for Comments

2026-04-22

1.0.0

C. Portele

all

upgrade version to 1.0.0, prepare for publication

Annex E: Bibliography

Internet Engineering Task Force (IETF). RFC 6906: The 'profile' Link Relation Type. Edited by E. Wilde. 2013. Available at https://www.rfc-editor.org/rfc/rfc6906.html

Internet Engineering Task Force (IETF). RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format. Edited by T. Bray. 2017. Available at https://www.rfc-editor.org/rfc/rfc8259.html

International Organization for Standardization (ISO). ISO 13249-3:2016: Information technology — Database languages — SQL multimedia and application packages - Part 3: Spatial. Available at https://www.iso.org/standard/60343.html

JSON Schema: A Media Type for Describing JSON Documents. Edited by A. Wright, H. Andrews, B. Hutton, G. Dennis. 2022. Available at https://json-schema.org/draft/2020-12/json-schema-core

JSON Schema Validation: A Vocabulary for Structural Validation of JSON. Edited by A. Wright, H. Andrews, B. Hutton. 2022. Available at https://json-schema.org/draft/2020-12/json-schema-validation

Open Geospatial Consortium (OGC). OGC 18-005r4: OGC Abstract Specification Topic 2: Referencing by coordinates. Edited by R. Lott. 2019. Available at https://docs.ogc.org/as/18-005r4/18-005r4.html

Open Geospatial Consortium (OGC). OGC 20-070: Geographic information - Features and geometry — Part 2: Metrics. Edited by J. Herring. 2019. Available at https://portal.ogc.org/files/?artifact_id=94178 (access requires OGC membership)

Open Geospatial Consortium (OGC). OGC 21-018: OGC Testbed-17: Features and Geometries JSON CRS Analysis of Alternatives ER. Edited by P. Vretanos. 2021. Available at http://docs.opengeospatial.org/per/21-018.html

Open Geospatial Consortium (OGC) / World Wide Web Consortium (W3C): Spatial Data on the Web Best Practices [online]. Edited by J. Tandy, L. van den Brink, P. Barnaghi. 2017 [viewed 2020-03-16]. Available at https://www.w3.org/TR/sdw-bp/

Open Geospatial Consortium (OGC) / World Wide Web Consortium (W3C). Time Ontology in OWL [online]. Edited by S. Cox, C. Little. 2020 [viewed 2020-11-22]. Available at https://www.w3.org/TR/owl-time