Ein bisschen spät, aber vielleicht auch nützlich für andere. Ja, das geht mit shapely
und geopandas
.
Angenommen, Ihr Pandas-Datenframe sieht ungefähr so aus:
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
Stellen Sie zunächst sicher, dass geopandas
und shapely
ordnungsgemäß installiert sind, was manchmal nicht einfach ist, da einige Abhängigkeiten bestehen (z. B. GEOS und GDAL). Wenn dies beim ersten Versuch über nicht funktioniert pip install geopandas shapely
, suchen Sie in Google oder StackOverflow / Gis.Stackexchange nach dem Fehler, da höchstwahrscheinlich eine Antwort verfügbar ist, die das Problem für Sie löst.
Dann müssen Sie lediglich eine neue Geometriespalte in Ihrem Datenrahmen erstellen, in der die Werte lat und lon zu einem shapely Point()
Objekt kombiniert werden. Beachten Sie, dass der Point()
Konstruktor ein Tupel von Gleitkommawerten erwartet. Daher muss die Konvertierung eingeschlossen werden, wenn die Spaltentypen des Datenrahmens nicht bereits auf festgelegt sind 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)
Konvertieren Sie nun den pandas DataFrame in einen GeoDataFrame
. Der Geopandas-Konstruktor erwartet eine Geometriespalte, die aus formschönen Geometrieobjekten bestehen kann. Die von uns erstellte Spalte ist also in Ordnung:
import geopandas
df = geopandas.GeoDataFrame(df, geometry='geometry')
Um dieses GeoDataFrame in eine Shape - Datei Dump, Verwendung geopandas' to_file()
Methode (andere Treiber unterstützt von Fiona wie GeoJSON
sollte auch Arbeit):
df.to_file('MyGeometries.shp', driver='ESRI Shapefile')
Und so sieht das resultierende Shapefile aus, wenn es mit QGIS visualisiert wird :