Introduction
Pour lire un fichier KML (Keyhole Markup Language, souvent utilisé avec Google Earth) en Python, plusieurs bibliothèques sont disponibles selon vos besoins. Ce guide couvre la lecture, la résolution des problèmes, et la visualisation de fichiers KML avec geopandas
, folium
, ainsi que d'autres bibliothèques comme fastkml
et pykml
.
Générer des fichiers KML factices pour les tests
Pour tester votre code sans fichiers KML réels, vous pouvez créer des fichiers factices.
Fichier KML simple (une seule couche avec des points)
Enregistrez ceci sous le nom simple.kml
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <name>Exemple KML Simple</name> <Placemark> <name>Point A</name> <Point> <coordinates>-122.0822,37.4223,0</coordinates> </Point> </Placemark> <Placemark> <name>Point B</name> <Point> <coordinates>-122.0850,37.4230,0</coordinates> </Point> </Placemark> </Document> </kml> |
Fichier KML multi-couches (avec dossiers)
Enregistrez ceci sous le nom multi_layer.kml
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <name>Exemple KML Multi-couche</name> <Folder> <name>Couche 1 - Points rouges</name> <Placemark> <name>Point rouge 1</name> <Point> <coordinates>-122.1,37.4,0</coordinates> </Point> </Placemark> </Folder> <Folder> <name>Couche 2 - Points bleus</name> <Placemark> <name>Point bleu 1</name> <Point> <coordinates>-122.2,37.5,0</coordinates> </Point> </Placemark> <Placemark> <name>Point bleu 2</name> <Point> <coordinates>-122.3,37.6,0</coordinates> </Point> </Placemark> </Folder> </Document> </kml> |
Lire des fichiers KML avec geopandas
Tout d'abord, assurez-vous que geopandas
est installé :
1 | pip install geopandas |
Lire un fichier KML simple
1 2 3 4 | import geopandas as gpd gdf = gpd.read_file("simple.kml", driver='KML') print(gdf.head()) |
Exemple de sortie :
1 2 3 4 5 6 7 | Name description timestamp begin end altitudeMode tessellate extrude 0 Point A None NaT NaT NaT None -1 0 1 Point B None NaT NaT NaT None -1 0 visibility drawOrder icon geometry 0 -1 NaN None POINT Z (-122.0822 37.42229 0) 1 -1 NaN None POINT Z (-122.085 37.423 0) |
Lire des couches spécifiques depuis un fichier KML multi-couches
1 2 3 4 5 6 7 | # Lister les couches import fiona print(fiona.listlayers("multi_layer.kml")) # Lire la première couche gdf = gpd.read_file("multi_layer.kml", driver='KML', layer=0) print(gdf.head()) |
Exemple de sortie :
1 2 3 4 5 | Name description timestamp begin end altitudeMode tessellate extrude 0 Point rouge 1 None NaT NaT NaT None -1 0 visibility drawOrder icon geometry 0 -1 NaN None POINT Z (-122.1 37.4 0) |
Résolution des erreurs courantes
❌ IndexError: index 0 is out of bounds for axis 0 with size 0
Cette erreur signifie que le fichier KML a bien été lu, mais la couche à laquelle vous tentez d’accéder ne contient aucune entité. Le fichier est valide, mais la couche est vide.
Avant d’accéder à une couche spécifique, inspectez les couches disponibles et leur contenu.
D’abord, installez Fiona :
1 | pip install fiona |
Puis, utilisez le code suivant pour lister les couches :
1 2 3 4 5 | import fiona layers = fiona.listlayers("multi_layer.kml") print(f"Nombre de couches : {len(layers)}") print("Noms des couches :", layers) |
Exemple de sortie :
1 2 | Nombre de couches : 2 Noms des couches : ['Couche 1 - Points rouges', 'Couche 2 - Points bleus'] |
❌ DriverError: unsupported driver: 'KML'
Solution : Installez GDAL avec le support KML.
Ubuntu/Debian :
1 | sudo apt-get install gdal-bin libgdal-dev |
macOS (Homebrew) :
1 | brew install gdal |
Conda (Recommandé) :
1 | conda install -c conda-forge gdal fiona geopandas |
Puis vérifiez les pilotes supportés :
1 2 | import fiona print(fiona.supported_drivers) |
Vous devez voir 'KML': 'rw'
dans la liste.
❌ TypeError: Object of type Timestamp is not JSON serializable
Cela se produit lors de la visualisation avec folium
.
Solution : Convertir les colonnes datetime en chaînes :
1 2 3 4 5 6 7 8 | import pandas as pd gdf = gdf.copy() for col in gdf.columns: if pd.api.types.is_datetime64_any_dtype(gdf[col]): gdf[col] = gdf[col].astype(str) gdf = gdf.applymap(lambda x: str(x) if isinstance(x, (pd.Timestamp, pd.Timedelta)) else x) |
Visualiser un fichier KML avec folium
1. Installer folium :
Bash
1 | pip install folium |
2. Afficher un fichier KML sur une carte interactive
Python Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import geopandas as gpd import folium import pandas as pd # Charger le fichier KML gdf = gpd.read_file("simple.kml", driver='KML') # Centrer la carte center = gdf.geometry.iloc[0].centroid.coords[:][0][::-1] m = folium.Map(location=center, zoom_start=10) # Correction des types datetime gdf = gdf.applymap(lambda x: str(x) if isinstance(x, pd.Timestamp) else x) # Ajouter la couche GeoJSON folium.GeoJson(gdf).add_to(m) # Exporter la carte m.save("map_with_kml.html") |
Option : Affichage statique avec GeoPandas
Python Code:
1 | gdf.plot() |
Remarque : cela génère une image statique, non interactive.
Alternatives à GeoPandas
fastkml
: léger et efficace
Bash
1 | pip install fastkml |
Python Code:
1 2 3 4 5 6 7 8 9 10 11 12 | from fastkml import kml with open("simple.kml", "rt", encoding="utf-8") as f: doc = f.read() k = kml.KML() k.from_string(doc) for feature in k.features(): for placemark in feature.features(): print("Nom :", placemark.name) print("Géométrie :", placemark.geometry) |
pykml
: pour une analyse XML détaillée
Bash
1 | pip install pykml |
Python Code:
1 2 3 4 5 6 7 8 | from pykml import parser with open("simple.kml") as f: root = parser.parse(f).getroot() for placemark in root.Document.Placemark: print(placemark.name) print(placemark.Point.coordinates) |
Résumé
- Utilisez
geopandas
pour lire et analyser les données géospatiales au format KML. - Utilisez
folium
pour créer des cartes web interactives. - Utilisez
fastkml
oupykml
pour un traitement plus léger ou une analyse XML approfondie. - Vérifiez que votre environnement supporte le format KML via GDAL si vous avez des erreurs liées aux pilotes.