{"id":40895,"date":"2026-08-31T08:52:58","date_gmt":"2026-08-31T06:52:58","guid":{"rendered":"https:\/\/smartdatamodels.org\/?p=40895"},"modified":"2026-08-28T14:05:15","modified_gmt":"2026-08-28T12:05:15","slug":"cityjson-ciutygml-joins-smart-data-models-33-candidate-models-for-3d-city-objects","status":"publish","type":"post","link":"https:\/\/smartdatamodels.org\/index.php\/cityjson-ciutygml-joins-smart-data-models-33-candidate-models-for-3d-city-objects\/","title":{"rendered":"CityJSON\/ciutyGML Joins Smart Data Models: 33 Candidate Models for 3D City Objects"},"content":{"rendered":"<p>Smart Data Models&#8217; <a href=\"https:\/\/github.com\/smart-data-models\/Candidates\">Candidates repository<\/a> now includes a new candidate standard, <strong><code>cityjson-v2<\/code><\/strong>, translated from <strong>CityJSON v2.0.2<\/strong> \u2014 a JSON encoding of a subset of the OGC CityGML data model for 3D city models. All <strong>33 core City Object types<\/strong> defined in <a href=\"https:\/\/github.com\/cityjson\/specs\">cityjson\/specs<\/a>&#8216; <code>schemas\/cityobjects.schema.json<\/code> now have an NGSI-LD \/ NGSI-v2 representation.<\/p>\n<h2 id=\"whats-in-it\">What&#8217;s in it<\/h2>\n<table>\n<thead>\n<tr>\n<th>Family<\/th>\n<th>Models<\/th>\n<th>Examples<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Building<\/td>\n<td>8<\/td>\n<td><code>Building<\/code>, <code>BuildingPart<\/code>, <code>BuildingUnit<\/code>, <code>BuildingStorey<\/code>, <code>BuildingRoom<\/code><\/td>\n<\/tr>\n<tr>\n<td>Bridge<\/td>\n<td>6<\/td>\n<td><code>Bridge<\/code>, <code>BridgePart<\/code>, <code>BridgeInstallation<\/code>, <code>BridgeConstructiveElement<\/code><\/td>\n<\/tr>\n<tr>\n<td>Tunnel<\/td>\n<td>6<\/td>\n<td><code>Tunnel<\/code>, <code>TunnelPart<\/code>, <code>TunnelHollowSpace<\/code>, <code>TunnelInstallation<\/code><\/td>\n<\/tr>\n<tr>\n<td>Transportation<\/td>\n<td>4<\/td>\n<td><code>Road<\/code>, <code>Railway<\/code>, <code>TransportSquare<\/code>, <code>Waterway<\/code><\/td>\n<\/tr>\n<tr>\n<td>Generic \/ furniture<\/td>\n<td>3<\/td>\n<td><code>GenericCityObject<\/code>, <code>OtherConstruction<\/code>, <code>CityFurniture<\/code><\/td>\n<\/tr>\n<tr>\n<td>Vegetation<\/td>\n<td>2<\/td>\n<td><code>PlantCover<\/code>, <code>SolitaryVegetationObject<\/code><\/td>\n<\/tr>\n<tr>\n<td>Water, terrain, land use, grouping<\/td>\n<td>4<\/td>\n<td><code>WaterBody<\/code>, <code>TINRelief<\/code>, <code>LandUse<\/code>, <code>CityObjectGroup<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Every model ships the full set of Candidates artifacts: a JSON Schema, an NGSI-LD <code>@context<\/code>, and all four example serializations (NGSI-v2 and NGSI-LD, key-values and normalized) \u2014 each validated against its own schema.<\/p>\n<h2 id=\"built-from-real-json-schema-mechanically-attributes-included\">Built from real JSON Schema, mechanically \u2014 attributes included<\/h2>\n<p>Unlike some other Candidates translations that had to work from prose documentation pages, CityJSON ships genuine machine-readable JSON Schema files (<code>schemas\/cityjson.schema.json<\/code>, <code>cityobjects.schema.json<\/code>, <code>geomprimitives.schema.json<\/code>, &#8230;). This translation parsed those directly, which surfaced a structural fact worth calling out: CityJSON&#8217;s own schema deliberately leaves <strong><code>attributes<\/code> open<\/strong> on every City Object type (<code>{\"type\": \"object\"}<\/code>, no fixed sub-schema) \u2014 it defers attribute content to convention rather than declaring it.<\/p>\n<p>That convention is CityGML&#8217;s own data model, so this candidate goes one step further and cross-references the actual <a href=\"https:\/\/schemas.opengis.net\/citygml\/\">OGC CityGML 3.0 XML Schema<\/a> to promote real, typed, documented properties in place of the open bag: coded classification fields (<code>class<\/code>, <code>function<\/code>, <code>usage<\/code>, <code>roofType<\/code>), storey counts and heights, a qualified <code>height<\/code> structure (CityGML 3.0&#8217;s structured replacement for the classic flat <code>measuredHeight<\/code>), vegetation attributes (<code>species<\/code>, <code>trunkDiameter<\/code>, <code>crownDiameter<\/code>, &#8230;), and three real closed enumerations resolved directly from the XSD (<code>conditionOfConstruction<\/code>, <code>height[].status<\/code>, <code>trafficDirection<\/code>). Every model keeps a residual <code>genericAttributes<\/code> property too \u2014 but that maps to CityGML&#8217;s own formal generic-attribute extension mechanism, not an invented catch-all.<\/p>\n<p>Three modeling decisions were made deliberately, not incidentally:<\/p>\n<ul>\n<li><strong>Geometry is flattened per Level of Detail.<\/strong> CityJSON stores vertices once in a document-level shared array and each Geometry entry references them by index, with an independent LoD per entry (a City Object can carry several simultaneously). Each model exposes up to four GeoProperties \u2014 <code>geometryLoD0<\/code> through <code>geometryLoD3<\/code> \u2014 holding real, dereferenced GeoJSON coordinates for whichever LoD the source data provides. Solid\/MultiSolid primitives (CityJSON&#8217;s 3D volumes) are simplified to GeoJSON MultiPolygon, since GeoJSON has no native 3D solid type; surface <code>semantics<\/code>, <code>material<\/code>, and <code>texture<\/code> metadata is not carried into the GeoProperty.<\/li>\n<li><strong>No invented RDF vocabulary.<\/strong> CityJSON, unlike an OWL ontology, doesn&#8217;t publish per-property IRIs. Structural <code>context.jsonld<\/code> entries (geometry, parents\/children, &#8230;) mint IRIs under CityJSON&#8217;s own schema <code>$id<\/code> namespace; the newly-promoted typed attributes mint IRIs under each model&#8217;s real CityGML 3.0 module XML namespace instead \u2014 both documented as conventions, not presented as something either spec formally declares at that exact granularity.<\/li>\n<li><strong>Coded values stay open.<\/strong> <code>gml:CodeType<\/code> attributes (<code>class<\/code>, <code>function<\/code>, <code>usage<\/code>, <code>roofType<\/code>, <code>species<\/code>) are typically drawn from OGC-published code lists; those lists weren&#8217;t resolved to closed enums in this pass, so these remain open strings with a note \u2014 a documented follow-up, not a silent gap.<\/li>\n<\/ul>\n<h2 id=\"note-on-scope\">Note on scope<\/h2>\n<p>This candidate covers <strong>CityJSON<\/strong>, which is explicitly documented as &#8220;a subset of the OGC CityGML data model&#8221; \u2014 not the full CityGML standard (a separate XML\/GML\/UML specification with its own ADE extension mechanism and modules CityJSON doesn&#8217;t carry). If full CityGML fidelity is needed, that&#8217;s a distinct, larger translation task from a different source spec.<\/p>\n<h2 id=\"try-it-and-tell-us-whats-missing\">Try it, and tell us what&#8217;s missing<\/h2>\n<p>This is a <strong>Candidate<\/strong> \u2014 a first, carefully-sourced translation, not yet promoted to an official Smart Data Models subject. Before that step:<\/p>\n<ul>\n<li>Overlap with existing Smart Data Models building-related subjects hasn&#8217;t been checked in detail.<\/li>\n<li>License terms (CC0-1.0 per the specs repo&#8217;s own <code>LICENSE<\/code> file) should be reconfirmed for the specific release before promotion.<\/li>\n<li>CityGML&#8217;s own code lists (<a href=\"http:\/\/schemas.opengis.net\/citygml\/codelists\/\">schemas.opengis.net\/citygml\/codelists\/<\/a>) aren&#8217;t cross-referenced yet \u2014 resolving them would turn the remaining open <code>class<\/code>\/<code>function<\/code>\/<code>usage<\/code>\/<code>roofType<\/code>\/<code>species<\/code> strings into real closed enums, the same way <code>conditionOfConstruction<\/code>\/<code>trafficDirection<\/code> already are.<\/li>\n<\/ul>\n<p>Browse the models, open an issue, or send a PR: \ud83d\udc49 <strong><a href=\"https:\/\/github.com\/smart-data-models\/Candidates\/tree\/master\/standards\/cityjson-v2\/models\">https:\/\/github.com\/smart-data-models\/Candidates\/tree\/master\/standards\/cityjson-v2<\/a><\/strong><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Smart Data Models&#8217; Candidates repository now includes a new candidate standard, cityjson-v2, translated from CityJSON v2.0.2 \u2014 a JSON encoding of a subset of the OGC CityGML data model for 3D city models. All 33 core City Object types defined in cityjson\/specs&#8216; schemas\/cityobjects.schema.json now have an NGSI-LD \/ NGSI-v2 representation&#8230;. <a class=\"continue-reading-link\" href=\"https:\/\/smartdatamodels.org\/index.php\/cityjson-ciutygml-joins-smart-data-models-33-candidate-models-for-3d-city-objects\/\">More&#8230;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[107],"tags":[],"class_list":["post-40895","post","type-post","status-publish","format-standard","hentry","category-smart-cities"],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":40343,"url":"https:\/\/smartdatamodels.org\/index.php\/gaia-x-ontology-joins-smart-data-models-165-candidate-models-for-cloud-connectivity-trust\/","url_meta":{"origin":40895,"position":0},"title":"Gaia-X Ontology Joins Smart Data Models: 165 Candidate Models for Cloud, Connectivity &#038; Trust","author":"maestro","date":"20\/08\/2026","format":false,"excerpt":"Smart Data Models' Candidates repository now includes a new candidate standard, gaiax-ontology-v2111, translated from the Gaia-X ontology v2111 \u2014 the vocabulary behind Self-Descriptions in Gaia-X federated data spaces and cloud ecosystems. All 165 classes published at docs.gaia-x.eu\/ontology\/v2111\/classes now have an NGSI-LD \/ NGSI-v2 representation. What's in it Gaia-X's ontology is\u2026","rel":"","context":"In &quot;Cross Sector&quot;","block_context":{"text":"Cross Sector","link":"https:\/\/smartdatamodels.org\/index.php\/category\/cross-sector\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/smartdatamodels.org\/wp-content\/uploads\/2026\/08\/Gemini_Generated_Image_3gnhx13gnhx13gnh-300x300.jpeg?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":39748,"url":"https:\/\/smartdatamodels.org\/index.php\/39748\/","url_meta":{"origin":40895,"position":1},"title":"European Union Agency for Railways (ERA) available in the candidates repository","author":"maestro","date":"12\/08\/2026","format":false,"excerpt":"Smart Data Models' Candidates repository now includes four new candidate standards translated from the European Union Agency for Railways (ERA) Ontology v3.3.3 \u2014 the shared data model behind the EU's four railway interoperability registers. Together they bring 74 entity types covering the physical rail network, authorised rolling stock, certification records,\u2026","rel":"","context":"In &quot;SmartLogistics&quot;","block_context":{"text":"SmartLogistics","link":"https:\/\/smartdatamodels.org\/index.php\/category\/smartlogistics\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/smartdatamodels.org\/wp-content\/uploads\/2026\/08\/Gemini_Generated_Image_1ddht51ddht51ddh-300x300.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":10263,"url":"https:\/\/smartdatamodels.org\/index.php\/metadata-of-the-catalogue-available\/","url_meta":{"origin":40895,"position":2},"title":"Metadata of the catalogue available","author":"maestro","date":"01\/02\/2024","format":false,"excerpt":"Now in the tools menu (currently the last option) you have a complete list of the most relevant links to the assets of the data models compile in the Smart Data Models initiative. You can check in the main menu -> Tools\u00a0 -> Metadata of the data models The information\u2026","rel":"","context":"In &quot;Cross Sector&quot;","block_context":{"text":"Cross Sector","link":"https:\/\/smartdatamodels.org\/index.php\/category\/cross-sector\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":7053,"url":"https:\/\/smartdatamodels.org\/index.php\/presentations-of-the-smart-data-models-session-at-fiware-summit\/","url_meta":{"origin":40895,"position":3},"title":"Presentations of the Smart Data Models session at FIWARE summit","author":"maestro","date":"15\/09\/2022","format":false,"excerpt":"Here you can have the presentation of the people presenting at the Smart Data Models session of the FIWARE summit. 1.- Fernando Lopez (FIWARE Foundation) SDMX towards context information: achieving interoperability 2.- David Garcia (NTT Data) Public resources monitoring and management through innovative solutions based on extension of smart data\u2026","rel":"","context":"In &quot;Cross Sector&quot;","block_context":{"text":"Cross Sector","link":"https:\/\/smartdatamodels.org\/index.php\/category\/cross-sector\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":636,"url":"https:\/\/smartdatamodels.org\/index.php\/automatic-creation-of-examples\/","url_meta":{"origin":40895,"position":4},"title":"Automatic creation of examples","author":"maestro","date":"10\/09\/2020","format":false,"excerpt":"In order to reduce the amount of work in the contribution of data models, we have a script that generates the key-values format of a normalized NGSI LD payload. It has been operated on 46 data models currently in the repository. In a close future instead of submitting 4 examples,\u2026","rel":"","context":"In &quot;Cross Sector&quot;","block_context":{"text":"Cross Sector","link":"https:\/\/smartdatamodels.org\/index.php\/category\/cross-sector\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":32325,"url":"https:\/\/smartdatamodels.org\/index.php\/besser-smart-data-json-schema-generator\/","url_meta":{"origin":40895,"position":5},"title":"BESSER Smart Data JSON Schema Generator","author":"maestro","date":"27\/02\/2026","format":false,"excerpt":"Overview The tool automates the generation of Smart Data Models (SDM) from visual models, bridging the gap between high-level domain design and technical implementation for Digital Twins and IoT ecosystems. Technical Workflow Input: Users define domain entities and relationships using B-UML (a simplified UML dialect) within the BESSER Pearl editor.\u2026","rel":"","context":"In &quot;Cross Sector&quot;","block_context":{"text":"Cross Sector","link":"https:\/\/smartdatamodels.org\/index.php\/category\/cross-sector\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/posts\/40895","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/comments?post=40895"}],"version-history":[{"count":1,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/posts\/40895\/revisions"}],"predecessor-version":[{"id":40896,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/posts\/40895\/revisions\/40896"}],"wp:attachment":[{"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/media?parent=40895"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/categories?post=40895"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/tags?post=40895"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}