Comment filtrer des données géospatiales pour un pays spécifique avec GeoPandas

Introduction

Les jeux de données géospatiales globaux sont couramment utilisés en observation de la Terre, en sciences du climat et en surveillance environnementale. Cependant, de nombreux projets nécessitent de se concentrer sur une région spécifique, comme les États-Unis.

Cet article présente un workflow pratique pour filtrer un jeu de données global et conserver uniquement les observations situées sur le territoire des États-Unis à l’aide de GeoPandas. L’exemple est basé sur un cas d’utilisation réel impliquant des données de feux VIIRS agrégées avec l’indexation spatiale H3.

GeoPandas DataFrame

Cas d’utilisation

Un jeu de données global est disponible sous forme de DataFrame Pandas contenant des indices H3. L’objectif est d’extraire uniquement les observations situées sur le territoire des États-Unis pour une analyse ultérieure.

Le jeu de données utilisé dans cet exemple correspond à une agrégation annuelle de données d’anomalies thermiques VIIRS EFIRE.

Charger le jeu de données

1
2
3
4
5
6
import pandas as pd
import geopandas as gpd

df_viirs_annual_agg = pd.read_parquet(
    f'/Volumes/HD15TB/Datasets/VIIRS_EFIRE_Thermal_Anomaly_Frequency_Distribution/{platform}/{year}_EFIRE_Thermal_Anomaly_Frequency_Distribution.parquet'
)

Convertir les indices H3 en latitude / longitude

Le jeu de données contient des cellules H3, mais pas de coordonnées géographiques explicites. Il est donc nécessaire de convertir les indices H3 en latitude et longitude.

1
2
3
4
import h3

df_viirs_annual_agg['lat'] = df_viirs_annual_agg['h3_cell'].apply(lambda h: h3.cell_to_latlng(h)[0])
df_viirs_annual_agg['lon'] = df_viirs_annual_agg['h3_cell'].apply(lambda h: h3.cell_to_latlng(h)[1])

Convertir en GeoDataFrame

1
2
3
4
5
gdf = gpd.GeoDataFrame(
    df_viirs_annual_agg,
    geometry=gpd.points_from_xy(df_viirs_annual_agg.lon, df_viirs_annual_agg.lat),
    crs="EPSG:4326"
)

Filtrer des données géospatiales globales pour le territoire des États-Unis avec GeoPandas
Filtrer des données géospatiales globales pour le territoire des États-Unis avec GeoPandas

À ce stade, le jeu de données possède une géométrie et peut être utilisé pour des opérations spatiales.

Charger le polygone des frontières des États-Unis

Utiliser Natural Earth, jeu de données intégré

1
2
3
world = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres"))

usa = world[world['name'] == 'United States of America']

Utiliser des données Natural Earth de plus haute résolution

Pour obtenir des frontières plus précises, ce qui est recommandé pour les applications de recherche, vous pouvez télécharger des données Natural Earth de plus haute résolution.

Source de téléchargement :

Exemple avec un shapefile local :

1
2
3
4
5
world = gpd.read_file(
    "/Volumes/HD15TB/Datasets/Natural_Earth_Data/ne_110m_admin_0_countries/ne_110m_admin_0_countries.shp"
)

usa = world[world['ADMIN'] == 'United States of America']

Notes importantes

Inclus par défaut :

  • États-Unis continentaux
  • Alaska
  • Hawaii

Limitations possibles :

  • Les territoires d’outre-mer, comme Porto Rico ou Guam, peuvent être absents selon la résolution du jeu de données utilisé.

Pour une couverture plus complète, vous pouvez utiliser :

1
2
world = gpd.read_file("ne_10m_admin_0_countries.shp")
usa = world[world['ADMIN'] == 'United States of America']

Filtrage spatial — Point-in-Polygon

L’étape de filtrage repose sur un test géométrique d’inclusion.

1
gdf_us = gdf[gdf.within(usa.unary_union)]

Cette opération conserve uniquement les points situés à l’intérieur du polygone représentant les États-Unis.

Note sur les performances

Pour les grands jeux de données contenant des millions de points, vous pouvez envisager :

  • d’utiliser un index spatial, par exemple rtree ou pygeos ;
  • de pré-filtrer les données avec des boîtes englobantes ;
  • de convertir les cellules H3 en polygones pour obtenir une meilleure précision près des frontières.

Validation visuelle avec Folium

Une carte est utile pour vérifier que le filtrage fonctionne comme attendu.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import folium

usa = usa.to_crs(epsg=4326)

m = folium.Map(location=[39.5, -98.5], zoom_start=4, tiles="CartoDB positron")

folium.GeoJson(
    usa,
    name="États-Unis",
    style_function=lambda feature: {
        "fillColor": "blue",
        "color": "blue",
        "weight": 2,
        "fillOpacity": 0.2,
    },
    tooltip=folium.GeoJsonTooltip(fields=["ADMIN"], aliases=["Pays :"])
).add_to(m)

folium.LayerControl().add_to(m)

m

Filtrer des données géospatiales globales pour le territoire des États-Unis avec GeoPandas
Filtrer des données géospatiales globales pour le territoire des États-Unis avec GeoPandas

Optionnel : superposer les points filtrés

1
2
3
4
5
6
7
8
for _, row in gdf_us.sample(10000).iterrows():
    folium.CircleMarker(
        location=[row["lat"], row["lon"]],
        radius=2,
        color="red",
        fill=True,
        fill_opacity=0.7
    ).add_to(m)

Filtrer des données géospatiales globales pour le territoire des États-Unis avec GeoPandas
Filtrer des données géospatiales globales pour le territoire des États-Unis avec GeoPandas

Alternative plus rapide — Filtrage approximatif

Une simple boîte englobante peut être utilisée pour effectuer un filtrage rapide.

1
2
3
4
df_us = df_viirs_annual_agg[
    (df_viirs_annual_agg['lat'] >= 24) & (df_viirs_annual_agg['lat'] <= 72) &
    (df_viirs_annual_agg['lon'] >= -170) & (df_viirs_annual_agg['lon'] <= -65)
]

Limitations

  • Inclut des régions océaniques
  • Inclut certaines parties du Canada et du Mexique
  • N’est pas adapté à une analyse scientifique précise

Bonnes pratiques

  • Utiliser le filtrage spatial avec GeoPandas pour plus de précision
  • Utiliser des données Natural Earth haute résolution pour de meilleures frontières
  • Utiliser l’intersection des polygones H3 plutôt que les centroïdes pour un traitement plus précis près des frontières
  • Mettre en cache les résultats, par exemple avec un indicateur is_us, afin d’éviter de recalculer le filtrage spatial

Références

Sujet Lien
Documentation GeoPandas https://geopandas.org
Jeux de données Natural Earth https://www.naturalearthdata.com/downloads/
Documentation H3 https://h3geo.org/docs
Documentation Folium https://python-visualization.github.io/folium/
Shapely — opérations géométriques https://shapely.readthedocs.io
Image

of