[QGIS-it-user] Confronto tra due geometrie successive appartenenti allo stesso layer (pyqgis)

Buongiorno a tutti,

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.

Sara

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

Il 05/04/2018 15:16, sarag ha scritto:

Buongiorno a tutti,

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?

Grazie mille,
Sara

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

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?

Grazie mille,
Sara

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html
_______________________________________________
QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/qgis-it-user

--
Marco Guiducci - 055 4383194
SITA - Sistema informativo territoriale e ambientale
Regione Toscana - Via di Novoli 26 - 50127 Firenze

Purtroppo non riesco a venirne a capo ugualmente.

Facendo una cosa del genere

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

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

Il 05/04/2018 17:14, sarag ha scritto:

Purtroppo non riesco a venirne a capo ugualmente.

Facendo una cosa del genere

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.

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

Il 06/04/2018 10:41, sarag ha scritto:

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()
      
    if(attributi[i] != attributi[i+1]):
    ...

Grazie mille ancora per l'aiuto.

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html