Introduction
Créer une GeoDataFrame à partir d'une DataFrame Pandas implique d'ajouter une colonne de données géométriques, qui représente généralement des formes telles que des points, des lignes ou des polygones.
Voici un guide étape par étape utilisant Python et les bibliothèques Pandas et GeoPandas:
Création d'une GeoPandas DataFrame avec un point basé sur la latitude et la longitude comme géométrie
Lors de la création d'un géodataframe, le scénario le plus courant est d'avoir une colonne avec des points comme géométrie. Cela peut être facilement accompli en utilisant la fonction geopandas points_from_xy():
Création d'une DataFrame Pandas contenant des colonnes pour les longitudes et latitudes
À titre d'exemple, considérons un scénario où nous avons des données stockées dans un dictionnaire contenant des valeurs de latitude et de longitude pour différentes villes :
data = {'city_name':['Paris','London','Moscow', 'Istanbul'],
'longitude':[2.3522,-0.1276,37.6173,28.9784],
'latitude':[48.8566,51.5072,55.7558,41.0082]}
Pour stocker nos données dans une DataFrame Pandas, nous pouvons utiliser le code suivant:
import pandas as pd
df = pd.DataFrame(data)
print(df)
Le code ci-dessus affichera
city_name longitude latitude
0 Paris 2.3522 48.8566
1 London -0.1276 51.5072
2 Moscow 37.6173 55.7558
3 Istanbul 28.9784 41.0082
Conversion d'une DataFrame pandas en GeoDataFrame en utilisant la fonction points_from_xy()
points_from_xy est une fonction de la bibliothèque geopandas qui convertit une série de coordonnées de latitude et de longitude en un GeoSeries avec des géométries de point. C'est un moyen pratique de créer rapidement une colonne de géométrie pour notre GeoDataFrame sans avoir à construire manuellement chaque point individuel.
Pour utiliser la fonction points_from_xy, nous importons d'abord les bibliothèques nécessaires : pandas et geopandas. Cette fonction nous permet de créer une dataframe geopandas en fournissant une série de coordonnées de latitude et de longitude. Examinons un exemple :
import geopandas
gdf = geopandas.GeoDataFrame(
df,
geometry=geopandas.points_from_xy(df.longitude, df.latitude),
crs="EPSG:4326"
)
En exécutant le code, nous générerons la dataframe geopandas suivante avec des points de géométrie représentés par la longitude et la latitude :
city_name longitude latitude geometry
0 Paris 2.3522 48.8566 POINT (2.35220 48.85660)
1 London -0.1276 51.5072 POINT (-0.12760 51.50720)
2 Moscow 37.6173 55.7558 POINT (37.61730 55.75580)
3 Istanbul 28.9784 41.0082 POINT (28.97840 41.00820)
Cette approche nous permet de travailler efficacement avec des données géospatiales en utilisant geopandas en Python.
Créer une GeoPandas DataFrame à partir d'une DataFrame Pandas avec des géométries complexes
Jusqu'à présent, nous avons vu un exemple simple qui est fréquemment utilisé. Maintenant, explorons comment travailler avec des géométries plus complexes, telles que des polygones ou des multipoints.
Utilisation des polygones en tant que formes géométriques
Les polygones sont un autre type de forme géométrique qui peut être utilisé dans une GeoDataFrame. Ils se composent d'une série de points connectés, le dernier point se connectant de nouveau au premier pour créer une forme fermée. Cela nous permet de représenter des frontières et des zones plus complexes.
Pour générer une GeoDataFrame à partir de polygones, nous utiliserons les mêmes étapes qu'auparavant, mais cette fois-ci, nous fournirons les coordonnées de chaque point du polygone. Continuons à utiliser notre exemple précédent des villes :
data = {'city_name':['Paris','London','Moscow', 'Istanbul'],
'longitude_c1':[2.3522-0.1,-0.1276-0.1,37.6173-0.1,28.9784-0.1],
'latitude_c1':[48.8566-0.1,51.5072-0.1,55.7558-0.1,41.0082-0.1],
'longitude_c2':[2.3522-0.1,-0.1276-0.1,37.6173-0.1,28.9784-0.1],
'latitude_c2':[48.8566+0.1,51.5072+0.1,55.7558+0.1,41.0082+0.1],
'longitude_c3':[2.3522+0.1,-0.1276+0.1,37.6173+0.1,28.9784+0.1],
'latitude_c3':[48.8566+0.1,51.5072+0.1,55.7558+0.1,41.0082+0.1],
'longitude_c4':[2.3522+0.1,-0.1276+0.1,37.6173+0.1,28.9784+0.1],
'latitude_c4':[48.8566-0.1,51.5072-0.1,55.7558-0.1,41.0082-0.1]
}
Ici, nous avons ajouté quatre points pour chaque ville pour représenter une forme polygonale. Cela créera un total de quatre coordonnées pour chaque ville, formant un carré autour du centre-ville.
Maintenant, nous allons procéder à générer un tableau de données pandas :
import pandas as pd
df = pd.DataFrame(data)
print(df)
Cela nous donnera la sortie suivante :
city_name longitude_c1 latitude_c1 longitude_c2 latitude_c2 \
0 Paris 2.2522 48.7566 2.2522 48.9566
1 London -0.2276 51.4072 -0.2276 51.6072
2 Moscow 37.5173 55.6558 37.5173 55.8558
3 Istanbul 28.8784 40.9082 28.8784 41.1082
longitude_c3 latitude_c3 longitude_c4 latitude_c4
0 2.4522 48.9566 2.4522 48.7566
1 -0.0276 51.6072 -0.0276 51.4072
2 37.7173 55.8558 37.7173 55.6558
3 29.0784 41.1082 29.0784 40.9082
Pour continuer, nous pouvons utiliser la bibliothèque Shapely pour développer une fonction qui accepte quatre points et génère une forme de polygone:
from shapely.geometry import Polygon
def create_polygon(x):
p1 = [x['longitude_c1'],x['latitude_c1']]
p2 = [x['longitude_c2'],x['latitude_c2']]
p3 = [x['longitude_c3'],x['latitude_c3']]
p4 = [x['longitude_c4'],x['latitude_c4']]
pixel_polygon = Polygon([p1,p2,p3,p4])
return pixel_polygon
Nous appliquons ensuite cette fonction à notre dataframe pandas et l'utilisons comme colonne de géométrie pour notre GeoDataFrame.
df.apply(create_polygon, axis=1)
Cela nous donnera la sortie suivante :
0 POLYGON ((2.2522 48.7566, 2.2522 48.9566, 2.45...
1 POLYGON ((-0.2276 51.4072, -0.2276 51.6072, -0...
2 POLYGON ((37.5173 55.6558, 37.5173 55.8558, 37...
3 POLYGON ((28.8784 40.9082, 28.8784 41.1082, 29...
dtype: object
Dans le code suivant, nous avons modifié notre fonction pour renvoyer une forme polygonale en utilisant la bibliothèque shapely. Ensuite, nous appliquons cette fonction à notre dataframe et l'assignons à la colonne 'geometry':
df['geometry'] = df.apply(create_polygon, axis=1)
Cela nous donnera la sortie suivante :
city_name longitude_c1 latitude_c1 longitude_c2 latitude_c2 \
0 Paris 2.2522 48.7566 2.2522 48.9566
1 London -0.2276 51.4072 -0.2276 51.6072
2 Moscow 37.5173 55.6558 37.5173 55.8558
3 Istanbul 28.8784 40.9082 28.8784 41.1082
longitude_c3 latitude_c3 longitude_c4 latitude_c4 \
0 2.4522 48.9566 2.4522 48.7566
1 -0.0276 51.6072 -0.0276 51.4072
2 37.7173 55.8558 37.7173 55.6558
3 29.0784 41.1082 29.0784 40.9082
geometry
0 POLYGON ((2.2522 48.7566, 2.2522 48.9566, 2.45...
1 POLYGON ((-0.2276 51.4072, -0.2276 51.6072, -0...
2 POLYGON ((37.5173 55.6558, 37.5173 55.8558, 37...
3 POLYGON ((28.8784 40.9082, 28.8784 41.1082, 29...
Ensuite, nous pouvons utiliser notre DataFrame existant pour générer une DataFrame GeoPandas :
import geopandas
gdf = geopandas.GeoDataFrame(
df,
geometry=df['geometry'],
crs="EPSG:4326"
)
Ici, nous avons utilisé la colonne de géométrie de notre dataframe pour créer une GeoDataFrame. Nous avons également spécifié le Système de Référence de Coordonnées (CRS) comme EPSG:4326, qui correspond au système de coordonnées standard WGS84 et est couramment utilisé pour les données géographiques.
city_name longitude_c1 latitude_c1 longitude_c2 latitude_c2 \
0 Paris 2.2522 48.7566 2.2522 48.9566
1 London -0.2276 51.4072 -0.2276 51.6072
2 Moscow 37.5173 55.6558 37.5173 55.8558
3 Istanbul 28.8784 40.9082 28.8784 41.1082
longitude_c3 latitude_c3 longitude_c4 latitude_c4 \
0 2.4522 48.9566 2.4522 48.7566
1 -0.0276 51.6072 -0.0276 51.4072
2 37.7173 55.8558 37.7173 55.6558
3 29.0784 41.1082 29.0784 40.9082
geometry
0 POLYGON ((2.25220 48.75660, 2.25220 48.95660, ...
1 POLYGON ((-0.22760 51.40720, -0.22760 51.60720...
2 POLYGON ((37.51730 55.65580, 37.51730 55.85580...
3 POLYGON ((28.87840 40.90820, 28.87840 41.10820...
Utilisation de MulitPoint comme formes géométriques
Un autre type de forme est le MultiPoint, qui représente plusieurs points dans l'espace. Cela est particulièrement utile lorsque votre ensemble de données comprend des points de données étroitement situés, comme un groupe de villes ou de bâtiments.
Pour créer un MultiPoint, nous pouvons utiliser la bibliothèque shapely et développer une fonction qui peut accepter plusieurs points :
from shapely.geometry import MultiPoint
def create_multipoint(x):
p1 = [x['longitude_c1'],x['latitude_c1']]
p2 = [x['longitude_c2'],x['latitude_c2']]
p3 = [x['longitude_c3'],x['latitude_c3']]
p4 = [x['longitude_c4'],x['latitude_c4']]
return MultiPoint([p1,p2,p3,p4])
Ensuite, nous appliquons cette fonction à notre dataframe et l'assignons à la colonne 'geometry':
df['geometry'] = df.apply(create_multipoint, axis=1)
Ensuite, nous pouvons utiliser notre DataFrame existant pour générer une DataFrame GeoPandas :
import geopandas
gdf = geopandas.GeoDataFrame(
df,
geometry=df['geometry'],
crs="EPSG:4326"
)
Le GeoPandas DataFrame résultant contiendra toutes les colonnes de notre dataframe d'origine, avec l'ajout d'une colonne 'geometry' qui contient nos géométries multipoints :
city_name longitude_c1 latitude_c1 longitude_c2 latitude_c2 \
0 Paris 2.2522 48.7566 2.2522 48.9566
1 London -0.2276 51.4072 -0.2276 51.6072
2 Moscow 37.5173 55.6558 37.5173 55.8558
3 Istanbul 28.8784 40.9082 28.8784 41.1082
longitude_c3 latitude_c3 longitude_c4 latitude_c4 \
0 2.4522 48.9566 2.4522 48.7566
1 -0.0276 51.6072 -0.0276 51.4072
2 37.7173 55.8558 37.7173 55.6558
3 29.0784 41.1082 29.0784 40.9082
geometry
0 MULTIPOINT (2.25220 48.75660, 2.25220 48.95660...
1 MULTIPOINT (-0.22760 51.40720, -0.22760 51.607...
2 MULTIPOINT (37.51730 55.65580, 37.51730 55.855...
3 MULTIPOINT (28.87840 40.90820, 28.87840 41.108...
L'utilisation des multipoints en tant que formes géométriques n'est qu'une des nombreuses techniques qui peuvent être utilisées pour améliorer la visualisation des données géographiques. Il existe également d'autres bibliothèques telles que Folium et Cartopy qui offrent des capacités de cartographie plus avancées.
Références
Liens | Site |
---|---|
Creating a GeoDataFrame from a DataFrame with coordinates | geopandas.org |
Data structures | geopandas.org |
points_from_xy | geopandas.org |
How to apply a function across multiple columns in a pandas DataFrame and create several new ones ? | en.moonbooks.org |
How to apply a function to a DataFrame row with pandas in python ? | en.moonbooks.org |
geopandas.GeoDataFrame.to_crs | geopandas.org |
geopandas.GeoDataFrame.crs | geopandas.org |