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 _______________________________________________ [hidden email] 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 |
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 <[hidden email]>: > 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 > > _______________________________________________ > [hidden email] > 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 [hidden email] 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 |
In reply to this post by mando
Il giorno Tue, 2 Sep 2014 23:09:02 +0200
Luca Mandolesi <[hidden email]> 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 :-( se hai voglia di chiarire ? :-) > 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; _______________________________________________ [hidden email] 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 |
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 _______________________________________________ [hidden email] 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 Thu, 4 Sep 2014 18:36:41 +0200
Luca Mandolesi <[hidden email]> 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 _______________________________________________ [hidden email] 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 |
Free forum by Nabble | Edit this page |