Checking of Urban Planning Regulations with GeoSPARQL and BIM SPARQL

EU Accord Project Experience

Vladimir Alexiev, Nataliya Keberle


Urban Planning (Planned Land Use)

  • Cadastral Zones: what can you do with a piece of land
  • Cadastral Parcels: who owns a piece of land
    • Right: UML diagram from INSPIRE PLU
    • Alt-click to zoom/unzoom
  • Based on geospatial geometries (eg polygons)
  • Different coordinate systems: usually engineering survey (northing-easting) are used, not WGS84
  • Topography: terrain (may be important for mountainous cities)

Examples of Land Use Regulations

  • Intended land use (usually hierarchical thesauri)
  • Maximum building height (from reference point to building point)
  • Maximum number of floors
  • Maximum built area
  • Maximum floor space index (depending on plot area)
  • Percent greenery on the roof
  • Percent "natural habitat" (with dead wood etc)
  • Rainwater capture requirements
  • Noise protection on different sides of a building
  • How much a balcony (cantilever) can overhang the street

Use Case: Berlin Tegel

The former Tegel airport (TXL) will be the site of

  • university campus (refurbished airport terminal)
  • startups, production facilities ("tech republic")
  • living quarters, stores, smart mobility hubs, park and recreation areas, etc.

Tegel: Planning Zones

Tegel Project company (owned by City of Berlin) developed detailed urban plans/regulations

Tegel: Detailed Regulations and Nomenclatures

In the building areas, vegetation-covered evaporation beds are to be be created.

The plantings are to be maintained and replanted if they are lost.

The evaporation beds must have an area of at least 4.0 m² per 100.0 m² of roof area and a minimum depth of roof area and a minimum depth of 30 cm.

Tegel: Special Design "Luftgeschoss"

Luftgeschoss (open-sided storey) can be used as a passage into a courtyard

  • Indicated with level=1 ("normal" parts of the building have level=0); doesn't mean it's exactly 1 floor
  • Can be part of a building, or a shared part between two buildings (difficult case)

Use Case: Malgrat de Mar

Cultural Center (refurbishment) and Production Plant (new construction)

Malgrat Data

  • Detailed BIM
  • Detailed Municipal Urban Planning Plan (POUM)
  • Cadaster zones (GML but not CityGML)
  • Topography (GML but not CityGML)

Classification: custom (fields C_QUAL_MUC, D_QUAL_MUC, C_QUAL_AJT, D_QUAL_AJT).

  • Two levels, overly-specific, not harmonized (especially bottom level), eg
l1 level 1 l2 level2
R6 Residential, detached or semi-detached houses 13 Detached house I, minimum plot 160m2
R6 Isolated houses
R6a Isolated houses Plot of 200m2
R6d Secluded houses. Plot of 1,000m2
A1 Economic activity, Industrial 2a Urban industrial zone between dividers
2d2 Isolated tertiary industry type 2 (El Rengle I)
2d3 Isolated tertiary industry. The Bóbila

Malgrat Regulation Checks

Checks are divided in two cases: "stand alone" buildings (the Plant); buildings on a street: surrounded by others and aligned with street grid (the Center)

  • Plot area
  • Plot perimeter
  • Building height
  • Number of floors
  • Presence of network outlets: drinking water, sewer, electricity, gas
  • Specialized: balcony (cantilevered part) does not overhang the street too much, especially for low-floor balconies

The minimum free height of cantilevers over public spaces will be 3.20 metres for vials of 8.00 metres or less and 3.50 metres in all other cases. The maximum dimension of eaves that fly over public spaces is 0.45 meters.

No binding of regulation clauses to zones (yet)

Relevant OGC Foundational Standards

  • GML (Geography Markup Language): UML and XSD schema. Foundation of many OGC standards.
  • GeoSPARQL:
    • Stores geometries as opaque datatyped literals, passed to geospatial engine for indexing
    • Numerous topological relations (Simple Features, RCC8, and Egenhofer): allow quick fetching of regions.
    • Functions: boolean checks, metric computations, aggregate functions
  • CityGML: UML and XSD schema.
    • Everything in a city: buildings, streets, underground infrastructure, furniture, landscape, etc.
    • Different Levels of Detail (LOD)
    • No planned land use
  • CityJSON: JSON schema

Relevant Land Use Standards

XPlan UML Structure: eg BauGebietsTeilFlaeche

"Construction area partial area"

Our Idea: Semantic Data Integration

  • Convert regulation text to semantic form using RASE analysis and ACCORD aec3po ontology
  • Convert BIM data to semantic form
  • Convert planning zone data to semantic form
  • Use GeoSPARQL topological relations to check which buildings fall in which zones.
    • Must also leverage planning zone hierarchies!
  • Attach regulations to buildings
  • Check some regulations using SPARQL and specialized functions (BIM SPARQL)


  • The data is very complex and comes from 3 disciplines (BIM, CIM/cadaster, regulations)
  • Semantics offers a flexible integration approach and semantic databases can ingest all kinds of data
  • SPARQL is a high-level language in which to implement checks

State of Standards

  • GeoSPARQL 1.1 released 12 years after 1.0
    • Supports WKT, GML, KML, GeoJSON and gridded geometry representations: as datatyped literals
    • Can capture 3D (Z coordinate) and linear referencing (M coordinate), but doesn't do anything with them
  • IFC: IfcOwl is part of the standard, but nobody uses it since it's too complex:
    • All relations are Objectified
    • Geometries are represented as lists of EXPRESS objects
    • Geometries are constructive (operations) and not explicit (simple primitives)
  • CityGML in RDF
    • (Work in progress with OGC and CHEK project: F Noardo, M Toscano, A Villar. CityGML3 in CHEK & ACCORD. 128th OGC Meeting, Delft, 26 March 2024)
    • CityGML has a tentative OWL schema (with ShapeChange), but two important flaws:
      • Represents geometries in individual triples; impossible to process efficiently; should use the GeoSPARQL approach
      • Lots of abstract/parasitic classes and props related to Application Domain Extensions (ADE)
    • CityJSON: covers most CityGML features. Quick conversion to RDF by crafting a JSON-LD Context
  • INSPIRE PLU: tentative OWL representation (done with OGC ShapeChange)
  • XPlanung: no ontology but we made semantic conversion (see last)

State of Conversions

BIM (building information) to CIM (city information) is difficult for several reasons:

  • Georeferencing the building to a certain CRS (origin, orientation, units)
  • How to represent geometry: make it explicit, how to store in RDF
  • Conceptual differences between IFC and CityGML
  • Different use cases need different LOD (level of detail) / LOG (level of geometry) / LOIN (level of information need)

GeoBIM Benchmark 2019 provided detailed experience and benchmarking

  • FME Quick Translator
  • FZK Viewer
  • ESRI ArcGIS PRO (Data Interoperability extension)
  • FutureInsight Clearly.BIM
  • IFC2CityGML by U Singapore (but not quite avaialable)
  • ESRI GeoBIM by TU Delft 3D, part of IfcOpenShell's IfcConvert
  • IFC-to-WKT_Converter by Eindhoven U
  • IfcEngine by to convert implicit geometry to explicit vertexes (B-REP), serialize to WKT
  • IFC2WKT by

Yet no commonly accepted mechanism exists!

Example: IFC to LBD and WKT

IFCtoLBD by Jyrki Oraskari. (LBD: Linked Building Data ontologies).

  • Makes WKT bounding boxes for elements and spaces (eg Floors, Walls), but WKT is used improperly
  • Then you can fetch a floor, check its projection on the ground, etc

Semantization of Land Use Data

Excerpts of XSPARQL transformation of XPlan (Alt-click to zoom/unzoom)

# fetch XML data
let $doc       := doc($input)/*/GML:featureMember
for $element in $doc/*[name() != "BP_Bereich"]
let $className := $element/name()
let $id        := fn:replace($element/@GML:id/string(),"^_","")
let $geom      := ($element/X:raeumlicherGeltungsbereich, $element/X:position) # alternatives
let $geo       := if (fn:empty($geom)) then () else fn:concat($id,"/geo")
let $geometry  := if (fn:empty($geom)) then () else XSPARQL:_serialize($geom/*)
let $type      := local:rdf_type($className, $id)

# make RDF triples
construct {
      gml:id {$id};
      rdf:type <{$classType}>;
      xp:plan <{$plan}>;
      geo:hasDefaultGeometry <{$geo}>.
  <{$geo}> a geo:Geometry;
    geo:asGML {$geometry}^^geo:gmlLiteral. # crucial: geometry is captured as literal
    for $property in $element/* return # call function
    local:rdf_property($property/name(),$property/text(), $id)
# map XML elements to RDF classes
declare function local:rdf_type ($className, $id as xs:string) {
  for $type where {
    values ($className1 $type) {
      ("xplan:BP_AbweichungVonBaugrenze"                        "xp:BuildingBoundaryDeviation")
      ("xplan:BP_AbweichungVonUeberbaubarerGrundstuecksFlaeche" "xp:PermissibleLotCoverageDeviation")
    filter ($className1 = $className)
   return $type

# map coded values
declare function local:coded_value ($propName, $value, $id as xs:string) {
  for $prop $ref where {
    values ($propName1                      $prop                         $ref) {
      ("xplan:gegenstand"                   "xp:measureSubject"           "measureSubject/")
      ("xplan:nutzungsForm"                 "xp:usageForm"                "usageForm/")
    filter ($propName1 = $propName)
  construct {<{$id}> <{$prop}> <{fn:concat($ref,$value)}>}

Semantic Land Use Data

Alt-click to zoom/unzoom

   rdf:type                xp:PermissibleLotCoverage;
   geo:hasDefaultGeometry  <GML_04538eeb-9d84-4436-ba2c-4d2fe555ab9b/geo>;
   gml:id                  "GML_04538eeb-9d84-4436-ba2c-4d2fe555ab9b";
   xp:floorAreaTotal       "2548"^^xsd:decimal;
   xp:fullStoreys          8;
   xp:heightReference      <GML_002fefc8-f3aa-44db-8939-bdf406bc5554/height>;
   xp:isSurfaceClosed      false;
   xp:legalNature          <legalNature/1000>;
   xp:level                1;
   xp:plan                 <GML_c1979111-6f94-4f90-a7ad-d8061446d21e>;
   xp:plotCoverage         "365"^^xsd:decimal;
   xp:referenceURL         <LandUse/3_49_UeberbaubareGrundstuecksFlaeche> .

  rdf:type   geo:Geometry;
  geo:asGML  """<gml:Curve srsName="EPSG:25833" 
    <gml:segments><gml:LineStringSegment interpolation="linear">
      <gml:posList srsDimension="2" count="3">
        386009.4026 5824695.0777 ..."""^^geo:gmlLiteral .


  • This work was co-funded by the European Union’s Horizon Europe research and innovation programme under grant 101056973 ACCORD.
  • We thank our colleagues from Tegel Project, University of Hamburg, Fraunhofer IBP, LaSalle Universitat Ramon Lull, Ajuntament de Malgrat de Mar, Future Insight, Open Geospatial Consortium for a fruitful collaboration.
  • We thank our colleagues from the "sister" project CHEK for looking for common solutions to data representation problems.