devo confrontare le lunghezze di due lati appartenenti allo stesso poligono.
Ho creato tramite un algoritmo un nuovo layer "lati" di linee coincidenti
con i lati del poligono (l'appartenenza al poligono è mantenuta dall'ID
presente nella tabella degli attributi! es. se elemento linea1 ed elemento
linea2 appartengono al poligono n.1, avranno entrambi un attributo "ID" pari
a 1).
Creando un ciclo for per iterare le geometrie del layer "lati", vorrei
confrontare la lunghezza dell'elemento linea i-esimo con il successivo
(j-esimo=i-esimo+1). Il problema è che non riconoscendo pyqgis i come numero
intero, non mi permette di incrementarlo (quindi di creare j=i+1).
for i in lati.getFeatures():
j=i+1
l1=i.geometry().length()
l2=j.geometry().length()
if(j<=n):
if(i[idlin]=j[idlin]):
etc. etc.
TypeError: unsupported operand type(s) for +: 'QgsFeature' and 'int'
Riuscirei anche ad ovviare a questo problema creando un'altra variabile h
come riportato di seguito...
h=0
for i in lati.getFeatures():
if (i==1):
h=1
else:
h=h+1
j=h+1
l1=i.geometry().length()
l2=j.geometry().length()
if(j<=n):
if(i[idlin]=j[idlin]):
etc. etc.
...Ma poi il problema persiste perchè questa volta j, essendo un int, non mi
permette di scorrere le geometrie del layer.
Spero di essere stata sufficientemente chiara e di aver esposto bene il
problema.
Sarò grata a chiunque riesca ad aiutarmi.
devo confrontare le lunghezze di due lati appartenenti allo stesso poligono.
Ho creato tramite un algoritmo un nuovo layer "lati" di linee coincidenti
con i lati del poligono (l'appartenenza al poligono è mantenuta dall'ID
presente nella tabella degli attributi! es. se elemento linea1 ed elemento
linea2 appartengono al poligono n.1, avranno entrambi un attributo "ID" pari
a 1).
Creando un ciclo for per iterare le geometrie del layer "lati", vorrei
confrontare la lunghezza dell'elemento linea i-esimo con il successivo
(j-esimo=i-esimo+1). Il problema è che non riconoscendo pyqgis i come numero
intero, non mi permette di incrementarlo (quindi di creare j=i+1).
non è che non lo riconosce. getFeatures ti da una Feature non un int!
la funzione "+" non può sommare un int con una Feature.
marco
--
Marco Guiducci - 055 4383194
SITA - Sistema informativo territoriale e ambientale
Regione Toscana - Via di Novoli 26 - 50127 Firenze
Sì, comprendo. Mi sono espressa male.
Ma c'è una soluzione al problema? E' possibile in qualche modo confrontare
caratteristiche di due geometrie appartenenti allo stesso layer?
prova così: metti le features ottenute con getfeatures() in una lista
feat = lati.getfeatures()
poi ti ci muovi così:
for i in range(0, len(feat)-1):
feat[i]......
feat[i+1]......
feat[i-1]......
marco
Il 05/04/2018 16:04, sarag ha scritto:
Sì, comprendo. Mi sono espressa male.
Ma c'è una soluzione al problema? E' possibile in qualche modo confrontare
caratteristiche di due geometrie appartenenti allo stesso layer?
feat=lati.getFeatures()
for i in range(1, n-1):
l1=feat[i].geometry().length()
l2=feat[i+1].geometry().length()
il nuovo errore è: TypeError: 'QgsFeatureIterator' object does not support
indexing
Mi scuso se sto commettendo errori banali ma è la prima volta che mi
approccio a PyQGis.
Grazie davvero per la comprensione e la disponibilità.
Sara
non sarà ortodosso, ma funziona:
crea una lista vuota:
listalati=
poi riempila così:
for feat in lati.getfeatures():
listalati.append(feat)
a questo punto puoi iterare su listalati come prima
for i in range(1, n-1):
l1=listalati[i].geometry().length()
l2=listalati[i+1].geometry().length()
ricordati che le liste partono da zero. quindi 1 è già il secondo lato.
un consiglio se sei alle prime armi: tieni aperta la consolle di python e fai il print degli oggetti che crei. in questo modo QGis ti dice cosa stai creando, cioè che cosè la tua variabile: una feature? un iteratore? ecc.
marco
--
Marco Guiducci - 055 4383194
SITA - Sistema informativo territoriale e ambientale
Regione Toscana - Via di Novoli 26 - 50127 Firenze
Grazie mille per i consigli! E' stato prezioso. Il problema del confronto tra
lunghezze è risolto.
Ora però dovrei effettuare dei confronti su altri attributi del layer
"lati". Lavorando con la lista questo continua ad essere possibile?
Ad esempio per il controllo sull'ID, prima scrivevo:
id_pol=lati.fieldNameIndex("id")
inserendo poi nel for l'istruzione condizionale:
if (i[id_pol]==j[id_pol])
...
Come faccio ora ad accedere agli attributi degli elementi contenuti nella
lista?
Grazie ancora davvero.
Grazie mille per i consigli! E' stato prezioso. Il problema del confronto tra
lunghezze è risolto.
Ora però dovrei effettuare dei confronti su altri attributi del layer
"lati". Lavorando con la lista questo continua ad essere possibile?
Ad esempio per il controllo sull'ID, prima scrivevo:
id_pol=lati.fieldNameIndex("id")
inserendo poi nel for l'istruzione condizionale:
if (i[id_pol]==j[id_pol])
...
Come faccio ora ad accedere agli attributi degli elementi contenuti nella
lista?
Grazie ancora davvero.
io faccio così:
se feat è il tuo oggetto corrente:
attributi_di_feat = feat.attributes()
valore_id = attributi_di_feat[id_pol]
dove id_pol è quello trovato come già fai.
marco
--
Marco Guiducci - 055 4383194
SITA - Sistema informativo territoriale e ambientale
Regione Toscana - Via di Novoli 26 - 50127 Firenze
Sono riuscita a risolvere solo creando un'ulteriore lista anche per gli
attributi.
lista_lati =
attributi =
id_lati=lati.fieldNameIndex("id")
for f in linee.getFeatures():
lista_lati.append(f)
id_att=f[id_lati]
attributi.append(id_att)
nel successivo for scorro poi contemporaneamente la lista con gli elementi e
quella con gli attributi, così da poter effettuare controlli sia sulle
proprietà geometriche (es. lunghezza dei lati) che, per esempio, sugli ID
degli elementi del layer
n=len(lista_lati)
for i in range(0, n):
l1=lista_lati[i].geometry().length()
if (i==n-1):
l2=lista_lati[i].geometry().length()
else:
l2=lista_lati[i+1].geometry().length()