[Gfoss] Qgis e pyQgis: funzione contains()

Giuseppe Sucameli sucameli a faunalia.it
Ven 25 Feb 2011 00:03:11 CET


Ciao Luca,

2011/2/24 Luca Mandolesi <mandoluca a gmail.com>

> qui dovrebbero comparire nella lista legata alla geometria bordata in
> rosso, solo tre quote, invece le ho richiamate tutte....ovviamente l'errore
> è in:
>
> lista_quote.append(featPoint.id())
>
Non è esattamente quella istruzione il problema. Tuttavia fino a questo
momento non avevo
capito dalle tue frasi se nella lista c'erano tutti i punti o tutti quelli
dentro il bbox anche se
effettivamente stavano fuori.

Ma a vedere dal codice sotto, il problema è il primo:
il dizionario da segno che tutti i poligono contengono tutti i punti... :|
Impressionante! :)

Ecco la soluzione:

import sys
> sys.path.insert(0, '/Applications/QGIS.app/Contents/Resources/python/')
> from qgis.core import *
> from qgis.gui import *
>
> # supply path to where is your qgis installed
> QgsApplication.setPrefixPath("/Applications/QGIS.app/Contents/MacOS/",
> True)
>
> # load providers
> QgsApplication.initQgis()
>
> uri = QgsDataSourceURI()
> # set host name, port, database name, username and password
> uri.setConnection("localhost", "5432", "pyarchinit", "postgres", "mypass")
> # set database schema, table name, geometry column and optionaly subset
> (WHERE clause)
> uri.setDataSource("public", "pyunitastratigrafiche", "the_geom", "scavo_s =
> 'Palazzo Ghetti, Rimini' AND area_s = 1")
> vlPolygons = QgsVectorLayer(uri.uri(), "US", "postgres")
> uri.setDataSource("public", "pyarchinit_quote", "the_geom", "sito_q =
> 'Palazzo Ghetti, Rimini' AND area_q = 1")
> vlPoints = QgsVectorLayer(uri.uri(), "Quote", "postgres")
>
> if vlPolygons.isValid():
>   print "Layer polygons loaded!"
>
> if vlPoints.isValid():
>   print "Layer points loaded!"
>
>
> vlPolygons.select( [] ) # recuperi tutte le geometrie senza attributi
> featPoly = QgsFeature() # crei una feature vuota per il poligono
>
> dizionario_strati = {}
>
fino qui è ok.


> lista_quote = []
>
è questa linea che crea tutti i problemi:
tu crei una lista fuori dai 2 cicli, quindi la lista sarà sempre la stessa
ad ogni ciclo e quindi
aggiungerai sempre la medesima lista a tutte le voci del dizionario. La
lista alla fine conterrà
tutti i punti (o quasi tutti, dipende dall'unione dei bbox dei poligoni),
quindi ogni voce del
dizionario avrà sempre come valore una lista (la medesima) con tutti i
punti.

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
>
Inserisci invece la riga di creazione della lista qui e tutto si dovrebbe
risolvere ;)


>  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_strati[featPoly.id()] = lista_quote
>
> print diz
>
> print "Numero di poligoni controllati: ", len(diz)
>

Saluti.

-- 
Giuseppe Sucameli
-------------- parte successiva --------------
Un allegato HTML ?tato rimosso...
URL: <http://lists.gfoss.it/pipermail/gfoss/attachments/20110225/2cd5d22d/attachment-0001.htm>


Maggiori informazioni sulla lista Gfoss