Skip to content

tum-gis/3d-forum-lindau-2025-citygml-workshop

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 

Repository files navigation

CityGML 3.0 – Straßenraummodelle in der neuen 3D City Database

Diese Dokumentation dient als praktische Anleitung für den Workshop CityGML 3.0 – Straßenraummodelle in der neuen 3D City Database auf dem 22. Internationalen 3D Forum Lindau.

Vorraussetzung

Für die Anleitung wird in erster Linie eine Docker-Installation benötigt. Um zu testen, ob die Installation von Docker erfolgreich war, kann der folgende Befehl ausgeführt werden:

docker run --rm hello-world

Beispiel-Datensätze

Als Beispiel-Datensätze wird ein kleiner Bereich um die Technische Universität München verwendet, da hier LOD2-Gebäudemodelle vom LDBV, Vegetationsmodelle und ein OpenDRIVE-Datensatz im Rahmen des TUM2TWIN-Projekts zur Verfügung stehen.

Die Beispiel-Datensätze für diese Anleitung können unter folgendem Link heruntergeladen werden: LRZ Sync+Share. Die Datensätze umfassen Gebäudemodelle in CityGML 2.0, Baummodelle in CityGML 2.0 und das Straßennetz als OpenDRIVE-Datensatz.

├── Baummodelle
│   └── Arcisstr_CityGML_Trees.gml
├── Gebaudemodelle
│   ├── 690_5334.gml
│   └── 690_5336.gml
└── Strassenraummodelle
    └── TUM_CentralCampus.xodr

Außerdem beinhaltet der Ordner bereits die nach CityGML 3.0 konvertierten Datensätze, damit die Konvertierungsschritte optional übersprungen werden können.

Konvertierung der Gebäudemodelle von CityGML 2.0 nach 3.0

Die Migration von existierenden Gebäudemodellen in CityGML 2.0 zu Version 3.0 funktioniert mit dem Kommandozeilen-Werkzeug citygml-tools mit folgendem Befehl:

docker run --rm -v /pfad/zu/Gebaudemodelle:/data citygml4j/citygml-tools upgrade "*.gml"

Wird ein Pfad zu einem Ordner angegeben, iteriert das Werkzeug rekursiv über alle CityGML-Datensätze und erstellt einen entsprechenden CityGML 3.0 Datensatz mit dem Suffix __v3.gml.

Konvertierung der Baummodelle von CityGML 2.0 nach 3.0

Analog können die Baummodelle von CityGML 2.0 zu CityGML 3.0 konvertiert werden:

docker run --rm -v /pfad/zu/Baummodelle:/data citygml4j/citygml-tools upgrade "*.gml"

Konvertierung Straßenraummodell

Mit dem Open-Source-Werkzeug r:trån können OpenDRIVE-Datensätze nach CityGML 3.0 konvertiert werden. Zuerst kann das Werkzeug geklont werden:

git clone [email protected]:tum-gis/rtron.git
cd rtron

Anschließend wird Kompilierung mit folgendem Befehl durchgeführt:

.\gradlew shadowJar

Mit folgendem Befehl kann abschließend der OpenDRIVE-Datensatz nach CityGML 3.0 konvertiert werden, wobei die Pfade zuerst angepasst werden müssen:

java -jar ./rtron-cli/build/libs/rrtron*.jar opendrive-to-citygml 
    --plan-view-geometry-distance-tolerance 10.0
    --plan-view-geometry-angle-tolerance 10.0
    --reproject-model
    --crs-epsg 25832
    --add-offset 0.0 0.0 514.92
    --compression-format NONE
    --remove-road-object-of-type TREE
    /pfad/zum/opendrive/ordner 
    /pfad/zum/citygml/ordner 

Der resultierende CityGML-3.0-Datensatz kann mit dem FME Data Inspector geöffnet und inspiziert werden:

FME Straßenraummodell

3D City Database

Die 3D City Database ist eine Open-Source-Geodatenbank zur Speicherung, Repräsentation und Verwaltung von semantischen 3D-Stadtmodellen. Die neue Version 5.0 unterstützt CityGML 3.0 und wurde am 17.03.2025 veröffentlicht. Alle Details sind in der neuen Dokumentation beschrieben.

Inbetriebnahme der Datenbank

Die 3DCityDB kann als Docker-Container mit dem folgenden Befehl gestartet werden.

Windows:

docker run --name 3dcitydbv5 -p 5432:5432 -d `
    -v C:\pfad\zu\lokalen\postgres-data:/var/lib/postgresql/data `
    -e SRID=25832 `
    -e SRS_NAME="urn:adv:crs:ETRS89_UTM32*DE_DHHN2016_NH" `
    -e POSTGRES_DB=citydb `
    -e POSTGRES_USER=postgres `
    -e POSTGRES_PASSWORD=changeMe `
    -e PROJ_NETWORK=ON `
    -e POSTGIS_SFCGAL=true `
  3dcitydb/3dcitydb-pg

Unix:

docker run --name 3dcitydbv5 -p 5432:5432 -d \
    -v /pfad/zu/lokalen/postgres-data:/var/lib/postgresql/data \
    -e SRID=25832 \
    -e SRS_NAME="urn:adv:crs:ETRS89_UTM32*DE_DHHN2016_NH" \
    -e POSTGRES_DB=citydb \
    -e POSTGRES_USER=postgres \
    -e POSTGRES_PASSWORD=changeMe \
    -e PROJ_NETWORK=ON \
    -e POSTGIS_SFCGAL=true \
  3dcitydb/3dcitydb-pg

Erklärung der Argumente, welche in der Dokumentation beschrieben sind:

  • -v C:\pfad\zu\lokalen\postgres-data:/var/lib/postgresql/data: Bindet das Daten-Volume in den Ordner C:\pfad\zu\lokalen\postgres-data auf dem Host-System zur Daten-Persistierung ein. Weitere Details finden sich in der Dokumentation zum PostgreSQL-Docker-Image.
  • -e SRID=25832: EPSG:25832 als Koordinatenreferenzsystem
  • -e SRS_NAME="urn:adv:crs:ETRS89_UTM32*DE_DHHN2016_NH": Name des Koordinatenreferenzsystems
  • -e POSTGRES_DB=citydb: Name der Datenbank
  • -e POSTGRES_USER=postgres: Nutzername für die Datenbank
  • -e POSTGRES_PASSWORD=changeMe: Passwort für den Nutzer
  • -e PROJ_NETWORK=ON: Download der PROJ-Netztransformationsgrids, welche für einen Datumswechsel (z.B. WGS84->ETRS89) oder die Ableitung zu 3D Tiles (siehe pg2b3dm) benötigt werden
  • -e POSTGIS_SFCGAL=true: SFCGAL ist eine Bibliothek, welche für die Ausführung einiger PostGIS-Funktionen benötigt wird

Import der CityGML-Datensätze

Der Import und Export von Datensätzen funktionieren mit dem Kommandozeilen-Werkzeug citydb-tool. Das Werkzeug unterstützt den Import und Export von CityGML v1.0 bis 3.0. Für den Import von CityGML-Datensätzen ist folgender Befehl auszuführen.

Windows:

docker run --rm --net=host --name citydb-tool -i -t `
    -e CITYDB_HOST=localhost `
    -e CITYDB_PORT=5432 `
    -e CITYDB_NAME=citydb `
    -e CITYDB_USERNAME=postgres `
    -e CITYDB_PASSWORD=changeMe `
    -v C:\pfad\zu\lokalen\citygml\datensaetzen:/data `
  3dcitydb/citydb-tool import citygml citygml_datei.gml

Unix:

docker run --rm --net=host --name citydb-tool -i -t \
    -e CITYDB_HOST=localhost \
    -e CITYDB_PORT=5432 \
    -e CITYDB_NAME=citydb \
    -e CITYDB_USERNAME=postgres \
    -e CITYDB_PASSWORD=changeMe \
    -v /pfad/zu/lokalen/citygml/datensaetzen:/data \
  3dcitydb/citydb-tool import citygml citygml_datei.gml

Erklärung der Argumente, welche in der Dokumentation beschrieben sind:

  • -e CITYDB_HOST=localhost: Name des Hosts oder IP-Adresse, auf dem/der 3DCityDB ausgeführt wird
  • -e CITYDB_PORT=5432: Port der 3DCityDB, mit dem eine Verbindung hergestellt werden soll
  • -e CITYDB_NAME=citydb: Name der 3DCityDB-Datenbank, mit der eine Verbindung hergestellt werden soll
  • -e CITYDB_USERNAME=postgres: Benutzername, der bei der Verbindung mit der 3DCityDB verwendet werden soll
  • -e CITYDB_PASSWORD=changeMe: Passwort für die Verbindung zur 3DCityDB
  • -v C:\pfad\zu\lokalen\citygml\datensaetzen:/data: Pfad zum lokalen Ordner, welcher die zu importierenden CityGML-Datensätze enthält

Statt einzelner CityGML-Dateien können auch Muster angegeben werden:

  • citygml_datei.gml: Nur die einzelne Datei wird importiert
  • *.gml: Alle GML-Dateien in dem Ordner werden importiert
  • *.zip: Alle GML-Dateien in den ZIP-Archiven, welche in dem Ordner sind, werden importiert
  • **/*.gml: Alle GML-Dateien in sämtlichen Unterordnern werde importiert
  • **/*.zip: Alle GML-Dateien in den ZIP-Archiven in sämtlichen Unterordnern werden importiert

Export der CityGML-Datensätze

Um das Stadtmodell anschließend wieder zu exportieren, kann analog der folgende Befehl ausgeführt werden:

Windows:

docker run --rm --net=host --name citydb-tool -i -t `
    -e CITYDB_HOST=localhost `
    -e CITYDB_PORT=5432 `
    -e CITYDB_NAME=citydb `
    -e CITYDB_USERNAME=postgres `
    -e CITYDB_PASSWORD=changeMe `
    -v C:\pfad\zu\lokalen\citygml\datensaetzen:/data `
  3dcitydb/citydb-tool export citygml --output citygml_datei.gml

Unix:

docker run --rm --net=host --name citydb-tool -i -t \
    -e CITYDB_HOST=localhost \
    -e CITYDB_PORT=5432 \
    -e CITYDB_NAME=citydb \
    -e CITYDB_USERNAME=postgres \
    -e CITYDB_PASSWORD=changeMe \
    -v /pfad/zu/lokalen/citygml/datensaetzen:/data \
  3dcitydb/citydb-tool export citygml --output citygml_datei.gml

Mit dem zusätzlichen Argument --no-appearances können die Objekte ohne Texturen exportiert werden.

Datenbank-Inspektion

Um eine 3DCityDB-Instanz zu inspizieren und zu verwalten, eignen sich Open-Source-Tools wie pgAdmin und DBeaver sowie kommerzielle Alternativen wie JetBrains DataGrip. Insbesondere pgAdmin ist eine etablierte und webbasierte Anwendung, die sich problemlos mit einer laufenden PostgreSQL-Datenbankinstanz verbinden lässt und deren gesamten Inhalt zugänglich macht. Diese Software kann auch über Docker in Betrieb genommen werden:

Windows:

docker run --name pgadmin -p 8080:80 -d `
    -e [email protected] `
    -e PGADMIN_DEFAULT_PASSWORD=postgres ^
    -e PGADMIN_CONFIG_DATA_RESULT_ROWS_PER_PAGE=20000 ^
  dpage/pgadmin4

Unix:

docker run --name pgadmin -p 8080:80 -d \
    -e [email protected] \
    -e PGADMIN_DEFAULT_PASSWORD=postgres \
    -e PGADMIN_CONFIG_DATA_RESULT_ROWS_PER_PAGE=20000 \
  dpage/pgadmin4

Erklärung der Argumente:

  • -e [email protected]: E-Mail-Adresse, die bei der Einrichtung des ersten Administratorkontos für die Anmeldung bei pgAdmin verwendet wird.
  • -e PGADMIN_DEFAULT_PASSWORD=changeMe: Dieses Passwort wird bei der Einrichtung des ersten Administratorkontos für die Anmeldung bei pgAdmin verwendet.
  • -e PGADMIN_CONFIG_DATA_RESULT_ROWS_PER_PAGE=20000: Erhöht die Anzahl an Geometrien, welche in der 2D-Karte angezeigt werden können.

Sobald es gestartet ist, sollten über den Browser auf http://localhost:8080 darauf zugegriffen werden können. Nach der Anmeldung mit den Benutzerdaten sollte sich ein neues Dialogfeld öffnen, wenn auf Add new server geklickt wird:

Registrieren der 3DCityDB-Instanz als neuer Server

Eingabe der Details für die Verbindung zur 3DCityDB-Instanz

Die folgenden Angaben müssen eingegeben werden:

  • Name: Der Name, unter dem der Server registriert werden soll, z. B. 3DCityDB
  • Host name/address: Der Hostname oder die IP, unter der die Datenbank ausgeführt wird, z.B. host.docker.internal falls diese lokal als Docker-Container ausgeführt wird
  • Port: Der Port der Datenbank, z.B. 5432
  • Username: Der Benutzername für die Datenbank, z.B. postgres
  • Password: Das Passwort für die Datenbank, z.B. changeMe

Nach der Verbindung zur 3DCityDB kann zu den 3DCityDB-Tabellen navigiert werden:

Navigation zu den 3DCityDB-Tabellen, die das importierte Stadtobjekt enthalten

Eine Tabelle kann inspiziert werden, indem mit der rechten Maustaste auf den Tabellennamen geklickt und dann View/Edit Data -> First 100 Rows ausgewählt wird:

Inspektion der Feature-Tabelle

SQL-Abfragen auf die 3D City Database

Um die TrafficArea-Objekte in 2D auf der Karte in pgAdmin zu visualisieren, kann der folgende SQL-Befehl ausgeführt werden:

SELECT ST_Transform(ST_Force2D(g.geometry), 4326), *
FROM citydb.feature f
LEFT JOIN objectclass o ON f.objectclass_id = o.id
JOIN geometry_data g ON f.id = g.feature_id
WHERE o.classname = 'TrafficArea';

Eine Visualisierung des TrafficArea-Objekts mit der GML ID UUID_e82e8eb4-61ff-3667-93c5-4f39fea03c90 erfolgt über folgenden Befehl:

SELECT ST_Transform(ST_Force2D(g.geometry), 4326), *
FROM citydb.feature f
LEFT JOIN objectclass o ON f.objectclass_id = o.id
JOIN geometry_data g ON f.id = g.feature_id
WHERE o.classname = 'TrafficArea' AND f.objectid = 'UUID_e82e8eb4-61ff-3667-93c5-4f39fea03c90';

Des Flächeninhalts dieser TrafficArea kann mit folgendem Befehl berechnet werden:

SELECT ST_Area(g.geometry)
FROM citydb.feature f
LEFT JOIN objectclass o ON f.objectclass_id = o.id
JOIN geometry_data g ON f.id = g.feature_id
WHERE o.classname = 'TrafficArea' AND f.objectid = 'UUID_e82e8eb4-61ff-3667-93c5-4f39fea03c90';

Verkehrsräume Volumetrische Repräsentationen der Verkehrsräume mit unterschiedlichen Höhen je nach Funktion (Bildquelle: Road2CityGML3-Guideline)

FME Straßenraummodell und Bäume

Abfrage der Baum-Objekte, welche den TrafficSpace mit GML ID UUID_b7db8487-4312-3269-9fa5-d7475f9a3c1b schneiden:

WITH traffic_spaces AS (
    SELECT
        f.id AS feature_id,
        f.objectid AS objectid,
        g.geometry
    FROM citydb.feature f
    LEFT JOIN objectclass o ON f.objectclass_id = o.id
    JOIN geometry_data g ON f.id = g.feature_id
    WHERE o.classname = 'TrafficSpace'
        AND f.objectid = 'UUID_b7db8487-4312-3269-9fa5-d7475f9a3c1b'
        AND ST_GeometryType(g.geometry) = 'ST_PolyhedralSurface'
    LIMIT 10
),
vegetation_objects AS (
    SELECT
        f.id AS feature_id,
        f.objectid AS objectid,
        g.geometry
    FROM citydb.feature f
    LEFT JOIN objectclass o ON f.objectclass_id = o.id
    JOIN geometry_data g ON f.id = g.feature_id
    WHERE o.classname = 'SolitaryVegetationObject'
)
SELECT
    ts.feature_id AS trafficspace_id,
    ts.objectid AS trafficspace_objectid,
    svo.feature_id AS vegetation_id,
    svo.objectid AS vegetation_objectid,
    ts.geometry AS trafficspace_geom,
    svo.geometry AS vegetation_geom
FROM traffic_spaces ts
JOIN vegetation_objects svo
ON ST_3DIntersects(ts.geometry, svo.geometry);

Weiterführendes Material

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published