[Gfoss] Come selezionare i punti nella bbox di un poligono con le API 2.0 di QGis

Salve a tutti,
dopo 3 giorni di moccoli mi arrendo.
Avevo un vecchio codice che funzionava, aiutato da Sucameli che ancora ringrazio, ma ora con le nuove API non funzia più.

Problema tanti punti di quota e tanti poligoni a cui le quote sono relative.

Riesco a rintracciare quali quote stanno dentro a quale poligono, ma il tempo preso dallo script è lungo nel caso su ogni geometria dovessi iterare con il contains per capire se un punto è al suo interno. Ergo, nel vecchio script prima si selezionavano i punti dentro la BBOX del poligono e poi si verificava se effettivamente il punto era al suo interno o meno…

Alla riga 29 del codice qui postato mi perdo: http://codepad.org/dTwrRtB6

Prima si aveva una cosa simile ma ora non funziona più:

while vlPolygons.nextFeature( featPoly ): # cicli sulle feature recuperate, featPoly conterra la feature poligonale attuale
vlPoints.select( , featPoly.geometry().boundingBox() ) # recupera i punti nel bbox del poligono
featPoint = QgsFeature() # crei una feature vuota per il punto

while vlPoints.nextFeature( featPoint ): # cicli sulle feature recuperate, featPoint conterra la feature puntale attuale
if featPoly.geometry().contains( featPoint.geometry() ): # adesso con la contains() verifichi che effettivamente sia contenuto nel poligono
lista_quote.append(featPoint.id())
dizionario_id_contains[featPoly.id()] = lista_quote
lista_quote =

Domanda: come capire la sintassi per fare un select di una serie di punti dentro a una feature poligonale in base al suo bbox?

Grazie per una eventuale mano.
Luca

http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/vector.html#iterating-over-a-subset-of-features

devi vedere le proprieta' della classe QgsFeatureRequest

2014-09-02 23:09 GMT+02:00 Luca Mandolesi <mandoluca@gmail.com>:

Salve a tutti,
dopo 3 giorni di moccoli mi arrendo.
Avevo un vecchio codice che funzionava, aiutato da Sucameli che ancora
ringrazio, ma ora con le nuove API non funzia più.

Problema tanti punti di quota e tanti poligoni a cui le quote sono relative.

Riesco a rintracciare quali quote stanno dentro a quale poligono, ma il
tempo preso dallo script è lungo nel caso su ogni geometria dovessi iterare
con il contains per capire se un punto è al suo interno. Ergo, nel vecchio
script prima si selezionavano i punti dentro la BBOX del poligono e poi si
verificava se effettivamente il punto era al suo interno o meno...

Alla riga 29 del codice qui postato mi perdo: http://codepad.org/dTwrRtB6

Prima si aveva una cosa simile ma ora non funziona più:

while vlPolygons.nextFeature( featPoly ): # cicli sulle feature recuperate,
featPoly conterra la feature poligonale attuale
vlPoints.select( , featPoly.geometry().boundingBox() ) # recupera i punti
nel bbox del poligono
featPoint = QgsFeature() # crei una feature vuota per il punto

while vlPoints.nextFeature( featPoint ): # cicli sulle feature recuperate,
featPoint conterra la feature puntale attuale
if featPoly.geometry().contains( featPoint.geometry() ): # adesso con la
contains() verifichi che effettivamente sia contenuto nel poligono
lista_quote.append(featPoint.id())
dizionario_id_contains[featPoly.id()] = lista_quote
lista_quote =

Domanda: come capire la sintassi per fare un select di una serie di punti
dentro a una feature poligonale in base al suo bbox?

Grazie per una eventuale mano.
Luca

_______________________________________________
Gfoss@lists.gfoss.it
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni
dell'Associazione GFOSS.it.
666+40 iscritti al 5.6.2014

Il giorno Tue, 2 Sep 2014 23:09:02 +0200
Luca Mandolesi <mandoluca@gmail.com> ha scritto:

Salve a tutti,

ciao Luca,

dopo 3 giorni di moccoli mi arrendo.
Avevo un vecchio codice che funzionava, a......
Prima si aveva una cosa simile ma ora non funziona più:

avevo lasciato in sospeso il tuo post, rileggendolo ora mi rendo conto
di non capire bene il tuo problema;

dando per scontato che la logica(*) sia giusta, dovrebbe
essere il codice a darti problemi(**), ma non capisco cosa non ti
funzioni :frowning: se hai voglia di chiarire ? :slight_smile:

Grazie per una eventuale mano.
Luca

ciao,
giuliano

(*) uso del bb è utile per scartare i casi lampantemente inutili per
focalizzarsi su quelli positivi

(**) è cambiato nelle API2.0 il metodo di iterare il layer: se è questo
basta correggere la sintassi della prima riga del ciclo iterativo;

Ciao Giuliano.

Ti ripropongo il frammento di codice che non funziona più:

while vlPolygons.nextFeature( featPoly ): # cicli sulle feature recuperate,
featPoly conterra la feature poligonale attuale
vlPoints.select( , featPoly.geometry().boundingBox() ) # recupera i punti
nel bbox del poligono
featPoint = QgsFeature() # crei una feature vuota per il punto

while vlPoints.nextFeature( featPoint ): # cicli sulle feature recuperate,
featPoint conterra la feature puntale attuale
if featPoly.geometry().contains( featPoint.geometry() ): # adesso con la
contains() verifichi che effettivamente sia contenuto nel poligono
lista_quote.append(featPoint.id())
dizionario_id_contains[featPoly.id()] = lista_quote
lista_quote =

Al posto di while vlPolygons.nextFeature( featPoly ) cosa dovrei usare? Ma
soprattutto non riesco a beccare un changelog che mi aiuti.

Provo a spiegare il problema...ma a dire il vero non serve saperlo! E'
tanto per edurvi (si dice?)...ma se ci accettano al GFOSS DAY sarò in prima
fila a spiegare tali problemi.

Il mio problema fa parte di un problema più ampio relativo all'archeologia.
Provo a scrivertelo, quello che ti sfugge chiedi pure.
In uno scavo oltre alla terza dimensione abbiamo pure la quarta da gestire.

Quindi in una data area si possono avere sovrapposizioni di US (Unità
stratigrafiche, ovvero singole azioni umane: muri, pavimenti, buche, ecc.)
che aumentano o diminuiscono al passare del tempo. Se guardi questo video
forse ti è più chiaro: http://www.youtube.com/watch?v=0wkB2FuXjxs

Dal minuto 0:15 grazie al "Manopolone del tempo", al variare di quel valore
numerico che rappresenta la cronologia relativa tra diversi livelli,
appaiono o scompaiono le US in relazione alla loro presenza o meno in una
data fase del sito.

Tuttavia vedrai che ci sono solo strati e non quote. Bene..ora ipotizziamo
di voler fare una pianta con le quote. Se nel sito ho 100 US e circa 500
quote, è scomodo verificare se ogni quota è dentro ad un poligono. SI fa
prima a fare un subset su BBox selezionando solo quelle nel BBOX, poi fare
un test col contains...a quel punto il sistema andrà a pescare nel database
se la data quota contenuta dentro al poligono è relativa al poligono stesso
ad un poligono che la copre..A quel punto verrà eliminata dalla pianta di
fase...

Pensa che ad oggi la maggior parte degli archeologi fa questa cosa a
mano...con schede e carta da lucido...

Intanto ciao e grazie e scusate la prolissità archeologica.
Luca

Il giorno Thu, 4 Sep 2014 18:36:41 +0200
Luca Mandolesi <mandoluca@gmail.com> ha scritto:

Ciao Giuliano.

ciao,

Ti ripropongo il frammento di codice che non funziona più:

while vlPolygons.nextFeature( featPoly ): # .....

il modo di iterare il layer è cambiato, dovresti usare:
  for feat in vlPolygons.getFeatures():

scusa, fatti dare conferma da altri in lista perchè è un pò che non
gioco con pyqgis e sono un pò arugginito, però la tua mi sembra una
modalità obsoleta;

.....
Quindi in una data area si possono avere sovrapposizioni di US (Unità
stratigrafiche, ovvero singole azioni umane: muri, pavimenti, buche,
ecc.) che aumentano o diminuiscono al passare del tempo......
.... SI fa prima a fare un subset su BBox selezionando solo
quelle nel BBOX, poi fare un test col contains...

infatti il controllo sul BB va bene, è un test più semplice dell'altro
e che elimina tutte le occorrenze inutili, diminuendo il numero di test
da eseguire;

Intanto ciao e grazie e scusate la prolissità archeologica.
Luca

ciao,
giuliano