Comment lire et tracer un fichier KML (Keyhole Markup Language) en Python ?

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")

Comment lire et tracer un fichier KML (Keyhole Markup Language) en Python ?
Comment lire et tracer un fichier KML (Keyhole Markup Language) en Python ?

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 ou pykml 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.
Image

of