Re: [QGIS-it-user] pyQgis: come verificare una gemetria id=X nel corso di un ciclo?
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 Curtiha scritto: > On 11/6/16, Luca Mandolesi wrote: > > Il giorno 6 novembre 2016 13:33, Giuliano Curti > ha > > scritto: > > > >> On 11/6/16, Luca Mandolesi 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@lists.osgeo.org > http://lists.osgeo.org/mailman/listinfo/qgis-it-user > ___ QGIS-it-user mailing list QGIS-it-user@lists.osgeo.org http://lists.osgeo.org/mailman/listinfo/qgis-it-user
Re: [QGIS-it-user] pyQgis: come verificare una gemetria id=X nel corso di un ciclo?
On 11/6/16, Luca Mandolesiwrote: > Il giorno 6 novembre 2016 13:33, Giuliano Curti ha > scritto: > >> On 11/6/16, Luca Mandolesi 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@lists.osgeo.org http://lists.osgeo.org/mailman/listinfo/qgis-it-user
Re: [QGIS-it-user] pyQgis: come verificare una gemetria id=X nel corso di un ciclo?
Ciao Marco. per ora devo solo mandare fuori l'id delle 2 geometrie e la verifica della presenza di intersezione. Dal cookbook si arriva bene qua: iter = vlayer.getFeatures() Faccio un loop sulle singole geometrie e se becco il rapporto copre ricavare da iter la feature id=x senza fare un loop. Tipo con una chiamata: #singFeat = vlayer.featureAtId(1) Ma mi dice che vlayer non ha featureAtId come metodo E' possibile? Grazie Luca # Dilungandosi nei particolari Il loop è eseguito su un tabella view che fonde la tabella spaziale con la tabella alfanumerica. Quindi se nel campo rapporto c'è scritto 1 copre 2, devo chiamare le geometrie di 1 e 2 e fare un verifica l'intersezione. Facendo un loop sulla view accedo al campo rapporti, quando si verifica la condizione "copre" (e fin qui ci sono come script python) allora nel loop dal provider devo ricavare la geometria ed è qui che non capisco come accedere dal provider al dato geometry. uri = QgsDataSourceURI() uri.setDatabase('C:\\Users\\Luca\\pyarchinit_DB_folder\\pyarchinit_db.sqlite') uri.setDataSource('','pyarchinit_us_view', 'the_geom') provider = vlayer.dataProvider() iter = vlayer.getFeatures() vlayer = QgsVectorLayer(uri.uri(), 'pyarchinit_us_view', 'spatialite') for feature in iter: for sing_us in feature[31]: #il 31 è il campo che contiene il rapporto in formato lista ['copre', '2'] #a questo punto avrei bisogno di dire a = feature b = iter.(cerca la feature id=2).feature() #<- qui c'è il punto in cui non riesco a recuperare la geometria della feature senza fare un iter return sing_us, a.geometry().intersects(b.geometry()) Alla fine otterrei un valore di rapporto copre e un false o true per l'intersezione che andrò a gestire in una tabella esterna dove visualizzo il rapporto alfanumerico richiesto e farò apparire le 2 geometrie in ballo. Sarà poi l'utente a decidere se è il disegno sbagliato oppure il dato alfanumerico inserito ad essere errato. Il giorno 5 novembre 2016 17:11, Marco Grisoliaha scritto: > Ciao, > non ho capito se vuoi sapere soltanto quali siano le features che si > intersecano tra loro (ad es. una lista) oppure se devi fare un ulteriore > controllo su di esse una volta verificata l'intersezione (ad esempio: se la > feature "a" interseca altre 3 features all'interno del layer, verificare > che a["id_us"] sia pari a 3). > A prescindere dall'obiettivo, vuoi solo stampare qualcosa o modificare gli > attributi? > Marco > > Il giorno 5 novembre 2016 09:53, Luca Mandolesi ha > scritto: > >> Scusate, partito l'invio, il print di prima era un errore. >> >> Io pensavo ad una cosa tipo [0], ma ricevo poi errore perchè a e b non >> accedono a geometry: >> >> [0] >> request = QgsFeatureRequest().setFilterExpression( '"id_us" = 2' ) >> a = vlayer.getFeatures( request ) >> request = QgsFeatureRequest().setFilterExpression( '"id_us" = 3' ) >> b = vlayer.getFeatures( request ) >> >> a.geometry().intersects(b.geometry()) >> >> Grazie per i suggerimenti. >> Luca >> >> ___ >> QGIS-it-user mailing list >> QGIS-it-user@lists.osgeo.org >> http://lists.osgeo.org/mailman/listinfo/qgis-it-user >> >> > ___ QGIS-it-user mailing list QGIS-it-user@lists.osgeo.org http://lists.osgeo.org/mailman/listinfo/qgis-it-user
Re: [QGIS-it-user] pyQgis: come verificare una gemetria id=X nel corso di un ciclo?
Scusate, partito l'invio, il print di prima era un errore. Io pensavo ad una cosa tipo [0], ma ricevo poi errore perchè a e b non accedono a geometry: [0] request = QgsFeatureRequest().setFilterExpression( '"id_us" = 2' ) a = vlayer.getFeatures( request ) request = QgsFeatureRequest().setFilterExpression( '"id_us" = 3' ) b = vlayer.getFeatures( request ) a.geometry().intersects(b.geometry()) Grazie per i suggerimenti. Luca ___ QGIS-it-user mailing list QGIS-it-user@lists.osgeo.org http://lists.osgeo.org/mailman/listinfo/qgis-it-user