Accéder au contenu principal

Introduction aux données géospatiales en Python

Dans ce tutoriel, vous utiliserez des données géospatiales pour tracer la trajectoire de l’ouragan Florence du 30 août au 18 septembre.
Actualisé 19 sept. 2026  · 13 min lire

Explorer avec l’IA

ChatGPTClaudePerplexity

geospatial graphic

Dans ce tutoriel, vous allez découvrir deux packages incontournables pour travailler des données géospatiales : geopandas et Shapely. Vous les utiliserez ensuite pour lire des données géospatiales avec Python et tracer la trajectoire de l’ouragan Florence du 30 août au 18 septembre.

Qu’est-ce qu’une donnée géospatiale ?

Données spatiales, données géospatiales, données SIG (GIS) ou géodonnées : autant d’appellations pour des données numériques qui identifient l’emplacement géographique d’un objet physique (bâtiment, rue, commune, ville, pays, etc.) selon un système de coordonnées géographiques. À partir de données spatiales, vous pouvez déterminer non seulement l’emplacement, mais aussi la longueur, la taille, la surface ou la forme d’un objet. Exemples de données spatiales : coordonnées d’un objet (latitude, longitude, altitude). Des systèmes d’information géographique (SIG/GIS) ou d’autres logiciels spécialisés permettent d’accéder, visualiser, manipuler et analyser ces données.

Pourquoi les données géospatiales ?

Les données géospatiales ont d’innombrables applications au quotidien. Pensez aux applications de cartographie utilisées pour se déplacer d’un point à un autre, ou encore aux cartes météo que vous consultez tous les jours.

news weather segment screenshot

En effet, les données géospatiales servent à représenter la position d’un élément par rapport à son environnement : votre maison sur le plan de la ville, un ouragan sur la carte du monde, etc. Dans ce tutoriel, vous allez examiner l’ouragan Florence et suivre sa trajectoire.

Prérequis packages

Ne passez pas cette section. C’est important. Si vous avez un doute, vérifiez à nouveau. Avant tout, assurez-vous d’avoir installé les packages ci-dessous.

  • Pandas : structures de données et outils d’analyse
  • Numpy : package fondamental pour le calcul scientifique en Python
  • SciPy : (prononcer « Saïe Païe ») écosystème open source pour les maths, la science et l’ingénierie en Python
  • RTree : wrapper ctypes de libspatialindex apportant des fonctionnalités avancées d’indexation spatiale
  • GDAL : bibliothèque de traduction pour formats de données géospatiales raster et vecteur
  • Fiona : lecture et écriture de fichiers de données spatiales
  • Shapely : objets géométriques, prédicats et opérations
  • GeoPandas : étend les types de pandas pour permettre des opérations spatiales sur des géométries
  • PySAL : bibliothèque de fonctions d’analyse spatiale en Python pour des applications de plus haut niveau
  • Matplotlib : bibliothèque de tracés 2D pour Python
  • Missingno : module de visualisation des données manquantes en Python

Installez-les dans l’ordre indiqué pour éviter les problèmes. Certains packages sont des prérequis pour d’autres. Par exemple, GeoPandas nécessite Shapely, et pour installer Shapely, vous devez d’abord installer RTree, GDAL et Fiona. La méthode la plus simple : pip install PACKAGE_NAME

Si vous êtes sous Windows et ne parvenez pas à installer ainsi, consultez ce site pour télécharger les packages puis exécutez pip install PATH_TO_PACKAGE.

À propos des données

Comme vous le savez peut-être, le terrible ouragan Florence a balayé une partie de la côte Est des États‑Unis, causant des dégâts estimés à 17 milliards USD. Ce tutoriel va vous aider à comprendre d’où il est venu, quand et où il s’est renforcé, et à l’analyser avec Python. De nombreux sites publient des informations sur cet ouragan. Par exemple, ce site propose des données sur plusieurs tempêtes et ouragans aux États‑Unis de 1902 à 2018 : une mine de données pour aller plus loin. Pour ce tutoriel, vous n’utiliserez que les données de l’ouragan Florence.

Vous utiliserez aussi des données géospatiales de la carte des États‑Unis. L’article de blog d’Eric Celeste répertorie divers fichiers de limites pour les comtés et États américains. Les données utilisées ici correspondent au fichier GeoJSON « US States, 5m ».

 # Load all importance packages
import geopandas
import numpy as np
import pandas as pd
from shapely.geometry import Point

import missingno as msn

import seaborn as sns
import matplotlib.pyplot as plt

% matplotlib inline

Commençons par inspecter une première GeoDataFrame : les données des États américains.

# Getting to know GEOJSON file:
country = geopandas.read_file("data/gz_2010_us_040_00_5m.json")
country.head()
geospatial dataframe

En vérifiant le type de l’objet chargé, vous voyez qu’il s’agit d’une GeoDataFrame, qui possède toutes les caractéristiques d’une DataFrame pandas.

type(country)
geopandas.geodataframe.GeoDataFrame

Le type de la colonne contenant les coordonnées est une GeoSeries.

type(country.geometry)
geopandas.geoseries.GeoSeries

Chaque valeur de la GeoSeries est un objet Shapely. Il peut s’agir :

  • Point
  • Line
  • Polygon
  • MultiPolygon

Chaque objet correspond à un type d’entité physique : Point pour un bâtiment, Line pour une rue, Polygon pour une ville, MultiPolygon pour un pays composé de plusieurs zones. Pour en savoir plus sur ces objets géométriques, consultez : https://shapely.readthedocs.io/en/stable/manual.html#geometric-objects

type(country.geometry[0])
shapely.geometry.multipolygon.MultiPolygon

Comme une DataFrame pandas, une GeoDataFrame possède aussi l’attribut plot, qui exploite la géométrie pour tracer une carte :

country.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x1cfe68c1358>
attribute plot

Vous remarquez que la carte des États‑Unis est petite par rapport au cadre. C’est parce qu’elle inclut l’Alaska, Hawaï et Porto Rico, spatialement éloignés. Pour les besoins de ce tutoriel, nous allons exclure l’Alaska et Hawaï, non concernés par l’ouragan. Au passage, ajustons la taille et la couleur de la figure :

# Exclude Alaska and Hawaii for now
country[country['NAME'].isin(['Alaska','Hawaii']) == False].plot(figsize=(30,20), color='#3B3C6E');
us map

Rien de sorcier ! Maintenant que vous avez la carte, chargeons les données de l’ouragan :

florence = pd.read_csv('data/florence.csv')
florence.head()
hurricane data

Analyse exploratoire des données

C’est l’étape de base à chaque nouveau jeu de données :

  • Vérifier les informations et types
  • Détecter d’éventuelles valeurs manquantes
  • Explorer les statistiques descriptives
florence.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 105 entries, 0 to 104
Data columns (total 11 columns):
AdvisoryNumber    105 non-null object
Date              105 non-null object
Lat               105 non-null float64
Long              105 non-null float64
Wind              105 non-null int64
Pres              105 non-null int64
Movement          105 non-null object
Type              105 non-null object
Name              105 non-null object
Received          105 non-null object
Forecaster        104 non-null object
dtypes: float64(2), int64(2), object(7)
memory usage: 9.1+ KB

Vérifions les valeurs manquantes avec le package missingno. Très pratique pour visualiser les manques. Comme ci‑dessous, une seule valeur est manquante dans la colonne « Forecaster », inutile pour ce tutoriel : on peut l’ignorer.

# Notice you can always adjust the color of the visualization
msn.bar(florence, color='darkolivegreen');
bar chart

Jetons un œil aux statistiques : vitesse moyenne du vent, maximum et minimum, etc.

# Statistical information
florence.describe()
  Lat Long Wind Pres
count 105.000000 105.000000 105.000000 105.000000
mean 25.931429 56.938095 74.428571 981.571429
std 7.975917 20.878865 36.560765 22.780667
min 12.900000 18.400000 25.000000 939.000000
25% 18.900000 41.000000 40.000000 956.000000
50% 25.100000 60.000000 70.000000 989.000000
75% 33.600000 76.400000 105.000000 1002.000000
max 42.600000 82.900000 140.000000 1008.000000

Dans la plupart des cas, il faut nettoyer et ne conserver que l’essentiel. Ici, nous gardons l’horodatage, les coordonnées (latitude, longitude), la vitesse du vent, la pression et le nom. Movement et Type sont optionnels, le reste peut être supprimé.

# dropping all unused features:
florence = florence.drop(['AdvisoryNumber', 'Forecaster', 'Received'], axis=1)
florence.head()
dataframe 1

Si vous ne tracez que ces points, pas besoin de traitement supplémentaire. Mais pour coller à une carte, vérifiez le signe des coordonnées. Ici, la longitude est à l’ouest : il faut ajouter « - » devant la valeur pour un tracé correct.

# Add "-" in front of the number to correctly plot the data:
florence['Long'] = 0 - florence['Long']
florence.head()
dataframe 2

Vous pouvez ensuite combiner latitude et longitude pour créer des coordonnées d’ouragan, puis les convertir en GeoPoint pour la visualisation.

# Combining Lattitude and Longitude to create hurricane coordinates:
florence['coordinates'] = florence[['Long', 'Lat']].values.tolist()
florence.head()
dataframe 3
# Change the coordinates to a geoPoint
florence['coordinates'] = florence['coordinates'].apply(Point)
florence.head()
dataframe 4

Vérifions les types du dataframe florence et de la colonne coordinates : c’est une DataFrame pandas et une Series pandas.

type(florence)
pandas.core.frame.DataFrame
type(florence['coordinates'])
pandas.core.series.Series

Après conversion en données géospatiales, revérifions : florence devient une GeoDataFrame et coordinates une GeoSeries.

# Convert the count df to geodf
florence = geopandas.GeoDataFrame(florence, geometry='coordinates')
florence.head()
dataframe 5
type(florence)
geopandas.geodataframe.GeoDataFrame
type(florence['coordinates'])
geopandas.geoseries.GeoSeries

Même en GeoDataFrame/GeoSeries, le comportement reste celui d’une DataFrame/Series classique : vous pouvez filtrer, grouper, calculer min, max, moyenne, etc.

# Filtering from before the hurricane was named.
florence[florence['Name']=='Six']
dataframe 6
# Groupping by name to see how many names it has in the data set:
florence.groupby('Name').Type.count()
Name
FLORENCE     6
Florence    85
SIX          4
Six         10
Name: Type, dtype: int64

Calcul de la vitesse moyenne des vents de l’ouragan Florence :

print("Mean wind speed of Hurricane Florence is {} mph and it can go up to {} mph maximum".format(round(florence.Wind.mean(),4),
                                                                                         florence.Wind.max()))
Mean wind speed of Hurricane Florence is 74.4286 mph and it can go up to 140 mph maximum

La vitesse moyenne des vents est donc de 74,43 miles/heure (119,78 km/h) et le maximum atteint 140 miles/heure (225,308 km/h). Pour se rendre compte de la violence, l’échelle de Beaufort, développée par la Royal Navy britannique, décrit les effets du vent sur mer et sur terre. À 48–55 miles/heure, des arbres peuvent déjà être déracinés et les « dégâts structurels considérables » apparaissent.

hurricane

Mieux vaut ne pas s’y trouver à ce moment‑là.

Visualisation

Comme une DataFrame pandas, une GeoDataFrame dispose de .plot. Ici, l’attribut exploite les coordonnées pour cartographier. Voyons :

florence.plot(figsize=(20,10));
geodataframe

Que se passe‑t‑il ? On ne voit qu’un nuage de points. Un problème ?
Non. Ce dataframe ne contient que des coordonnées (positions) de Florence à chaque instant : on ne peut donc tracer que des positions sur un fond vierge.

Étape suivante : superposer ces positions sur la carte des États‑Unis pour voir où l’ouragan est passé et sa force à chaque point. Pour cela, utilisez les coordonnées de la carte US (chargées au début) comme base, puis tracez par‑dessus la position de Florence.

 # Plotting to see the hurricane overlay the US map:
fig, ax = plt.subplots(1, figsize=(30,20))
base = country[country['NAME'].isin(['Alaska','Hawaii']) == False].plot(ax=ax, color='#3B3C6E')

# plotting the hurricane position on top with red color to stand out:
florence.plot(ax=base, color='darkred', marker="*", markersize=10);
us map hurricane florence plot

Beau résultat ! Finalisons avec quelques détails :

  • Ajouter un titre
  • Colorer les positions selon la vitesse du vent pour visualiser l’intensité
  • Supprimer les axes
  • Ajouter une légende
  • Enregistrer l’image pour réutilisation
 fig, ax = plt.subplots(1, figsize=(20,20))
base = country[country['NAME'].isin(['Alaska','Hawaii']) == False].plot(ax=ax, color='#3B3C6E')
florence.plot(ax=base, column='Wind', marker="<", markersize=10, cmap='cool', label="Wind speed(mph)")
_ = ax.axis('off')
plt.legend()
ax.set_title("Hurricane Florence in US Map", fontsize=25)
plt.savefig('Hurricane_footage.png',bbox_inches='tight');
hurricane florence in us map

L’ouragan était au plus fort au large de la côte Est. En s’approchant des terres, il a perdu en intensité, mais à 60–77 miles/heure, les dégâts restent considérables.

Conclusion

Bravo ! Vous avez vu les étapes essentielles pour travailler des données géospatiales en Python. Vous savez aussi tracer ces données et personnaliser formes, couleurs et superpositions pour raconter une histoire. Pour vous entraîner, une multitude de jeux de données géospatiales sont disponibles en ligne, comme le site météo cité plus haut.

Pour aller plus loin, consultez l’ouvrage : « Python Geospatial Development Essentials » de Karim Bahgat (2015).

Pour me contacter, écrivez‑moi à dqvu.ubc@gmail.com ou retrouvez‑moi sur LinkedIn. Bon apprentissage, et restez prudents !

Pour approfondir le sujet en Python, suivez le cours DataCamp Visualizing Geospatial Data in Python.

Voici les données utilisées dans ce tutoriel :

Sujets
Python
Visualisation des données
Analyse des données

En savoir plus sur Python

Cours

Introduction à Python

4 h
7M
Apprenez les bases de l’analyse de données avec Python en quatre heures et explorez ses principaux packages.
Afficher les détailsRight Arrow
Commencer Le Cours
Voir plusRight Arrow