Come calcolare le statistiche raster per i poligoni?


14

come posso calcolare somme, medie ecc. di punti raster (multibanda) per poligono di un livello vettoriale. Mi è stato detto che questo si chiama "statistica zonale". L'ho provato prima con QGIS.

C'è un modo per farlo, ma è troppo lento (convertire raster in vettoriale, intersecare con il secondo livello vettoriale, calcolare geometria, esportare numeri, calcolare statistiche con foglio di calcolo o altro programma, reimportare i risultati, impiega un'eternità per il mio 350.000 punti raster).

Mi è stato anche dato il suggerimento di usare saga-gis. Che ha "statistiche zonali" ma quelle si basano su categorie di una banda raster, non su poligoni da un livello vettoriale. Quindi per usarlo dovrei convertire il mio layer vettoriale in raster e quindi calcolare le statistiche.

Questo sembra essere il modo sbagliato di risolverlo. Non ci sarebbe modo di tenere conto dei punti raster che appartengono a 2 o più poligoni perché sono intersecati dal confine poligonale. Suppongo che le statistiche basate su poligoni dovrebbero essere in grado di gestirlo, quindi presumo anche di non aver ancora trovato il modulo corretto.

Saga-gis ha davvero molti moduli. Per favore fatemi sapere quale è quello giusto per questa applicazione.


Sto provando la soluzione di Rudivonstaden e quando inserisco gli ultimi due comandi compaiono i seguenti messaggi di errore: >>> zonalstats = qgis.analysis.QgsZonalStatistics (vectorlayer, rasterfile) Traceback (ultima chiamata più recente): File "<input>" , riga 1, in <modulo> AttributeError: l'oggetto 'module' non ha attributo 'analisi' >>> zonalstats.calculateStatistics (None) Traceback (ultima chiamata più recente): File "<input>", riga 1, in <modulo > NameError: il nome 'zonalstats' non è definito Mi chiedo se i comandi sono corretti o se il file raster che sto usando è nel formato giusto? Grazie!
Dan Wolf,

Ciao Dan Stackexchange funziona in modo leggermente diverso da un forum. L'obiettivo è avere un'interazione di tipo Domande e risposte piuttosto che una discussione in corso. Se le risposte alla domanda originale non risolvono ciò che devi sapere, dovresti chiedere chiarimenti nella sezione commenti o considerare di porre una nuova domanda.
Jay Guarneri,

Grazie per il tuo commento, Dan. Nella mia risposta mancava una dichiarazione d'importazione necessaria, che ora dovrebbe essere corretta.
Rudivonstaden,

Risposte:


22

Stavo lottando per fare esattamente la stessa cosa, ma per vari motivi mi impegno a utilizzare QGIS. Ho provato ad usare v.rast.stats usando il plugin GRASS e anche tramite il plugin Sextante. Quest'ultimo approccio non è riuscito, perché sembra associare le statistiche a un livello vettoriale temporaneo che quindi elimina. Il plugin GRASS ha funzionato, ma non si occupa di poligoni sovrapposti.

Dopo aver fatto un po 'di ricerche (nella fonte del plug-in ZonalStats dal suono promettente), ho scoperto che QGIS ha effettivamente metodi statistici zonali integrati nell'API e questi hanno anche i collegamenti Python. Quindi, fintanto che solo alla ricerca di count, sume meanle statistiche per le vostre caratteristiche poligonali, il Console Python (Plugins> Python Console) è attualmente il modo più semplice per collegare le statistiche per la tabella degli attributi del poligono.

  1. Seleziona il tuo livello raster nel sommario e digita quanto segue nella console (prende il nome del file sorgente del tuo livello raster)

    >>> rasterfile = qgis.utils.iface.mapCanvas().currentLayer().source()

  2. Seleziona il tuo livello vettoriale ed esegui il comando seguente nella console (prende il livello vettoriale stesso)

    >>> vectorlayer = qgis.utils.iface.mapCanvas().currentLayer()

  3. Esegui i tre comandi seguenti nella console (passano il livello vettoriale e il file raster al calcolatore di statistiche zonali incorporato di QGIS)

    >>> import qgis.analysis

    >>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)

    >>> zonalstats.calculateStatistics(None)

I risultati verranno aggiunti come campi aggiuntivi nel livello poligono.

Statistiche zonali

Nota che se vuoi aggiungere un prefisso ai nuovi campi (piuttosto che averli come somma, media e conteggio), allora sostituiresti il ​​primo comando nel passaggio 3 con il seguente (supponendo che tu volessi usare 'zonal_' come il prefisso:

>>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile,"zonal_")

1
+1 qgis.analysis.QgsZonalStatistics ()
Aaron

Esiste un plug-in Zonal Statistics in QGIS, quindi probabilmente non è necessario eseguire i comandi menzionati da soli: docs.qgis.org/2.2/en/docs/user_manual/plugins/… Mi chiedo, perché non c'è possibilità di calcolare il massimo e il minimo anche i valori.
matandked il

Ho usato la tua tecnica ma cancella alcuni poligoni :(
niahoo

6

Finalmente l'ho trovato: in Saga-GIS poligoni e griglia di dati aperti categoria, quindi forme-> griglia-> valore griglia-> statistiche griglia per poligoni



3

Questo problema sembra essere stato risolto già qualche tempo fa, ma aggiungerò comunque il mio cucchiaio alla zuppa poiché di recente ho avuto bisogno di alcune statistiche raster.

La metodologia QGIS descritta da Rududonstaden ha funzionato come un incantesimo, grazie per il suggerimento. Tuttavia, nel mio caso, volevo anche conoscere i valori min e max e std per i valori raster all'interno dei miei poligoni e quella funzionalità che non riuscivo a trovare in QGIS. Ho trovato una soluzione tramite la funzione isectpolyrst in GME , che è una delle mie preferite per risolvere i problemi GIS. Questa funzione mi ha dato solo le statistiche di cui avevo bisogno e piuttosto velocemente.

PS. Il GME ha una dipendenza sfortunata (ArcGIS). Quindi, anche se il programma stesso è liberamente disponibile per tutti, è necessario ArcGIS per eseguirlo. Ma se hai ArcGIS (qualsiasi livello di licenza), ti consiglio di provarlo.

MODIFICARE:

Ho ottenuto le statistiche che volevo, ma in seguito ho scoperto che sono saltato alle conclusioni un po 'in fretta dopo aver visto i numeri reali. Ottieni statistiche, sì, ma solo per la prima band di un raster. Quindi, se operi con un'immagine raster a 3 bande, le statistiche sono incomplete. Avrei dovuto sottolineare il numero di canali nel mio post originale. Meglio usare SAGA-GIS come stn proposto sopra se si lavora con immagini raster multibanda.


3
zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)
zonalstats.calculateStatistics(None)

calcola di default solo Count, Sum e Mean (come si può vedere da Raster -> Zonal StatisticsQGIS Desktop, può fare molto di più).

Se, ad esempio, vuoi calcolare solo la media devi usare:

zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer, rasterfile, QgsZonalStatistics.Mean)
zonalstats.calculateStatistics(None)

vedi API per tutte le opzioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.