Features - CityJSON

specstableimplcandidate

Encode CityGML building features (LoD1, LoD2) as CityJSON.

Scope

The module Features CityJSON adds support for CityJSON 1.0 and 1.1 as a feature encoding. Supported are the feature types Building and BuildingPart.

Limitations

Support is restricted to LoD1 and LoD2 buildings with building parts. All other object types including Appearance objects are not supported.

Conformance Classes

Features - CityJSON implements support for CityJSON 1.0open in new window and CityJSON 1.1open in new window.

Configuration

Prerequisites

The module requires that the feature provider includes a type building that is mapped to a CityJSON Building feature. Properties of the type building are mapped to CityJSON as follows:

  • consistsOfBuildingPart: The value must be an object with the same properties as building.
    The object is encoded as a BuildingPart feature of the Building feature.
  • address: The value must be an array of address objects. The following attributes are mapped
    to an Address object, all other properties are ignored:
    • multiPoint: a MULTI_POINT geometry representing the address location
    • ThoroughfareName: a string
    • ThoroughfareNumber: a string
    • LocalityName: a string
    • PostalCode: a string
    • AdministrativeArea: a string
    • CountryName: a string
  • lod1Solid: a closed MULTI_POLYGON geometry that represents the shell of the building at LoD 1.
  • lod2Solid: a closed MULTI_POLYGON geometry that represents the shell of the building at LoD 2.
  • surfaces: an array of semantic surface objects. The object must have a surfaceType and the
    values must be one of the following: CeilingSurface, ClosureSurface, Door, FloorSurface,
    GroundSurface, InteriorWallSurface, OuterCeilingSurface, OuterFloorSurface, RoofSurface,
    WallSurface, or Window. The object should have a property with a POLYGON or MULTI_POLYGON
    geometry that represents the surface geometry.
  • all other properties: The property will be mapped to a CityJSON attribute, except for gml_id properties.

The property of the building with the role ID will be used as the CityJSON id. Since the embedded building parts do not have a property with a role ID, the building part feature will use the value of a property id as the id of the CityJSON building part, otherwise a UUID will be generated. If id is provided, its values must be unique.

The example includes a sample type definition for the building features in a PostgreSQL feature provider based on the CityGML profile of the German surveying and mapping authorities.

Options

NameDefaultDescriptionTypeSince
buildingBlock
Always CITY_JSON.
string
v2.0
extensionType
Deprecated See buildingBlock.
string
v2.0
enabled
false
Enable the building block?
boolean
v2.0
transformations
{}
Property transformations do not affect data sources, they are applied on-the-fly as part of the encoding. Filter expressions do not take transformations into account, they have to be based on the source values. That means queryable properties (see queryables in Features) should not use transformations in most cases. The exception to the rule is the HTML encoding, where readability might be more important than filter support.
object
v2.0
textSequences
false
Enables support for CityJSON text sequences (media type application/city+json-seq). Requires version 1.1 or later.
boolean
v3.3
version
V11
Select the CityJSON version that should be returned. Supported versions are V10 (CityJSON 1.0) and V11 (CityJSON 1.1).
string
v3.3

Examples

API:


- buildingBlock: CITY_JSON
  enabled: true
  textSequences: false
  version: V11

Feature Provider:


types:
  building:
    label: Gebäude
    sourcePath: /building{filter=fk_buildingpart_parent IS NULL}
    type: OBJECT
    objectType: Building
    properties:
      id:
        label: Objekt-ID
        sourcePath: id
        type: INTEGER
        role: ID
      gml_id:
        label: ALKIS-ID
        sourcePath: gml_id
        type: STRING
      name:
        label: Name
        description: 'Nur bei Gebäudeeigennamen gesetzt.'
        sourcePath: feature_name
        type: STRING
      bbox:
        label: Bounding Box
        sourcePath: envelope
        type: GEOMETRY
        geometryType: POLYGON
        role: PRIMARY_GEOMETRY
      lod12GroundSurface:
        label: Grundfläche
        sourcePath: lod12groundsurface
        type: GEOMETRY
        geometryType: MULTI_POLYGON
      measuredHeight:
        label: Gebäudehöhe [m]
        description: 'Höhe des Gebäudes aus der Differenz in Metern zwischen dem höchsten Bezugspunkt und dem tiefsten Bezugspunkt des Gebäudes.'
        sourcePath: measuredheight
        type: FLOAT
      storeysAboveGround:
        label: Geschosse
        sourcePath: storeysaboveground
        type: INTEGER
      roofType:
        label: Dachform
        description: 'Die Bedeutung der einzelnen Werte ergibt aus der Codelist <a href="https://repository.gdi-de.org/schemas/adv/citygml/Codelisten/RoofTypeTypeAdV.xml" target="_blank" >RoofTypeTypeAdV.xml</a>.'
        sourcePath: rooftype
        type: STRING
        constraints:
          codelist: RoofType
      creationDate:
        label: Erzeugungsdatum
        sourcePath: creation
        type: DATE
        role: PRIMARY_INSTANT
      function:
        label: Gebäudefunktion
        description: 'Die Bedeutung der einzelnen Werte ergibt aus der Codelist <a href="https://repository.gdi-de.org/schemas/adv/citygml/Codelisten/BuildingFunctionTypeAdV.xml" target="_blank" >BuildingFunctionTypeAdV.xml</a>.'
        sourcePath: function
        type: STRING
        constraints:
          codelist: BuildingFunctionType
      externalReferences:
        label: Fachdatenverbindungen
        sourcePath: '[id=fk_feature]extref_building{sortKey=name}'
        type: OBJECT_ARRAY
        properties:
          name:
            label: Bezeichnung
            sourcePath: name
            type: STRING
          informationSystem:
            label: Informationssystem
            sourcePath: informationsystem
            type: STRING
      bezugspunktDach:
        label: Bezugspunkt Dach
        sourcePath: '[id=fk_feature]att_string_building{filter=name=''BezugspunktDach''}{sortKey=name}/value'
        type: STRING
        constraints:
          codelist: BezugspunktDach
      datenquelleBodenhoehe:
        label: Datenquelle Bodenhöhe
        sourcePath: '[id=fk_feature]att_string_building{filter=name=''DatenquelleBodenhoehe''}{sortKey=name}/value'
        type: STRING
        constraints:
          codelist: DatenquelleBodenhoehe
      datenquelleDachhoehe:
        label: Datenquelle Dachhöhe
        sourcePath: '[id=fk_feature]att_string_building{filter=name=''DatenquelleDachhoehe''}{sortKey=name}/value'
        type: STRING
        constraints:
          codelist: DatenquelleDachhoehe
      datenquelleLage:
        label: Datenquelle Lage
        sourcePath: '[id=fk_feature]att_string_building{filter=name=''DatenquelleLage''}{sortKey=name}/value'
        type: STRING
        constraints:
          codelist: DatenquelleLage
      gemeindeschluessel:
        label: Gemeindeschlüssel
        sourcePath: '[id=fk_feature]att_string_building{filter=name=''Gemeindeschluessel''}{sortKey=name}/value'
        type: STRING
      address:
        label: Adresse
        sourcePath: '[id=fk_feature]address{sortKey=id}'
        type: OBJECT_ARRAY
        properties:
          id:
            label: Objekt-ID
            sourcePath: id
            type: INTEGER
            transformations:
              remove: ALWAYS
          multiPoint:
            sourcePath: multipoint
            type: GEOMETRY
            geometryType: MULTI_POINT
            forcePolygonCCW: false
          ThoroughfareName:
            label: Straße
            sourcePath: street
            type: STRING
          ThoroughfareNumber:
            label: Hausnummer
            sourcePath: code
            type: STRING
          PostalCode:
            label: Postleitzahl
            sourcePath: postalcode
            type: STRING
          LocalityName:
            label: Stadt
            sourcePath: city
            type: STRING
          AdministrativeArea:
            label: Verwaltungsbezirk
            sourcePath: administrativearea
            type: STRING
          CountryName:
            label: Land
            sourcePath: country
            type: STRING
      lod1Solid:
        label: Geometrie (LoD 1)
        sourcePath: lod1solid
        type: GEOMETRY
        geometryType: MULTI_POLYGON
        forcePolygonCCW: false
      lod1TerrainIntersection:
        sourcePath: lod1terrainintersection
        type: GEOMETRY
        geometryType: MULTI_LINE_STRING
        forcePolygonCCW: false
      lod2Solid:
        label: Geometrie (LoD 2)
        sourcePath: lod2solid
        type: GEOMETRY
        geometryType: MULTI_POLYGON
        forcePolygonCCW: false
      surfaces:
        label: Begrenzungsflächen (LoD 2)
        sourcePath: '[id=fk_feature]building_surface{sortKey=gml_id}'
        type: OBJECT_ARRAY
        properties:
          gml_id:
            label: ID
            sourcePath: gml_id
            type: STRING
          creationDate:
            label: Erzeugungsdatum
            sourcePath: creation
            type: DATE
            transformations:
              dateFormat: 'yyyy-MM-dd'
          surfaceType:
            label: Flächentyp
            sourcePath: surface_type
            type: STRING
          lod2MultiSurface:
            label: Geometrie (LoD 2)
            sourcePath: geom
            type: GEOMETRY
            geometryType: MULTI_POLYGON
            forcePolygonCCW: false
      lod2TerrainIntersection:
        sourcePath: lod2terrainintersection
        type: GEOMETRY
        geometryType: MULTI_LINE_STRING
        forcePolygonCCW: false
      fk_buildingpart_parent:
        label: Gebäude-Objekt-ID
        sourcePath: fk_buildingpart_parent
        type: INTEGER
      consistsOfBuildingPart:
        label: Gebäudeteile
        sourcePath: '[id=fk_buildingpart_parent]building'
        type: OBJECT_ARRAY
        objectType: BuildingPart
        properties:
          id:
            label: Objekt-ID
            sourcePath: id
            type: INTEGER
          gml_id:
            label: ALKIS-ID
            sourcePath: gml_id
            type: STRING
          name:
            label: Name
            sourcePath: feature_name
            type: STRING
          lod12GroundSurface:
            sourcePath: lod12groundsurface
            type: GEOMETRY
            geometryType: MULTI_POLYGON
          measuredHeight:
            label: Gebäudehöhe [m]
            sourcePath: measuredheight
            type: FLOAT
          storeysAboveGround:
            label: Geschosse
            sourcePath: storeysaboveground
            type: INTEGER
          roofType:
            label: Dachform
            description: 'Die Bedeutung der einzelnen Werte ergibt aus der Codelist <a href="https://repository.gdi-de.org/schemas/adv/citygml/Codelisten/RoofTypeTypeAdV.xml" target="_blank" >RoofTypeTypeAdV.xml</a>.'
            sourcePath: rooftype
            type: STRING
            constraints:
              codelist: RoofType
          creationDate:
            label: Erzeugungsdatum
            sourcePath: creation
            type: DATE
          function:
            label: Gebäudefunktion
            sourcePath: function
            type: STRING
            constraints:
              codelist: BuildingFunctionType
          externalReferences:
            label: Fachdatenverbindungen
            sourcePath: '[id=fk_feature]extref_building{sortKey=name}'
            type: OBJECT_ARRAY
            properties:
              name:
                label: Bezeichnung
                sourcePath: name
                type: STRING
              informationSystem:
                label: Informationssystem
                sourcePath: informationsystem
                type: STRING
          bezugspunktDach:
            label: Bezugspunkt Dach
            sourcePath: '[id=fk_feature]att_string_building{filter=name=''BezugspunktDach''}{sortKey=name}/value'
            type: STRING
            constraints:
              codelist: BezugspunktDach
          datenquelleBodenhoehe:
            label: Datenquelle Bodenhöhe
            sourcePath: '[id=fk_feature]att_string_building{filter=name=''DatenquelleBodenhoehe''}{sortKey=name}/value'
            type: STRING
            constraints:
              codelist: DatenquelleBodenhoehe
          datenquelleDachhoehe:
            label: Datenquelle Dachhöhe
            sourcePath: '[id=fk_feature]att_string_building{filter=name=''DatenquelleDachhoehe''}{sortKey=name}/value'
            type: STRING
            constraints:
              codelist: DatenquelleDachhoehe
          datenquelleLage:
            label: Datenquelle Lage
            sourcePath: '[id=fk_feature]att_string_building{filter=name=''DatenquelleLage''}{sortKey=name}/value'
            type: STRING
            constraints:
              codelist: DatenquelleLage
          address:
            label: Adresse
            sourcePath: '[id=fk_feature]address{sortKey=id}'
            type: OBJECT_ARRAY
            properties:
              id:
                label: Objekt-ID
                sourcePath: id
                type: INTEGER
                transformations:
                  remove: ALWAYS
              multiPoint:
                sourcePath: multipoint
                type: GEOMETRY
                geometryType: MULTI_POINT
                forcePolygonCCW: false
              ThoroughfareName:
                label: Straße
                sourcePath: street
                type: STRING
              ThoroughfareNumber:
                label: Hausnummer
                sourcePath: code
                type: STRING
              PostalCode:
                label: Postleitzahl
                sourcePath: postalcode
                type: STRING
              LocalityName:
                label: Stadt
                sourcePath: city
                type: STRING
              AdministrativeArea:
                label: Verwaltungsbezirk
                sourcePath: administrativearea
                type: STRING
              CountryName:
                label: Land
                sourcePath: country
                type: STRING
          lod1Solid:
            label: Geometrie (LoD 1)
            sourcePath: lod1solid
            type: GEOMETRY
            geometryType: MULTI_POLYGON
            forcePolygonCCW: false
          lod1TerrainIntersection:
            sourcePath: lod1terrainintersection
            type: GEOMETRY
            geometryType: MULTI_LINE_STRING
            forcePolygonCCW: false
          lod2Solid:
            label: Geometrie (LoD 2)
            sourcePath: lod2solid
            type: GEOMETRY
            geometryType: MULTI_POLYGON
            forcePolygonCCW: false
          surfaces:
            label: Begrenzungsflächen (LoD 2)
            sourcePath: '[id=fk_feature]building_surface{sortKey=gml_id}'
            type: OBJECT_ARRAY
            properties:
              gml_id:
                label: ID
                sourcePath: gml_id
                type: STRING
              creationDate:
                label: Erzeugungsdatum
                sourcePath: creation
                type: DATE
                transformations:
                  dateFormat: 'yyyy-MM-dd'
              surfaceType:
                label: Flächentyp
                sourcePath: surface_type
                type: STRING
              lod2MultiSurface:
                label: Geometrie (LoD 2)
                sourcePath: geom
                type: GEOMETRY
                geometryType: MULTI_POLYGON
                forcePolygonCCW: false
          lod2TerrainIntersection:
            sourcePath: lod2terrainintersection
            type: GEOMETRY
            geometryType: MULTI_LINE_STRING
            forcePolygonCCW: false
          fk_buildingpart_parent:
            label: Gebäude-Objekt-ID
            sourcePath: fk_buildingpart_parent
            type: INTEGER
            transformations:
              remove: ALWAYS