<div dir="ltr">Sperando di essere ancora in tempo, ti parlo della mia idea.<br>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.<br>Ho creato questa situazione, sperando che sia rappresentativa del tuo caso:<br><br><img src="cid:ii_iv879owd0_1583f52e5b5e5a30" width="361" height="304"><br><img src="cid:ii_iv879zeq1_1583f531bd7dd890" width="216" height="232"><br><br><br>Lo script che ti incollo nel seguito esegue queste operazioni:<br>1) cerco le features che hanno, tra gli attributi, un determinato valore ( o "rapporto", come lo chiami tu);<br>2) salvo queste features in un dizionario;<br>3) estrapolo dalla colonna del rapporto (in questo caso, quella con indice [1]) i valori numerici che fanno riferimento alle geometrie da confrontare;<br>4) verifico che la feature in esame intersechi le altre features di confronto;<br>5) stampo in ordine: il codice della feature, il rapporto dichiarato, la veridicità di quanto riportato nel rapporto (VERO o FALSO).<br><br>Per questo esempio, lo script stampa a video il risultato:<br>Feature No. 3, 3 copre 2, FALSO<br>Feature No. 5, 5 copre 3 e 4, VERO<br>Feature No. 4, 4 copre 5, VERO<br>Feature No. 6, 6 coperto da 7, VERO<br>Feature No. 7, 7 copre 6, VERO<br><br>Come puoi notare, ho scritto volutamente un rapporto sbagliato per la feature 3 ("3 copre 2") per validare lo script.<br><br>Sperando di non essere andato troppo fuori strada (o di aver commesso altri errori formali), ti incollo il codice che ho utilizzato io, ciao!<br><br>Marco<br><br>###########################<br><br># se vuoi verificare l'intersezione, 'copre' e 'coperto' significano la stessa cosa<br>test_string1 = 'copre'<br>test_string2 = 'coperto'<br><br># Crea un dizionario con tutte le features che soddisfano il test<br>allfeatures={}<br>for item in vlayer.getFeatures():<br> if test_string1 in item[1] or test_string2 in item[1]:<br> allfeatures[<a href="http://item.id">item.id</a>()] = QgsFeature(item)<br><br># cerca se quello riportato nel rapporto è VERO o FALSO<br>for feat1 in allfeatures.values():<br> feat = 'Feature No. %s,' %(feat1[0])<br> intersect=[]<br> string = '%s %s,' %(feat1[0], feat1[1])<br> inGeom1 = feat1.geometry()<br> test = feat1[1]<br> numb_test1=[int(s) for s in test.split() if s.isdigit()]<br> str1 = ','.join(str(e) for e in numb_test1)<br> for feat2 in vlayer.getFeatures():<br> if feat2 != feat1:<br> inGeom2 = feat2.geometry()<br> if inGeom1.intersects(inGeom2):<br> intersect.append(feat2[0])<br> for l in numb_test1:<br> if l in intersect:<br> check = 'VERO'<br> else:<br> check = 'FALSO'<br> print feat, string, check</div><div class="gmail_extra"><br><div class="gmail_quote">Il giorno 6 novembre 2016 15:06, Giuliano Curti <span dir="ltr"><<a href="mailto:giulianc51@gmail.com" target="_blank">giulianc51@gmail.com</a>></span> ha scritto:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 11/6/16, Luca Mandolesi <<a href="mailto:mandoluca@gmail.com">mandoluca@gmail.com</a>> wrote:<br>
> Il giorno 6 novembre 2016 13:33, Giuliano Curti <<a href="mailto:giulianc51@gmail.com">giulianc51@gmail.com</a>> ha<br>
> scritto:<br>
><br>
>> On 11/6/16, Luca Mandolesi <<a href="mailto:mandoluca@gmail.com">mandoluca@gmail.com</a>> wrote:<br>
><br>
</span><span class="">> mentre sono in un ciclo for e analizzo il campo di un record, come faccio a<br>
> chiamare un altro record e caricarne la geometria.<br>
<br>
</span>rimango sempre nel dubbio di aver capito bene :-) questo spezzone di<br>
codice cmq ti dà le due feature f1 e f2, le rispettive geometrie, le<br>
confronta (scartando ovviamente il controllo<br>
con sè stessa) e puoi accedere ad ogni altro loro attributo;<br>
<br>
for f1 in layer.getFeatures():<br>
......<br>
for f2 in layer.getFeatures():<br>
........<br>
if <a href="http://f2.id" rel="noreferrer" target="_blank">f2.id</a>() <> <a href="http://f1.id" rel="noreferrer" target="_blank">f1.id</a>():<br>
.........<br>
if f1.geometry().intersects(f2.<wbr>geometry()):<br>
(controllo se l'attributo delle due feature è corretto)<br>
.......<br>
<br>
NB: per il tuo caso forse è ridondante perchè confronta A con B e B<br>
con A, mentre a te potrebbe bastare confrontare A con B, ad es.<br>
modificando il test in<br>
if <a href="http://f2.id" rel="noreferrer" target="_blank">f2.id</a>() > <a href="http://f1.id" rel="noreferrer" target="_blank">f1.id</a>():<br>
o qualche modo migliore che sapranno indicarti altri;<br>
<br>
> Ciao<br>
> Luca<br>
<div class="HOEnZb"><div class="h5"><br>
ciao,<br>
giuliano<br>
______________________________<wbr>_________________<br>
QGIS-it-user mailing list<br>
<a href="mailto:QGIS-it-user@lists.osgeo.org">QGIS-it-user@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/mailman/listinfo/qgis-it-user" rel="noreferrer" target="_blank">http://lists.osgeo.org/<wbr>mailman/listinfo/qgis-it-user</a><br>
</div></div></blockquote></div><br></div>