Un peu tard mais peut-être aussi utile pour les autres. Oui, cela peut être fait avec shapely
et geopandas
.
Supposons que votre cadre de données pandas ressemble à ceci:
import pandas as pd
data = [
{'some_attribute': 'abc', 'lat': '50.1234', 'lon': '10.4023'},
{'some_attribute': 'def', 'lat': '40.5678', 'lon': '8.3365'},
{'some_attribute': 'ghi', 'lat': '60.9012', 'lon': '6.2541'},
{'some_attribute': 'jkl', 'lat': '45.3456', 'lon': '12.5478'},
{'some_attribute': 'mno', 'lat': '35.7890', 'lon': '14.3957'},
]
df = pd.DataFrame(data)
print(df)
=>
lat lon some_attribute
0 50.1234 10.4023 abc
1 40.5678 8.3365 def
2 60.9012 6.2541 ghi
3 45.3456 12.5478 jkl
4 35.7890 14.3957 mno
Tout d'abord, assurez-vous que geopandas
et shapely
sont installés correctement, ce qui n'est parfois pas facile car ils sont livrés avec certaines dépendances (par exemple GEOS et GDAL). Si cela ne fonctionne pas au premier essai via pip install geopandas shapely
, recherchez l'erreur sur Google ou StackOverflow / Gis.Stackexchange, car il y aura très probablement une réponse disponible pour résoudre ce problème pour vous.
Ensuite, il suffit de créer une nouvelle colonne de géométrie dans votre trame de données qui combine les valeurs lat et lon en un shapely Point()
objet. Notez que le Point()
constructeur attend un tuple de valeurs flottantes, donc la conversion doit être incluse si les dtypes de colonne de la trame de données ne sont pas déjà définis sur float
.
from shapely.geometry import Point
# combine lat and lon column to a shapely Point() object
df['geometry'] = df.apply(lambda x: Point((float(x.lon), float(x.lat))), axis=1)
Maintenant, convertissez le pandas DataFrame en un GeoDataFrame
. Le constructeur de géopandas attend une colonne de géométrie qui peut être constituée d'objets de géométrie galbée, donc la colonne que nous avons créée est très bien:
import geopandas
df = geopandas.GeoDataFrame(df, geometry='geometry')
Pour vider ce GeoDataFrame dans un fichier de formes, utilisez la to_file()
méthode des géopandas (d'autres pilotes pris en charge par Fiona comme ceux qui GeoJSON
devraient également fonctionner):
df.to_file('MyGeometries.shp', driver='ESRI Shapefile')
Et voici à quoi ressemble le fichier de formes résultant lorsqu'il est visualisé avec QGIS :