Jumeau Numérique Urbain : L'Standard CityGML

Une ville intelligente n'est pas juste un maillage 3D. C'est une base de données sémantique géospatiale.
Intermédiaire
45 min
CityGML, XML, CesiumJS
"Google Earth vous montre à quoi ressemble la ville. Un Jumeau Numérique CityGML vous dit de quoi elle est faite, combien d'énergie elle consomme, et quel toit est optimal pour le solaire."

1. Le Concept de LOD (Level of Detail)

CityGML structure la ville en 5 niveaux de granularité. Comprendre cela est vital pour choisir la bonne donnée pour le bon usage.

2. Parser CityGML avec Python

CityGML est basé sur XML/GML. C'est verbeux et hiérarchique. Nous utilisons lxml pour naviguer efficacement dans ces fichiers qui peuvent peser des Gigaoctets.

city_parser.py
from lxml import etree

ns = {'core': "http://www.opengis.net/citygml/2.0",
      'bldg': "http://www.opengis.net/citygml/building/2.0",
      'gml': "http://www.opengis.net/gml"}

def parse_buildings(file_path):
    tree = etree.parse(file_path)
    root = tree.getroot()
    
    # Trouver tous les bâtiments
    buildings = root.findall('.//bldg:Building', namespaces=ns)
    
    print(f"Found {len(buildings)} buildings.")
    
    for b in buildings:
        # Extraction hauteur (LOD1/2)
        measured_height = b.find('.//bldg:measuredHeight', namespaces=ns)
        height = float(measured_height.text) if measured_height is not None else 0.0
        print(f"Building Height: {height}m")
Performance: Pour les fichiers > 500Mo, n'utilisez pas etree.parse (qui charge tout en RAM). Préférez etree.iterparse pour une lecture en flux (streaming).

3. De CityGML vers le Web : 3D Tiles

Les navigateurs ne lisent pas le XML de 2 Go. Nous devons convertir notre CityGML en 3D Tiles, un format binaire hiérarchique optimisé pour le streaming WebGL (JSON + binaires .b3dm).

En Python, nous utilisons souvent des wrappers autour de tildeurs C++ comme py3dtiles.

tiler.sh
# Conversion via Py3DTiles CLI
# 1. Convertir CityGML -> Point/Mesh intermédiaire
py3dtiles convert input.gml --out output_tileset/

4. Visualisation avec CesiumJS

Une fois tuilé, le jumeau numérique prend vie dans le navigateur.

viewer.html
const viewer = new Cesium.Viewer('cesiumContainer');

const tileset = viewer.scene.primitives.add(
    new Cesium.Cesium3DTileset({
        url: './output_tileset/tileset.json'
    })
);

tileset.readyPromise.then(function(tileset) {
    viewer.zoomTo(tileset);
    
    # Style conditionnel (Colorer par hauteur)
    tileset.style = new Cesium.Cesium3DTileStyle({
        color: {
            conditions: [
                ['${Height} >= 50', 'color("purple")'],
                ['${Height} >= 20', 'color("red")'],
                ['true', 'color("white")']
            ]
        }
    });
});

C'est ici que la magie opère : des millions de polygones diffusés fluide sur un iPad.

🏙️ Construire la Smart City

Notre cursus "Urban Digital Twin" vous apprend à fusionner CityGML, IoT sensor data et IA pour le pilotage urbain en temps réel.

Rejoindre l'Elite (120h)