Un peu tard mais peut-être aussi utile pour les autres. Oui, cela peut être fait avec shapelyet 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 geopandaset shapelysont 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 GeoJSONdevraient é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 :
