Sedikit terlambat tapi mungkin juga bermanfaat untuk orang lain. Ya, itu bisa dilakukan dengan shapely
dan geopandas
.
Misalkan panda dataframe Anda terlihat seperti ini:
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
Pertama, pastikan itu geopandas
dan shapely
diinstal dengan benar yang kadang-kadang tidak mudah karena mereka datang dengan beberapa dependensi (misalnya GEOS dan GDAL). Jika tidak berhasil pada percobaan pertama melalui pip install geopandas shapely
, cari kesalahan di Google atau StackOverflow / Gis.Stackexchange karena kemungkinan besar akan ada jawaban yang tersedia untuk menyelesaikan masalah itu untuk Anda.
Kemudian, itu hanya masalah membuat kolom geometri baru dalam kerangka data Anda yang menggabungkan nilai lat dan lon menjadi shapely Point()
objek. Perhatikan bahwa Point()
konstruktor mengharapkan tupel nilai float, jadi konversi harus disertakan jika dtip kolom dataframe belum diatur ke 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)
Sekarang, ubah panda DataFrame menjadi a GeoDataFrame
. Konstruktor geopanda mengharapkan kolom geometri yang dapat terdiri dari objek geometri yang indah, sehingga kolom yang kami buat baik-baik saja:
import geopandas
df = geopandas.GeoDataFrame(df, geometry='geometry')
Untuk membuang GeoDataFrame ini ke dalam shapefile, gunakan to_file()
metode geopanda (driver lain yang didukung oleh Fiona seperti yang GeoJSON
seharusnya juga berfungsi):
df.to_file('MyGeometries.shp', driver='ESRI Shapefile')
Dan seperti itulah bentuk shapefile yang dihasilkan ketika divisualisasikan dengan QGIS :