OGC Features and Geometries JSON - Part 1: Core 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 1. Scope 2. Conformance 3. References 4. Terms, Definitions and Abbreviated Terms 4.1. Terms and Definitions 4.2. Abbreviated Terms 5. Conventions 5.1. Identifiers 5.2. Use of JSON terminology 5.3. Use of JSON Schema 5.4. Extensibility 6. Introduction 6.1. Motivation 6.2. Scenarios 6.2.1. Using a GeoJSON client 6.2.2. Using a JSON-FG client 7. JSON-FG building blocks 7.1. Overview 7.2. General Approach 7.3. Core building blocks 7.3.1. Metadata: the "conformsTo" member 7.3.2. Temporal information: the "time" member 7.3.3. Geometry: the "geometry" and "place" members 7.3.4. Reference systems: the "coordRefSys" member 7.4. Building blocks for 3D geometries 7.4.1. Polyhedron 7.4.2. MultiPolyhedron 7.4.3. Prism 7.4.4. MultiPrism 7.5. Building blocks for circular arcs 7.5.1. CircularString 7.5.2. CompoundCurve 7.5.3. CurvePolygon 7.5.4. MultiCurve 7.5.5. MultiSurface 7.6. Building blocks for measures 7.6.1. Measures: the "measures" member 7.7. Building blocks for feature types and schemas 7.7.1. Feature types: the "featureType" member 7.7.2. Feature schemas: the "featureSchema" member 7.8. GeoJSON Profiles 8. Requirements Class "Core" 8.1. Structure of a JSON-FG root object 8.2. Metadata 8.2.1. Conformance declaration 8.3. Temporal information 8.3.1. Instants 8.3.2. Intervals 8.3.3. Instants and intervals 8.3.4. Time zones 8.4. Geometry 8.4.1. Coordinate dimension 8.4.2. "geometry" in longitude/latitude 8.4.3. "geometry" without JSON-FG extensions 8.4.4. geometries are valid 8.4.5. No point, line string or polygon geometry in WGS 84 longitude/latitude in "place" 8.4.6. All primary geometries are in the same CRS 8.4.7. Fallback geometry in "geometry" 8.4.8. Axis order of coordinates 8.4.9. Coordinate values in "place" 9. Requirements Class "Polyhedra" 9.1. Metadata 9.1.1. Conformance declaration 9.2. Geometry 9.2.1. Coordinates 9.2.2. Geometries are valid 10. Requirements Class "Prisms" 10.1. Metadata 10.1.1. Conformance declaration 10.2. Geometry 10.2.1. Coordinates 11. Requirements Class "Circular Arcs" 11.1. Metadata 11.1.1. Conformance declaration 11.2. Geometry 11.2.1. Geometries are valid 12. Requirements Class "Measures" 12.1. Metadata 12.1.1. Conformance declaration 12.2. Geometry 12.2.1. Coordinates 12.2.2. All positions in a primary geometry use m coordinates or not 13. Requirements Class "Feature Types and Schemas" 13.1. Metadata 13.1.1. Conformance declaration 13.2. Feature type(s) 13.2.1. "featureType" is present 13.2.2. Value in "geometryDimension" 13.2.3. Homogeneous feature collections 13.3. Feature schema 13.3.1. Feature schemas conform to OGC API - Features - Part 5: Schemas 13.3.2. Single feature schema implies one feature type 14. Requirements Class "GeoJSON Profiles" 14.1. Profile "RFC 7946" 14.2. Profile "JSON-FG" 14.3. Profile "JSON-FG with improved support for GeoJSON readers" 15. Requirements Class "JSON-FG in Web APIs" 16. Media Types Annex A: Abstract Test Suite (Normative) A.1. Conformance Class "Core" A.1.1. Conformance Test 1 A.1.2. Conformance Test 2 A.1.3. Conformance Test 3 A.1.4. Conformance Test 4 A.1.5. Conformance Test 5 A.1.6. Conformance Test 6 A.1.7. Conformance Test 7 A.1.8. Conformance Test 8 A.1.9. Conformance Test 9 A.1.10. Conformance Test 10 A.1.11. Conformance Test 11 A.1.12. Conformance Test 12 A.1.13. Conformance Test 13 A.1.14. Conformance Test 14 A.1.15. Conformance Test 15 A.2. Conformance Class "Polyhedra" A.2.1. Conformance Test 16 A.2.2. Conformance Test 17 A.3. Conformance Class "Prisms" A.3.1. Conformance Test 18 A.4. Conformance Class "Circular Arcs" A.4.1. Conformance Test 19 A.4.2. Conformance Test 20 A.4.3. Conformance Test 21 A.5. Conformance Class "Measures" A.5.1. Conformance Test 22 A.6. Conformance Class "Feature Types and Schemas" A.6.1. Conformance Test 23 A.6.2. Conformance Test 24 A.6.3. Conformance Test 25 A.6.4. Conformance Test 26 A.6.5. Conformance Test 27 A.7. Conformance Class "GeoJSON Profiles" A.7.1. Conformance Test 28 A.7.2. Conformance Test 29 A.7.3. Conformance Test 30 A.8. Conformance Class "JSON-FG in Web APIs" A.8.1. Conformance Test 31 A.8.2. Conformance Test 32 Annex B: Schemas (Normative) B.1. JSON Schema of a JSON-FG root object B.2. JSON Schema of a JSON-FG feature collection B.3. JSON Schema of a JSON-FG feature B.4. JSON Schema of a JSON-FG geometry B.5. JSON Schema of the "conformsTo" member B.6. JSON Schema of the "time" member B.7. JSON Schema of the "place" member B.8. JSON Schema of the "coordRefSys" member B.9. JSON Schema of the "measures" member B.10. JSON Schema of the "geometry" member B.11. JSON Schema of the "featureType" member B.12. JSON Schema of the "featureSchema" member Annex C: Examples (Informative) C.1. A building feature C.2. A road segment feature with measure values C.3. A circle geometry C.4. Simple prism geometries C.5. Toronto City Hall C.6. Cologne Cathedral C.7. A homogeneous feature collection C.8. Extending JSON-FG C.8.1. Geometry type "GeodesicString" C.8.2. A temporal data type for a time series; C.8.3. Coordinate reference system as PROJJSON Annex D: Revision History Annex E: Bibliography 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. 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. 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.1. Overview The following JSON building blocks are specified by this Standard: Core building blocks Metadata: the "conformsTo" member Temporal information: the "time" member Geometry: the "geometry" and "place" members Reference systems: the "coordRefSys" member Building blocks for 3D geometries Polyhedron MultiPolyhedron Prism MultiPrism Building blocks for circular arcs CircularString CompoundCurve CurvePolygon MultiCurve MultiSurface Building blocks for measures Measures: the "measures" member Building blocks for feature types and schemas Feature types: the "featureType" member Feature schemas: the "featureSchema" member Annex ' Examples (Informative) ' has examples of JSON-FG objects. 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: Extended by additional geometries: Additional 3D geometry types Polyhedron , MultiPolyhedron , Prism , and MultiPrism ; Additional geometry types supporting curves with circular arcs CircularString , CompoundCurve , CurvePolygon , MultiCurve , and MultiSurface ; The capability to declare the coordinate reference system of the coordinates ; and The capability to add a measure coordinate to each position . 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. 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. 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 . 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 . Annex C includes an example of a road element feature with measure values . 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 Requirements Class "Core" 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: the CRS definition for each CRS used in the JSON object is available; collect all JSON-FG geometries; for each geometry except those in a "geometry" member, 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 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 Requirements Class "Polyhedra" Dependency Conformance Class "Core" 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: The JSON-FG root object under test; the JSON-FG root object has passed the Conformance Class "Core" ; 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: The JSON-FG root object under test; the JSON-FG root object has passed the Conformance Class "Core" ; 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 Requirements Class "Prisms" Dependency Conformance Class "Core" 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: The JSON-FG root object under test; the JSON-FG root object has passed the Conformance Class "Core" ; 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 Requirements Class "Circular Arcs" Dependency Conformance Class "Core" 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 Requirements Class "Measures" Dependency Conformance Class "Core" 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 Requirements Class "Feature Types and Schemas" Dependency Conformance Class "Core" 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: assert that all referenced schemas conform to OGC API - Features - Part 5: Schemas , requirements class "Schemas." 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 Requirements Class "GeoJSON Profiles" 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: assert that the GeoJSON document is a JSON-FG root object that passes the Conformance Class "Core" . 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 Requirements Class "JSON-FG in Web APIs" 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-005r8: OGC Abstract Specification Topic 2: Referencing by coordinates . Edited by R. Lott. 2023. Available at https://docs.ogc.org/as/18-005r8/18-005r8.pdf 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 Last updated 2026-04-29 21:48:36 -0400