Faire un fichier de formes à partir d'une trame de données Pandas?

12

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?

kamome
la source
Si c'est csv, pourriez-vous utiliser Ajouter des données XY dans ArcMap pour créer une couche, puis exporter en tant que fichier de formes (couche rt-click et sélectionner des données, exporter des données)?
mkennedy
Merci, mais j'aimerais faire cela en créant un script python. Pas besoin de SIG
kamome
1
utiliser GeoPandas
gène
Ah, j'ai compris. Je vais peut-être supprimer mes commentaires!
mkennedy

Réponses:

16

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 :

Fichier de formes résultant

Poignard
la source
2
Salut, j'ai une situation similaire, mais au lieu de points, j'ai des polygones. Il est possible de faire quelque chose de similaire df ['geometry'] = df.apply (lambda x: Point ((float (x.lon), float (x.lat))), axis = 1) mais avec des polygones?
Valerio D. Ciotti
4

Pour ArcMap, vous devez définir la projection avant d'exporter vers Shapefile.

import geopandas
df = geopandas.GeoDataFrame(df, geometry='geometry')

# proj WGS84

df.crs= "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"

df.to_file('MyGeometries.shp', driver='ESRI Shapefile')
Ivan Moran
la source
J'ai fait quelque chose de similaire, en utilisant 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?
FaCoffee