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?
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?
Risposte:
Un po 'in ritardo ma forse utile anche per gli altri. Sì, questo può essere fatto con shapely
e 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 geopandas
e shapely
siano 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 GeoJSON
dovrebbero funzionare):
df.to_file('MyGeometries.shp', driver='ESRI Shapefile')
E questo è l'aspetto del file di forma risultante quando visualizzato con QGIS :
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')
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?