Saya mengalami kesulitan memahami penggunaan indeks spasial dengan RTree.
Contoh: Saya memiliki 300 titik buffer, dan saya perlu tahu area persimpangan masing-masing buffer dengan bentuk poligon. Shapefile poligon memiliki> 20.000 poligon. Disarankan agar saya menggunakan indeks spasial untuk mempercepat proses.
JADI ... Jika saya membuat indeks spasial untuk bentuk poligon saya, apakah akan "dilampirkan" ke file dengan cara tertentu, atau akankah indeks berdiri sendiri? Yaitu, setelah membuatnya, bisakah saya menjalankan fungsi persimpangan pada file poligon dan mendapatkan hasil yang lebih cepat? Akankah persimpangan "melihat" bahwa ada indeks spasial dan tahu apa yang harus dilakukan? Atau, apakah saya harus menjalankannya di indeks, lalu menghubungkan kembali hasil-hasil itu ke file poligon asli saya melalui FID atau semacamnya?
Dokumentasi RTree tidak banyak membantu saya (mungkin karena saya baru belajar pemrograman). Mereka menunjukkan cara membuat indeks dengan membaca poin yang dibuat secara manual, dan kemudian menanyakannya terhadap poin lain yang dibuat secara manual, yang mengembalikan id yang terkandung dalam jendela. Masuk akal. Tetapi, mereka tidak menjelaskan bagaimana hal itu akan berhubungan kembali dengan beberapa file asli dari mana indeks tersebut berasal.
Saya pikir itu harus seperti ini:
- Tarik kotak untuk setiap fitur poligon dari shapefile poligon saya dan letakkan di indeks spasial, beri mereka id yang sama dengan id mereka di shapefile.
- Permintaan indeks itu untuk mendapatkan id yang berpotongan.
- Kemudian jalankan kembali persimpangan saya hanya pada fitur-fitur di shapefile asli saya yang diidentifikasi dengan menanyakan indeks saya (tidak yakin bagaimana saya akan melakukan bagian terakhir ini).
Apakah saya punya ide yang tepat? Apakah saya kehilangan sesuatu?
Saat ini saya sedang berusaha agar kode ini berfungsi pada satu titik shapefile yang hanya berisi satu fitur titik, dan satu poligon bentuk yang berisi> 20.000 fitur poligon.
Saya mengimpor shapefile menggunakan Fiona, menambahkan indeks spasial menggunakan RTree, dan mencoba melakukan persimpangan menggunakan Shapely.
Kode pengujian saya terlihat seperti ini:
#point shapefile representing location of desired focal statistic
traps = fiona.open('single_pt_speed_test.shp', 'r')
#polygon shapefile representing land cover of interest
gl = MultiPolygon([shape(pol['geometry']) for pol in fiona.open('class3_aa.shp', 'r')])
#search area
areaKM2 = 20
#create empty spatial index
idx = index.Index()
#set initial search radius for buffer
areaM2 = areaKM2 * 1000000
r = (math.sqrt(areaM2/math.pi))
#create spatial index from gl
for i, shape in enumerate(gl):
idx.insert(i, shape.bounds)
#query index for ids that intersect with buffer (will eventually have multiple points)
for point in traps:
pt_buffer = shape(point['geometry']).buffer(r)
intersect_ids = pt_buffer.intersection(idx)
Tapi saya terus mendapatkan TypeError: objek 'Polygon' tidak bisa dipanggil
TypeError: 'Polygon' object is not callable
dengan contoh pembaruan Anda karena Anda menimpa shape
fungsi yang Anda impor dari bentuk dengan objek Polygon yang Anda buat dengan baris ini:for i, shape in enumerate(gl):