[QGIS-it-user] pyQgis: come verificare una gemetria id=X nel corso di un ciclo?

Marco Grisolia marco.grisolia5 a gmail.com
Lun 7 Nov 2016 14:43:32 PST


Ho cambiato il codice di prima, omettendo il ciclo for che hai
segnalato: mi è bastato cambiare "l'ordine degli addendi" e dare una
diversa definizione del dizionario "allfeatures". Trovi il codice
commentato qui sotto, ma aggiungo una nota: in presenza di alcune
intersezioni 'vere' e di altre intersezioni 'false', il vecchio codice
generava falsi positivi assegnado il valore 'vero' (in sostanza,
bastava che ci fosse almeno un'intersezione tra le features nel
rapporto perché il risultato fosse 'VERO'). Spero che ora sia a posto!
Ciao,
Marco

#####################

# se vuoi verificare l'intersezione, 'copre' e 'coperto' significano
la stessa cosa
test_string1 = 'copre'
test_string2 = 'coperto'

# Crea un dizionario con tutte le features
allfeatures={}
for item in vlayer.getFeatures():
    allfeatures[item[0]] = QgsFeature(item)

for feat1 in allfeatures.values():
    feat = 'Feature No. %s,' %(feat1[0])
    string = '%s %s,' %(feat1[0], feat1[1])
    inGeom1 = feat1.geometry()
    if test_string1 in item[1] or test_string2 in item[1]: # faccio il
controllo sul rapporto
        test = feat1[1]
        numb_test1=[int(s) for s in test.split() if s.isdigit()] #
estraggo i valori numerici dal rapporto
        if numb_test1: # vado avanti solo se numb_test1 e' una lista
non nulla (cosi' evito di portarmi dietro i rapporti con formattazione
sbagliata o non richiesta
            numbs = [] # qui inserisco tutti i risultati delle
intersezioni (vedi dopo)
            for k in numb_test1: # verifico l'intersezione tra feat1 e
tutti i valori numerici presenti nel rapporto
                inGeom2 = allfeatures[k].geometry()
                if inGeom1.intersects(inGeom2):
                    check = 'VERO'
                    numbs.append(check)
                else:
                    check = 'FALSO'
                    numbs.append(check)
            if numbs.count(numbs[0]) != len(numbs): # se i valori di
numbs non sono tutti uguali (tutti 'VERO' o tutti 'FALSO', allora il
rapporto e' 'FALSO'
                check = 'FALSO'
            print feat, string, check

Il 7 novembre 2016 20:40, Luca Mandolesi <mandoluca a gmail.com> ha scritto:
> Grazie Marco,
> credo che hai risolto il mio problema, poi lo riadatto e vedo se mi funzia.
> Dal codice mi pare che fai quello che voglio io ma partendo da una
> strutturazione diversa del codice.
> Io iteravo sulle feature e trovando la condizione copre == vero, cercavo di
> richiamare la feature tramite il suo id per confrontarla dentro al ciclo.
>
> Nel tuo caso se capisco bene prima si itera su tutte e si ricava la
> condizione copre == vero, poi si reitera su tutte le feature che hanno solo
> quella condizione e salti il confronto con se stessa con if feat2 != feat1.
>
> Invece io volevo evitare questo passaggio: for feat2 in
> vlayer.getFeatures():
> e mentre ero nel primmo ciclo, trovando che 1 copre 2, dirgli di chiamare da
> vlayer solo la feat == 2 e verificae l'intersect.
>
> Ora non mi resta che provare.
>
> Grazie mille
> Luca
>


Maggiori informazioni sulla lista QGIS-it-user