Article publié en janvier 2020. Les versions citées (PostgreSQL 12, PostGIS 3, 3DCityDB 4.2) sont celles de l'époque ; les outils ont évolué depuis.
Le CityGML est une norme pour la représentation d'une ville au format XML. Et quoi de plus sympa, à l'heure de l'IoT et autres technos, que de disposer d'une ville entière en 3D dans nos applications ?
L'objectif de cet article est de réaliser un petit pipeline de traitement du CityGML : importation d'un modèle de ville, affichage en 3D et exploration de l'élégante structure de données mise à disposition par les concepteurs de cette norme.

Pour réaliser notre intégration, nous importerons le CityGML de la ville de Lyon dans une base de données PostgreSQL / PostGIS. Cette étape sera réalisée avec l'outil open source 3DCityDB (3dcitydb.org). 3DCityDB permet d'intégrer automatiquement le modèle de la ville dans une structure de tables sémantiquement riche et exploitable par des applications tierces.
Installation de PostgreSQL / PostGIS
Nous devons installer un serveur PostgreSQL 12 sur notre machine (Windows pour cet article) : enterprisedb.com. Pas de panique si vous avez une version 9, cela devrait fonctionner.
À l'aide de pgAdmin, créer une base city3D_RGF93 et une autre city3D_WGS84. Ajouter aux deux bases l'extension PostGIS avec CREATE EXTENSION postgis;. Si vous avez installé comme moi la version 3 de PostGIS, il faut aussi ajouter l'extension raster à la main : CREATE EXTENSION postgis_raster;

La première base permettra d'importer la ville de Lyon dans sa projection native, RGF93. En effet, le fichier CityGML est donné dans ce système de coordonnées :

Le SRID RGF93 est défini ici : epsg.io/3946.
La seconde base de données contiendra la ville en projection WGS84, exploitable pour un affichage sur le globe terrestre. J'utilise ici deux bases pour faire rapidement un changement de système de coordonnées de RGF93 vers WGS84. D'autres méthodes existent pour faire ça, n'en doutons pas :)
Installation de 3DCityDB
Maintenant que nos bases de données existent, il faut installer l'outil 3DCityDB pour permettre l'import / export CityGML. Télécharger son installateur ici : 3dcitydb.org/3dcitydb/downloads.
Lancer 3DCityDB-Importer-Exporter-4.2.0-Setup.jar et installer l'application.
Suivre ensuite la procédure d'initialisation de nos bases de données PostgreSQL au chapitre « 3.3.4 Installation steps on PostgreSQL » du manuel utilisateur, situé dans le dossier 3DCityDB-Importer-Exporter\manual. C'est extrêmement simple : il suffit de modifier le fichier CONNECTION_DETAILS situé dans le dossier 3DCityDB-Importer-Exporter\3dcitydb\postgresql\ShellScripts\Windows.
Attention : il faut faire ces opérations pour les deux bases, city3D_RGF93 et city3D_WGS84.
PGBIN=E:\Program Files\PostgreSQL\12\bin
PGHOST=localhost
PGPORT=5432
CITYDB=city3D_RGF93
PGUSER=postgres
Exécuter le script CREATE_DB en utilisant le SRID 3946 :
Faire la même chose avec la base city3D_WGS84, sans oublier de changer le contenu du fichier CONNECTION_DETAILS. Pour cette base, le SRID est 4326. Voilà, nos deux bases sont prêtes à recevoir des données !
Easy…
Importer la ville de Lyon
Télécharger maintenant la ville de Lyon à l'adresse suivante : maquette 3D texturée de Lyon 1er arrondissement (data.gouv.fr). Seul le fichier LYON_1ER_2015.zip sera utile pour cet article. Décompresser l'archive n'importe où sur votre disque.
Lancer le programme d'import / export 3DCityDB situé sous \3DCityDB-Importer-Exporter\bin :

Puis, dans le menu Preferences → Database → Reference systems, ajouter deux systèmes de référence comme suit :


Dans le menu Database, ajouter deux connexions vers nos bases :


Ensuite, importer votre ville dans la base city3D_RGF93 :
Puis exporter notre base RGF93 en CityGML WGS84, avec l'onglet Export :
Et enfin, importer le CityGML WGS84 dans notre base WGS84 :
Easy…
Exploration SQL
La base de données 3DCityDB est très bien faite. Elle peut sembler complexe au premier abord, mais il suffit de lire le chapitre 2.3.3.2 Core Model pour appréhender rapidement sa structure.
Tous les objets sont dans la table citydb.cityobject. Chaque enregistrement de cette table possède un type, qui permet de savoir à quel genre d'objet on a affaire. L'ensemble des classes est défini par l'énumération OBJECTCLASS. Par exemple, la classe numéro 26 correspond à un bâtiment :

Donc, si on veut lister l'ensemble des bâtiments, il suffit de faire la requête suivante :
SELECT * FROM citydb.cityobject WHERE objectclass_id = 26;
Pour avoir la liste des polygones 3D d'un bâtiment, nous pouvons interroger la table citydb.surface_geometry :
SELECT citydb.surface_geometry.id, ST_AsText(geometry)
FROM citydb.surface_geometry
WHERE cityobject_id = 85;
Et ainsi de suite. À noter que la base gère, entre autres, les niveaux de détail (Level of Detail, LOD), afin d'optimiser l'affichage dans les moteurs de rendu 3D.
Affichage 3D
L'affichage dans son moteur 3D peut se faire directement par lecture des données en base, ou bien en convertissant le modèle en fichier 3D de type KML.
Exporter le contenu de la base de données city3D_WGS84 au format KML (onglet KML/COLLADA/glTF) :
Télécharger et installer Google Earth Pro sur votre machine (gratuit) : google.com/earth/versions.
Puis importer le fichier KML exporté dans Google Earth :
Easy…
Nous avons juste effleuré les capacités du CityGML et de la plateforme 3DCityDB. Néanmoins, on voit dès à présent que l'intégration d'un pipeline CityGML dans nos outils n'est pas si difficile, et qu'elle peut s'avérer véritablement compétitive !
Pour plus d'informations : LainardFabriceProgramming@outlook.com.