Jumeau Numérique Urbain : L'Standard CityGML
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.
- LOD 0 : Terrain 2.5D (MNT). Usage : Hydrologie.
- LOD 1 : Blocs extrudés ("Shoebox"). Usage : Planification urbaine macro.
- LOD 2 : Toits différenciés. Usage : Potentiel solaire.
- LOD 3 : Façades détaillées (Fenêtres, Portes). Usage : Architecture.
- LOD 4 : Intérieur des bâtiments (BIM). Usage : Gestion de crise.
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.
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")
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.
# 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.
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)