geopandas

Par mkurman · zorai

Bibliothèque Python pour travailler avec des données vectorielles géospatiales, notamment les fichiers shapefile, GeoJSON et GeoPackage. À utiliser pour les données géographiques dans le cadre d'analyses spatiales, d'opérations géométriques, de transformations de coordonnées, de jointures spatiales, d'opérations de superposition, de cartographie choroplèthe, ou pour toute tâche impliquant la lecture, l'écriture ou l'analyse de données géographiques vectorielles. Prend en charge les bases de données PostGIS, les cartes interactives et l'intégration avec matplotlib/folium/cartopy. À utiliser pour des tâches telles que l'analyse de tampons (buffer), les jointures spatiales entre jeux de données, la dissolution de frontières, le découpage de données, le calcul de surfaces et de distances, la reprojection de systèmes de coordonnées, la création de cartes ou la conversion entre formats de fichiers spatiaux.

npx skills add https://github.com/mkurman/zorai --skill geopandas

GeoPandas

GeoPandas étend pandas pour activer les opérations spatiales sur les types géométriques. Il combine les capacités de pandas et shapely pour l'analyse de données géospatiales.

Installation

uv pip install geopandas

Dépendances optionnelles

# Pour les cartes interactives
uv pip install folium

# Pour les schémas de classification en cartographie
uv pip install mapclassify

# Pour des opérations I/O plus rapides (accélération 2-4x)
uv pip install pyarrow

# Pour le support de base de données PostGIS
uv pip install psycopg2
uv pip install geoalchemy2

# Pour les cartes de base
uv pip install contextily

# Pour les projections cartographiques
uv pip install cartopy

Démarrage rapide

import geopandas as gpd

# Lire des données spatiales
gdf = gpd.read_file("data.geojson")

# Exploration basique
print(gdf.head())
print(gdf.crs)
print(gdf.geometry.geom_type)

# Tracé simple
gdf.plot()

# Reprojeter vers un CRS différent
gdf_projected = gdf.to_crs("EPSG:3857")

# Calculer la surface (utiliser un CRS projeté pour la précision)
gdf_projected['area'] = gdf_projected.geometry.area

# Enregistrer dans un fichier
gdf.to_file("output.gpkg")

Concepts fondamentaux

Structures de données

  • GeoSeries : Vecteur de géométries avec opérations spatiales
  • GeoDataFrame : Structure de données tabulaire avec colonne de géométrie

Voir data-structures.md pour les détails.

Lecture et écriture de données

GeoPandas lit/écrit plusieurs formats : Shapefile, GeoJSON, GeoPackage, PostGIS, Parquet.

# Lire avec filtrage
gdf = gpd.read_file("data.gpkg", bbox=(xmin, ymin, xmax, ymax))

# Écrire avec accélération Arrow
gdf.to_file("output.gpkg", use_arrow=True)

Voir data-io.md pour les opérations I/O complètes.

Systèmes de référence des coordonnées

Toujours vérifier et gérer le CRS pour des opérations spatiales précises :

# Vérifier le CRS
print(gdf.crs)

# Reprojeter (transforme les coordonnées)
gdf_projected = gdf.to_crs("EPSG:3857")

# Définir le CRS (uniquement quand les métadonnées manquent)
gdf = gdf.set_crs("EPSG:4326")

Voir crs-management.md pour les opérations CRS.

Opérations courantes

Opérations géométriques

Tampon, simplification, centroïde, enveloppe convexe, transformations affines :

# Tampon de 10 unités
buffered = gdf.geometry.buffer(10)

# Simplifier avec tolérance
simplified = gdf.geometry.simplify(tolerance=5, preserve_topology=True)

# Obtenir les centroïdes
centroids = gdf.geometry.centroid

Voir geometric-operations.md pour toutes les opérations.

Analyse spatiale

Jointures spatiales, opérations de superposition, dissolution :

# Jointure spatiale (intersecte)
joined = gpd.sjoin(gdf1, gdf2, predicate='intersects')

# Jointure du plus proche voisin
nearest = gpd.sjoin_nearest(gdf1, gdf2, max_distance=1000)

# Intersection de superposition
intersection = gpd.overlay(gdf1, gdf2, how='intersection')

# Dissoudre par attribut
dissolved = gdf.dissolve(by='region', aggfunc='sum')

Voir spatial-analysis.md pour les opérations d'analyse.

Visualisation

Créer des cartes statiques et interactives :

# Carte choroplèthe
gdf.plot(column='population', cmap='YlOrRd', legend=True)

# Carte interactive
gdf.explore(column='population', legend=True).save('map.html')

# Carte multi-couches
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
gdf1.plot(ax=ax, color='blue')
gdf2.plot(ax=ax, color='red')

Voir visualization.md pour les techniques de cartographie.

Documentation détaillée

Workflows courants

Charger, transformer, analyser, exporter

# 1. Charger les données
gdf = gpd.read_file("data.shp")

# 2. Vérifier et transformer le CRS
print(gdf.crs)
gdf = gdf.to_crs("EPSG:3857")

# 3. Effectuer l'analyse
gdf['area'] = gdf.geometry.area
buffered = gdf.copy()
buffered['geometry'] = gdf.geometry.buffer(100)

# 4. Exporter les résultats
gdf.to_file("results.gpkg", layer='original')
buffered.to_file("results.gpkg", layer='buffered')

Jointure spatiale et agrégation

# Joindre des points à des polygones
points_in_polygons = gpd.sjoin(points_gdf, polygons_gdf, predicate='within')

# Agréger par polygone
aggregated = points_in_polygons.groupby('index_right').agg({
    'value': 'sum',
    'count': 'size'
})

# Fusionner à nouveau avec les polygones
result = polygons_gdf.merge(aggregated, left_index=True, right_index=True)

Intégration de données multi-sources

# Lire depuis différentes sources
roads = gpd.read_file("roads.shp")
buildings = gpd.read_file("buildings.geojson")
parcels = gpd.read_postgis("SELECT * FROM parcels", con=engine, geom_col='geom')

# Assurer un CRS correspondant
buildings = buildings.to_crs(roads.crs)
parcels = parcels.to_crs(roads.crs)

# Effectuer des opérations spatiales
buildings_near_roads = buildings[buildings.geometry.distance(roads.union_all()) < 50]

Conseils de performance

  1. Utiliser l'indexation spatiale : GeoPandas crée automatiquement des index spatiaux pour la plupart des opérations
  2. Filtrer pendant la lecture : Utiliser les paramètres bbox, mask ou where pour charger uniquement les données nécessaires
  3. Utiliser Arrow pour les I/O : Ajouter use_arrow=True pour une lecture/écriture 2-4x plus rapide
  4. Simplifier les géométries : Utiliser .simplify() pour réduire la complexité quand la précision n'est pas critique
  5. Opérations par lot : Les opérations vectorisées sont beaucoup plus rapides que d'itérer les lignes
  6. Utiliser un CRS approprié : CRS projeté pour la surface/distance, géographique pour la visualisation

Bonnes pratiques

  1. Toujours vérifier le CRS avant les opérations spatiales
  2. Utiliser un CRS projeté pour les calculs de surface et de distance
  3. Faire correspondre le CRS avant les jointures spatiales ou les superpositions
  4. Valider les géométries avec .is_valid avant les opérations
  5. Utiliser .copy() lors de la modification des colonnes de géométrie pour éviter les effets de bord
  6. Préserver la topologie lors de la simplification pour l'analyse
  7. Utiliser le format GeoPackage pour les workflows modernes (meilleur que Shapefile)
  8. Définir max_distance dans sjoin_nearest pour de meilleures performances

Skills similaires