[Gfoss] Qgis e pyQgis: funzione contains()

Luca Mandolesi mandoluca a gmail.com
Gio 24 Feb 2011 23:23:12 CET


Ciao Giuseppe,
ho provato il plugin e gira correttamente. Tuttavia sto sbagliando qualcosa
nella creazione del dizionario.

Ho modificato lo script (vedi sotto) per le mie esigenze chiamando tutti i
poligoni (strati archeologici) e le quote relative di uno scavo
archeologico.
Ho creato un dizionario_strati e una lista_quote. a questo punto vorrei
ottenere un dizionario tipo questo:

{"strato_q":["quota_1", "quota_2", "quota_3"],  ... }

tuttavia, modificando in questo modo lo script:

         ...........
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

e stampando la lunghezza del dizionario, noto che il while passa in rassegna
tutte le geometrie poligonali (i miei strati), ma inserisce per ogni strato
in lista quote tutti i punti che ho richiamato, e non solo quelli che cadono
nella singola geometria. Ho fatto una verifica manuale su una geometria

https://picasaweb.google.com/mandoluca/Qgis#5577383282759381138

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())


Come faccio a passare alla lista solo i punti che cadono nella mia
geometria?

Grazie ancora

Luca



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 = {}
lista_quote = []

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_strati[featPoly.id()] = lista_quote

print diz

print "Numero di poligoni controllati: ", len(diz)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gfoss.it/pipermail/gfoss/attachments/20110224/7a145c5a/attachment.htm>


Maggiori informazioni sulla lista Gfoss