Saya memiliki kerangka data geopanda di EPSG: 4326 dan saya akan membuat kerangka data baru yang terdiri dari semua baris yang termasuk dalam kotak pembatas tertentu.
Pertama saya mendapatkan kotak pembatas yang saya pedulikan (yang sebenarnya adalah kotak pembatas dari kerangka data lain):
print df_sussex.total_bounds
[ -1.57239292 50.57467674 0.14528384 51.27465152]
Lalu saya membuat dataframe yang hanya terdiri dari kotak pembatas itu:
pts = gpd.GeoDataFrame(df_sussex.total_bounds)
Dan akhirnya saya mencoba untuk mendapatkan semua fitur yang bersinggungan dengan kotak pembatas itu:
sac_sussex = gpd.overlay(pts, df_sac, how='intersection')
Tapi ini memberiku AttributeError: No geometry data set yet (expected in column 'geometry'
.
Apa yang saya lakukan salah?
Jawaban:
Masalahnya adalah karena Anda menggunakan metode 'total_bounds'. Ini hanya menghasilkan sebuah tuple dengan poin max dan min dari kotak pembatas. Metode yang akan digunakan adalah 'amplop'; sebelumnya untuk membangun 'GeoDataFrame' masing-masing. Misalnya, membaca shapefile saya sebagai GeoDataFrame :
Membangun kotak pembatas pol1 dan membuat GeoDataFrame masing-masing :
Berpotongan kedua GeoDataFrame :
Merencanakan hasil:
Itu bekerja seperti yang diharapkan.
Catatan Pengeditan:
Dengan menggunakan metode 'total_bounds' (karena metode 'amplop' mengembalikan kotak pembatas untuk setiap fitur poligon), maka dapat digunakan pendekatan ini:
dan hasilnya identik.
sumber
Anda bisa menggunakan
cx
metode pada geodataframe untuk memilih baris dalam kotak pembatas. Untuk frame contoh Anda:Dari http://geopandas.org/indexing.html :
sumber
.cx
melakukan sesuatu yang sedikit berbeda darigpd.overlay
solusinya: ia memilih baris yang memotong kotak pembatas tetapi membiarkan geometri tetap utuh, sedangkangpd.overlay
solusi hanya akan mengembalikan bagian-bagian geometri dalam kotak pembatas. Tergantung pada situasi yang Anda inginkan satu atau yang lain.