Stai creando lo shapefile dal dataframe di Pandas?


12

Mi piacerebbe costruire uno shapefile da un Pandas Data Frame usando le righe lon e lat.

Ho un file CSV e lo elaboro con Panda per creare un frame di dati che è più facile da gestire

È possibile farlo senza fare un giro riga per riga?


Se è CSV, potresti usare Aggiungi dati XY in ArcMap per creare un livello, quindi esportare come shapefile (livello rt-click e selezionare dati, esportare dati)?
mkennedy,

Grazie, ma mi piacerebbe farlo realizzando uno script Python. Non c'è bisogno di GIS
Kamome

1
usa GeoPandas
gene

Ah, capito. Forse eliminerò i miei commenti!
mkennedy,

Risposte:


16

Un po 'in ritardo ma forse utile anche per gli altri. Sì, questo può essere fatto con shapelye geopandas.

Supponiamo che il tuo frame di dati panda assomigli a questo:

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

Innanzitutto, assicurati che geopandase shapelysiano installati correttamente, che a volte non è facile perché presentano alcune dipendenze (ad esempio GEOS e GDAL). Se non funziona al primo tentativo tramite pip install geopandas shapely, cerca l'errore su Google o StackOverflow / Gis.Stackexchange perché molto probabilmente ci sarà una risposta disponibile per risolvere il problema.

Quindi, si tratta solo di creare una nuova colonna geometrica nel tuo frame di dati che combina i valori lat e lon in un shapely Point()oggetto. Si noti che il Point()costruttore prevede una tupla di valori float, quindi è necessario includere la conversione se i tipi di colonna della colonna del dataframe non sono già impostati su 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)

Ora converti il ​​DataFrame di Panda in a GeoDataFrame. Il costruttore geopandas si aspetta una colonna geometrica che può consistere in oggetti geometrici ben fatti, quindi la colonna che abbiamo creato va bene:

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

Per scaricare questo GeoDataFrame in uno shapefile, usa il to_file()metodo geopandas (anche altri driver supportati da Fiona come GeoJSONdovrebbero funzionare):

df.to_file('MyGeometries.shp', driver='ESRI Shapefile')

E questo è l'aspetto del file di forma risultante quando visualizzato con QGIS :

Shapefile risultante


2
Ciao, ho una situazione simile, ma invece di punti, ho poligoni. È possibile fare qualcosa di simile df ['geometry'] = df.apply (lambda x: Point ((float (x.lon), float (x.lat))), axis = 1) ma con poligoni?
Valerio D. Ciotti,

4

Per ArcMap è necessario definire la proiezione prima di esportare in 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')

Ho fatto qualcosa di simile, usando df.crs= "+init=epsg:27700"per proiettare il mio shapefile secondo la British National Grid. Tuttavia, quando lo apro in ArcGIS, il sistema di coordinate è sconosciuto. Che cosa sto facendo di sbagliato?
FaCoffee,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.