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

À 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
rtreeoupygeos; - 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 |

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

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 |
