J'aimerais construire un fichier de formes à partir d'un cadre de données Pandas en utilisant les lignes lon & lat.
J'ai un fichier csv et je le traite avec des pandas pour créer un bloc de données plus facile à manipuler
Est-il possible de le faire sans faire de boucle ligne par ligne?
Réponses:
Un peu tard mais peut-être aussi utile pour les autres. Oui, cela peut être fait avec
shapely
etgeopandas
.Supposons que votre cadre de données pandas ressemble à ceci:
Tout d'abord, assurez-vous que
geopandas
etshapely
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 viapip 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 lePoint()
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 surfloat
.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: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 quiGeoJSON
devraient également fonctionner):Et voici à quoi ressemble le fichier de formes résultant lorsqu'il est visualisé avec QGIS :
la source
Pour ArcMap, vous devez définir la projection avant d'exporter vers Shapefile.
la source
df.crs= "+init=epsg:27700"
pour projeter mon shapefile selon le British National Grid. Cependant, lorsque je l'ouvre dans ArcGIS, le système de coordonnées est inconnu. Qu'est-ce que je fais mal?