Saya mencoba melakukan join spasial seperti contoh di sini: Apakah ada opsi python untuk "menggabungkan atribut berdasarkan lokasi"? . Namun, pendekatan itu tampaknya sangat tidak efisien / lambat. Bahkan menjalankan ini dengan 250 poin sederhana membutuhkan waktu hampir 2 menit dan gagal sepenuhnya pada shapefile dengan> 1.000 poin. Apakah ada pendekatan yang lebih baik? Saya ingin melakukan ini sepenuhnya dalam Python tanpa menggunakan ArcGIS, QGIS, dll.
Saya juga tertarik untuk mengetahui apakah itu mungkin untuk atribut SUM (yaitu populasi) dari semua titik yang termasuk dalam poligon dan menggabungkan jumlah itu ke poligon.
Ini kode yang saya coba konversi. Saya mendapatkan kesalahan di saluran 9:
poly['properties']['score'] += point['properties']['score']
yang mengatakan:
TypeError: jenis operan yang tidak didukung untuk + =: 'NoneType' dan 'float'.
Jika saya mengganti "+ =" dengan "=" itu berfungsi dengan baik tapi itu tidak menjumlahkan bidang. Saya juga mencoba menjadikan ini sebagai bilangan bulat tetapi gagal juga.
with fiona.open(poly_shp, 'r') as n:
with fiona.open(point_shp,'r') as s:
outSchema = {'geometry': 'Polygon','properties':{'region':'str','score':'float'}}
with fiona.open (out_shp, 'w', 'ESRI Shapefile', outSchema, crs) as output:
for point in s:
for poly in n:
if shape(point['geometry']).within(shape(poly['geometry'])):
poly['properties']['score']) += point['properties']['score'])
output.write({
'properties':{
'region':poly['properties']['NAME'],
'score':poly['properties']['score']},
'geometry':poly['geometry']})
sumber
Jawaban:
Fiona mengembalikan kamus Python dan Anda tidak bisa menggunakan
poly['properties']['score']) += point['properties']['score'])
kamus.Contoh menjumlahkan atribut menggunakan referensi yang diberikan oleh Mike T:
Sekarang, kita dapat menggunakan dua metode, dengan atau tanpa indeks spasial:
1) tanpa
2) dengan indeks R-tree (Anda dapat menggunakan pyrtree atau rtree )
Hasil dengan dua solusi:
Apa bedanya ?
Setelah:
Untuk melangkah lebih jauh, lihat Menggunakan Rtree Spatial Indexing Dengan OGR, Shapely, Fiona
sumber
Selain itu - geopanda sekarang secara opsional termasuk
rtree
sebagai ketergantungan, lihat repo githubJadi, alih-alih mengikuti semua kode (sangat bagus) di atas, Anda bisa melakukan sesuatu seperti:
Untuk mendapatkan fungsionalitas yang bagus ini, pastikan untuk menginstal libspatialindex C-library terlebih dahulu
EDIT: impor paket yang diperbaiki
sumber
rtree
opsional. Bukankah itu berarti Anda perlu menginstalrtree
sertalibspatialindex
C-library?rtree
ketika saya pertama kali menginstallibspatialindex
... mereka telah melakukan rilis yang cukup besar sejak jadi saya yakin semuanya telah berubah sedikitGunakan Rtree sebagai indeks untuk melakukan penggabungan yang jauh lebih cepat, lalu Shapely melakukan predikat spasial untuk menentukan apakah suatu titik benar-benar berada dalam poligon. Jika dilakukan dengan benar, ini bisa lebih cepat daripada kebanyakan GIS lainnya.
Lihat contoh di sini atau di sini .
Bagian kedua dari pertanyaan Anda tentang 'SUM', gunakan
dict
objek untuk mengumpulkan populasi menggunakan id poligon sebagai kuncinya. Meskipun, hal semacam ini dilakukan jauh lebih baik dengan PostGIS.sumber
Halaman web ini menunjukkan bagaimana menggunakan pencarian point-in-polygon Bounding Box sebelum yang lebih mahal dalam kueri spasial dari Shapely.
http://rexdouglass.com/fast-spatial-joins-in-python-with-a-spatial-index/
sumber