[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 07:06:08 PST


Sperando di essere ancora in tempo, ti parlo della mia idea.
Premetto di non avere capito del tutto come siano strutturati i tuoi dati,
per cui la soluzione che ti propongo potrebbe essere leggermente modificata
in funzione di come essi siano presentati.
Ho creato questa situazione, sperando che sia rappresentativa del tuo caso:



​

Lo script che ti incollo nel seguito esegue queste operazioni:
1) cerco le features che hanno, tra gli attributi, un determinato valore (
o "rapporto", come lo chiami tu);
2) salvo queste features in un dizionario;
3) estrapolo dalla colonna del rapporto (in questo caso, quella con indice
[1]) i valori numerici che fanno riferimento alle geometrie da confrontare;
4) verifico che la feature in esame intersechi le altre features di
confronto;
5) stampo in ordine: il codice della feature, il rapporto dichiarato, la
veridicità di quanto riportato nel rapporto (VERO o FALSO).

Per questo esempio, lo script stampa a video il risultato:
Feature No. 3, 3 copre 2, FALSO
Feature No. 5, 5 copre 3 e 4, VERO
Feature No. 4, 4 copre 5, VERO
Feature No. 6, 6 coperto da 7, VERO
Feature No. 7, 7 copre 6, VERO

Come puoi notare, ho scritto volutamente un rapporto sbagliato per la
feature 3 ("3 copre 2") per validare lo script.

Sperando di non essere andato troppo fuori strada (o di aver commesso altri
errori formali), ti incollo il codice che ho utilizzato io, 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 che soddisfano il test
allfeatures={}
for item in vlayer.getFeatures():
    if test_string1 in item[1] or test_string2 in item[1]:
        allfeatures[item.id()] = QgsFeature(item)

# cerca se quello riportato nel rapporto è VERO o FALSO
for feat1 in allfeatures.values():
    feat = 'Feature No. %s,' %(feat1[0])
    intersect=[]
    string = '%s %s,' %(feat1[0], feat1[1])
    inGeom1 = feat1.geometry()
    test = feat1[1]
    numb_test1=[int(s) for s in test.split() if s.isdigit()]
    str1 = ','.join(str(e) for e in numb_test1)
    for feat2 in vlayer.getFeatures():
        if feat2 != feat1:
            inGeom2 = feat2.geometry()
            if inGeom1.intersects(inGeom2):
                intersect.append(feat2[0])
            for l in numb_test1:
                if l in intersect:
                    check = 'VERO'
                else:
                    check = 'FALSO'
    print feat, string, check

Il giorno 6 novembre 2016 15:06, Giuliano Curti <giulianc51 a gmail.com> ha
scritto:

> On 11/6/16, Luca Mandolesi <mandoluca a gmail.com> wrote:
> > Il giorno 6 novembre 2016 13:33, Giuliano Curti <giulianc51 a gmail.com>
> ha
> > scritto:
> >
> >> On 11/6/16, Luca Mandolesi <mandoluca a gmail.com> wrote:
> >
> > mentre sono in un ciclo for e analizzo il campo di un record, come
> faccio a
> > chiamare un altro record e caricarne la geometria.
>
> rimango sempre nel dubbio di aver capito bene :-) questo spezzone di
> codice cmq ti dà le due feature f1 e f2, le rispettive geometrie, le
> confronta (scartando ovviamente il controllo
> con sè stessa) e puoi accedere ad ogni altro loro attributo;
>
>         for f1 in layer.getFeatures():
>                 ......
>                 for f2 in layer.getFeatures():
>                         ........
>                         if f2.id() <> f1.id():
>                                 .........
>                                 if f1.geometry().intersects(f2.
> geometry()):
>                                         (controllo se l'attributo delle
> due feature è corretto)
>                                         .......
>
> NB: per il tuo caso forse è ridondante perchè confronta A con B e B
> con A, mentre a te potrebbe bastare confrontare A con B, ad es.
> modificando il test in
>                         if f2.id() > f1.id():
> o qualche modo migliore che sapranno indicarti altri;
>
> > Ciao
> > Luca
>
> ciao,
> giuliano
> _______________________________________________
> QGIS-it-user mailing list
> QGIS-it-user a lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/qgis-it-user
>
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.osgeo.org/pipermail/qgis-it-user/attachments/20161107/837acacc/attachment-0001.html>
-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        b.PNG
Tipo:        image/png
Dimensione:  2624 bytes
Descrizione: non disponibile
URL:         <http://lists.osgeo.org/pipermail/qgis-it-user/attachments/20161107/837acacc/attachment-0002.png>
-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        tt.PNG
Tipo:        image/png
Dimensione:  18079 bytes
Descrizione: non disponibile
URL:         <http://lists.osgeo.org/pipermail/qgis-it-user/attachments/20161107/837acacc/attachment-0003.png>


Maggiori informazioni sulla lista QGIS-it-user