Ho difficoltà a comprendere l'uso degli indici spaziali con RTree.
Esempio: ho 300 punti bufferizzati e ho bisogno di conoscere l'area di intersezione di ciascun buffer con un file di forma poligonale. Il file di forma poligonale ha> 20.000 poligoni. Mi è stato suggerito di utilizzare indici spaziali per accelerare il processo.
Quindi ... Se creo un indice spaziale per il mio shapefile del poligono, sarà "allegato" al file in qualche modo o l'indice rimarrà da solo? Cioè, dopo averlo creato, posso semplicemente eseguire la mia funzione di intersezione sul file poligonale e ottenere risultati più veloci? L'intersezione "vedrà" l'esistenza di indici spaziali e saprà cosa fare? Oppure, devo eseguirlo sull'indice, quindi ricollegare quei risultati al mio file poligonale originale tramite FID o alcuni di questi?
La documentazione di RTree non mi aiuta molto (probabilmente perché sto solo imparando la programmazione). Mostrano come creare un indice leggendo i punti creati manualmente e quindi eseguendo una query su altri punti creati manualmente, che restituisce gli ID contenuti nella finestra. Ha senso. Ma non spiegano come ciò si ricollegherebbe a qualche file originale da cui sarebbe arrivato l'indice.
Sto pensando che debba andare qualcosa del genere:
- Estrai le bbox per ogni feature poligonale dal mio shapefile del poligono e inseriscile in un indice spaziale, dando loro un id uguale al loro id nel file shape.
- Interroga quell'indice per ottenere gli ID che si intersecano.
- Quindi rieseguire il mio incrocio solo sulle funzionalità del mio shapefile originale che sono state identificate interrogando il mio indice (non sono sicuro di come farei quest'ultima parte).
Ho l'idea giusta? Mi sto perdendo qualcosa?
In questo momento sto cercando di far funzionare questo codice su un file di forma punto che contiene solo una funzione punto e un file di forma poligono che contiene> 20.000 funzioni poligono.
Sto importando gli shapefile usando Fiona, aggiungendo l'indice spaziale usando RTree e provando a fare l'intersezione usando Shapely.
Il mio codice di test è simile al seguente:
#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)
Ma continuo a ricevere TypeError: l'oggetto 'Polygon' non è richiamabile
TypeError: 'Polygon' object is not callable
con il tuo esempio di aggiornamento perché sovrascrivi la shape
funzione che hai importato da shapely con un oggetto Polygon che crei con questa riga:for i, shape in enumerate(gl):