[QGIS-it-user] intersezione layer e calcolo area e crs differenti

Salve ho scritto un piccolo script per la console di QGIS per calcolare

le aree intersecate dei vari geometrie di un livello rispetto l'altro, ai piu non sfuggirà la possibilità di usarlo per per calcolare certificati di destinazione urbanistica rispetto un prg

c'è un problema quando i layer sono due sistemi di riferimenti
differenti ,il calcolo non funziona, mentre va bene se i liveli sono
sullo stesso crs

sapete dirmi se è

1)un bug di qgis

2) scelta progettuale (perchè?) da ovviare tramite codice

3)api sbagliate che ho usato si poteva scegliere altra soluzione

saluti

# /* copyright 2017 by Salvo Caligiore caligiore@gmail.com

livelli=iface.mapCanvas().layers()

def dataGeom(geom,lv):
#calcola le aree delle intersezioni delle features di un determinato
livello rispetto ad una data geometria e restituisce una lista di
feature con il corrispondente valore di area intersecato
#la feauture in lista serve per altri calcoli nella procedura principale
                 rect = geom.boundingBox()

                 request=QgsFeatureRequest(rect)
                 lista=
                 feat=lv.getFeatures(request)
                 da = QgsDistanceArea()
                 for f in feat:

                     intersezione=f.geometry().intersection(geom)

                     if intersezione==None : continue
                     else :
a=round(da.convertAreaMeasurement(da.measureArea(intersezione),1),2)

                         if a>0 : lista.append((f,round(a,2)))
                         if lv.geometryType()==0: lista.append((f," "))
                 return lista

da = QgsDistanceArea()
#incrocia i livelli fra di loro e interseca ogni feature con le altre
del livello incrociato stampando le informazioni
for x in livelli :
     for y in livelli:
         for f in y.getFeatures():

             lst=dataGeom(f.geometry(),x)

             for z,a in lst:
areafeature=round(da.convertAreaMeasurement(f.geometry().area(),1),2)
                 print x.name(), y.name(),"ID",f.id(),"Area
Totale",areafeature , "Area Intersecata", a , "ZID",z.id(),"rap % fra
inter e area f" ,str(round((a/areafeature)*100,2))+'%'

Forse perche’ i valori geometrici (geom) tra due layer con proiezioni diverse non sono sovrapponibili?


Da: QGIS-it-user qgis-it-user-bounces@lists.osgeo.org per conto di SC elyparker1@gmail.com
Inviato: martedì 11 luglio 2017 18:21
A: qgis-it-user@lists.osgeo.org
Oggetto: [QGIS-it-user] Fwd: intersezione layer e calcolo area e crs differenti

Salve ho scritto un piccolo script per la console di QGIS per calcolare

le aree intersecate dei vari geometrie di un livello rispetto l’altro, ai piu non sfuggirà la possibilità di usarlo per per calcolare certificati di destinazione urbanistica rispetto un prg

c’è un problema quando i layer sono due sistemi di riferimenti
differenti ,il calcolo non funziona, mentre va bene se i liveli sono
sullo stesso crs

sapete dirmi se è

1)un bug di qgis

  1. scelta progettuale (perchè?) da ovviare tramite codice

3)api sbagliate che ho usato si poteva scegliere altra soluzione

saluti

/* copyright 2017 by Salvo Caligiore caligiore@gmail.com

livelli=iface.mapCanvas().layers()

def dataGeom(geom,lv):
#calcola le aree delle intersezioni delle features di un determinato
livello rispetto ad una data geometria e restituisce una lista di
feature con il corrispondente valore di area intersecato
#la feauture in lista serve per altri calcoli nella procedura principale
rect = geom.boundingBox()

request=QgsFeatureRequest(rect)
lista=
feat=lv.getFeatures(request)
da = QgsDistanceArea()
for f in feat:

intersezione=f.geometry().intersection(geom)

if intersezione==None : continue
else :
a=round(da.convertAreaMeasurement(da.measureArea(intersezione),1),2)

if a>0 : lista.append((f,round(a,2)))
if lv.geometryType()==0: lista.append((f," "))
return lista

da = QgsDistanceArea()
#incrocia i livelli fra di loro e interseca ogni feature con le altre
del livello incrociato stampando le informazioni
for x in livelli :
for y in livelli:
for f in y.getFeatures():

lst=dataGeom(f.geometry(),x)

for z,a in lst:
areafeature=round(da.convertAreaMeasurement(f.geometry().area(),1),2)
print x.name(), y.name(),“ID”,f.id(),“Area
Totale”,areafeature , “Area Intersecata”, a , “ZID”,z.id(),“rap % fra
inter e area f” ,str(round((a/areafeature)*100,2))+‘%’


QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/qgis-it-user



Pagina di informazioni della lista QGIS-it-user
lists.osgeo.org
Lista di discussione e supporto per gli utenti italiani di QGIS. Per consultare la raccolta dei messaggi precedentemente inviati alla lista, visita gli Archivi …

in che senso? quando li vedi nel canvas di qgis le vedi sovrapposte forse vuoi dire che da codice bisogna effettuare una riproiezione?

···

Il 11/07/2017 19:29, Umberto Zulian ha scritto:

Forse perche’ i valori geometrici (geom) tra due layer con proiezioni diverse non sono sovrapponibili?

Scusa il consiglio banale, hai controllato le aree di poligoni di layer con CRS uguali al progetto (si presume corrette) e di layer riproiettati (CRS diverso da quello del progetto) che mi sembrano quelli candidati a dare il problema?

Hint: hai provato a fare l’intersezione dei tuoi poligoni e verificare se la geometria è corretta e se il valore dell’area corrisponde a quello che ottieni con la tua procedura?

Ciao,
Giuliano

PS: mi sembra di ricordare una discussione su calcolo area e CRS tempo fa in lista sviluppo, non ricordo però né il titolo del thread ne gli autori :disappointed:

···

Il 12/lug/2017 08:30 PM, “SC” <elyparker1@gmail.com> ha scritto:

Il 11/07/2017 19:29, Umberto Zulian ha scritto:

Forse perche’ i valori geometrici (geom) tra due layer con proiezioni diverse non sono sovrapponibili?

in che senso? quando li vedi nel canvas di qgis le vedi sovrapposte

Intendevo che se in qgis attivi la riproiezione al volo puoi vedere perfettamente sovrapposti nella canvas due layer con crs diversi, ovvero le coordinate hanno valori assoluti diversi (es. la stessa apparente X tra i due può essere 1500000 metri e 12,50000 gradi);

le funzioni geometriche magari considerano entrambi questi valori con il crs predefinito nel progetto

···

Da: QGIS-it-user qgis-it-user-bounces@lists.osgeo.org per conto di SC elyparker1@gmail.com
Inviato: mercoledì 12 luglio 2017 20:30
A: qgis-it-user@lists.osgeo.org
Oggetto: Re: [QGIS-it-user] I: Fwd: intersezione layer e calcolo area e crs differenti

Il 11/07/2017 19:29, Umberto Zulian ha scritto:

Forse perche’ i valori geometrici (geom) tra due layer con proiezioni diverse non sono sovrapponibili?

in che senso? quando li vedi nel canvas di qgis le vedi sovrapposte

forse vuoi dire che da codice bisogna effettuare una riproiezione?

ciao giuliano bah il codice l’ho pubblicato puoi verificarlo di persona è costruito per layer appena fatti , ad ogni modo fra CRS uguali il risuoltato delle intersezioni c’è e presumo sia dunque corretto, ho sviluppato un plugin per il calcolo del CDU allo scopo, però a sto punto mi chiedevo se tale comportamento è voluto o meno, in un programma è spesso importante capire la filosofia progettuale che in questo caso per probabile mia ignoranza mi sfugge

···

Il 12/07/2017 21:54, Giuliano Curti ha scritto:

in che senso? quando li vedi nel canvas di qgis le vedi sovrapposte

Scusa il consiglio banale, hai controllato le aree di poligoni di layer con CRS uguali al progetto (si presume corrette) e di layer riproiettati (CRS diverso da quello del progetto) che mi sembrano quelli candidati a dare il problema?

int: hai provato a fare l’intersezione dei tuoi poligoni e verificare se la geometria è corretta e se il valore dell’area corrisponde a quello che ottieni con la tua procedura?

Ciao Salvo,

In realtà non ti proponevo modifiche al codice (che peraltro è passato qualche post sopra e non l’ho presente), ma alcune pratiche per tentare di circoscrivere il problema (analizzando il comportamento di altre funzioni QGIS in contesti analoghi);
mi spiace non ti sia sembrato utile, ma ci tenevo a chiarirne il senso :grin:

Ciao,
Giuliano

···

Il 13/lug/2017 12:34 AM, “SC” <elyparker1@gmail.com> ha scritto:

Il 12/07/2017 21:54, Giuliano Curti ha scritto:

Scusa il consiglio banale, hai controllato le aree di poligoni di layer con CRS uguali al progetto (si presume corrette) e di layer riproiettati (CRS diverso da quello del progetto) che mi sembrano quelli candidati a dare il problema?

int: hai provato a fare l’intersezione dei tuoi poligoni e verificare se la geometria è corretta e se il valore dell’area corrisponde a quello che ottieni con la tua procedura?

ciao giuliano

in che senso? quando li vedi nel canvas di qgis le vedi sovrapposte

bah il codice l’ho pubblicato puoi verificarlo di persona …

Ciao

···

Il giorno 12 luglio 2017 20:30, SC <elyparker1@gmail.com> ha scritto:

Il 11/07/2017 19:29, Umberto Zulian ha scritto:

Forse perche’ i valori geometrici (geom) tra due layer con proiezioni diverse non sono sovrapponibili?

in che senso? quando li vedi nel canvas di qgis le vedi sovrapposte

forse vuoi dire che da codice bisogna effettuare una riproiezione?

Beh certo, come hai detto giustamente tu, nel canvas si vedono sovrapposti, ma qui sei nella console e non gli hai mai detto di riproiettare uno dei due layer.
Io ho riscontrato un problema simile con una funzione che mi serviva per contare gli oggetit in un poligono: lo scoglio su cui mi ero arenato se non sbaglio era che non riuscivo a recuperare il crs di un layer, anche se dovrebbe essere:
layer.crs()

Pertanto dovresti applicare una trasformazione di cocordinate [0] per ciascuna feature prima di confrontarle, ma usando la riproiezione al volo non mi fiderei troppo delle aree risultanti.

E’ sicuramente molto meglio lavorare in un unico geodatabase Postgis o Sqlite e creare delle viste di intersezione. Potresti scrivere del codice che importa tutti i layer i nun db sqlite, crea la vista e la esporta come layer temporaneo… mi sembra molto più semplice e gestibile

amefad
[0] https://qgis.org/api/classQgsCoordinateTransform.html

voglio dire giuliano che io ho dato per scontato che la funzione qgis dia valori esatti almeno quando i crs sono uguali e non da risultati nel caso di crs non uguali, la mia domanda è per questa situazione, la tua domanda invece si pone il problema se le funzioni di qgis funzionino davvero e no l’ho verificato ho ovviamente creduto per fede, diciamo che una scoperta del genere mi deluderebbe parecchio e penso non solo me significherebbe che qgis non è affidabile.

···

Il 13/07/2017 10:36, Giuliano Curti ha scritto:

int: hai provato a fare l’intersezione dei tuoi poligoni e verificare se la geometria è corretta e se il valore dell’area corrisponde a quello che ottieni con la tua procedura?

ciao giuliano

Ciao Salvo,

bah il codice l’ho pubblicato puoi verificarlo di persona …

In realtà non ti proponevo modifiche al codice (che peraltro è passato qualche post sopra e non l’ho presente), ma alcune pratiche per tentare di circoscrivere il problema (analizzando il comportamento di altre funzioni QGIS in contesti analoghi);
mi spiace non ti sia sembrato utile, ma ci tenevo a chiarirne il senso :grin:

Ciao Salvo, grazie della pazienza

Si e no; presumo che le funzioni pyqgis siano chiamate alle funzioni native QGIS per cui sapere come si comporta il calcolo dell’area nel caso di poligoni riproiettati (usa il CRS del nativo o quello del progetto?) forse può dare qualche indicazione sul tuo problema (verifica che potrei certo fare anche io, ma è un periodo in cui la pensione mi consente di tenere in mano una chitarra al posto del PC :joy:))

Ciao,
Giuliano

···

Il 13/lug/2017 05:51 PM, “SC” <elyparker1@gmail.com> ha scritto:

Il 13/07/2017 10:36, Giuliano Curti ha scritto:

…,.

voglio dire giuliano che io ho dato per scontato che la funzione qgis dia valori esatti almeno quando i crs sono uguali e non da risultati nel caso di crs non uguali, la mia domanda è per questa situazione, la tua domanda invece si pone il problema se le funzioni di qgis funzionino davvero…