Qual è il modo migliore per produrre una mappa di densità da punti ponderati in QGIS?


18

Mi piacerebbe davvero ripetere la funzionalità dello strumento Densità del kernel ArcGIS: come potrei farlo?

Vorrei limitare le risposte al software libero e open source facile da installare - vale a dire che QGIS si installa facilmente con GRASS su tutte le piattaforme, quindi QGIS + GRASS andrebbe bene, ma SAGA no (purtroppo, poiché ha ciò che può essere lo strumento ideale).

Sto cercando di produrre mappe di densità della fauna selvatica attraverso aree protette in QGIS. La mappa della densità nell'esempio seguente è stata prodotta in ArcGIS da osservazioni puntuali di animali selvatici, con conteggi grezzi delle dimensioni del gruppo (un campo nel file vettoriale) utilizzato per ponderare la densità di ogni cella della griglia nello strumento Densità kernel (SpatialAnalyst), con raggio di ricerca scelto e dimensione della cella della griglia:

Densità della fauna selvatica nel Kafue National Park con celle a griglia 5x5km e densità del kernel di 7,5 km di raggio

In una domanda precedente sulla densità , è stato suggerito di utilizzare lo strumento GRASS v.kernel per imitare lo strumento Densità kernel ArcGIS, ma v.kernel non fa lo stesso lavoro . Dopo aver esaminato il manuale e aver prodotto (con successo) una mappa della densità, sembra che la funzione v.kernel funzioni solo con la densità dei punti e non vi è alcuna possibilità di fornire una variabile per ciascun punto (come i conteggi grezzi) per ponderare ogni punto .

AGGIORNARE

Sembra che ci siano vari *.surf.*strumenti in GRASS che possono aiutare a creare una superficie di densità - e questi accettano una colonna di ponderazione o un valore z, oppure vengono eseguiti su raster. @underdark ha suggerito v.surf.rst - e la 'zcolumn' sarebbe la mia variabile di ponderazione (conteggio) - ma non riesco a capire come chiedere allo strumento di creare una determinata dimensione della griglia o usare un certo raggio.

Suggerimenti su come utilizzare v.surf.rst o qualsiasi altro metodo?


Dati di esempio

x,y,count
431250,8707500,0
418750,8707500,5
413750,8707500,3
411250,8707500,1
408750,8685000,0
411250,8685000,0
416250,8685000,0
416250,8682500,6
411250,8682500,3
418750,8680000,0
433750,8677500,3
421250,8677500,0
423750,8675000,1
431250,8672500,0
428750,8672500,2
426250,8672500,2
423750,8670000,0

Puoi descrivere di più i tuoi dati di input? Forse v.surf.rst sarebbe più appropriato di v.kernel grass.osgeo.org/gdp/html_grass64/v.surf.rst.html . Hai un valore di conteggio per cella della griglia mostrato sopra?
underdark

@underdark - Aggiunti alcuni dati di esempio. Sono i dati dei punti con conteggi (numero di elefanti visti) e può esserci più di un'osservazione per cella della griglia. Normalmente in ArcGIS il "conteggio" diventerebbe il campo "popolazione" dello strumento di densità del kernel.
Simbamangu

Più ci penso, meno credo che v.kernel sia una buona scelta per il tuo caso d'uso. Hai controllato la letteratura? Forse prima fai una domanda su quale metodo è appropriato in questo caso.
underdark

la mia domanda principale è come ripetere la funzionalità della densità del kernel da Arcview, che è un metodo noto. Hai ragione, v.kernel non è quasi certamente lo strumento giusto per farlo!
Simbamangu

@underdark, grazie - ho ampliato in qualche modo la domanda che può aiutare; v.surf.rst sembra appropriato ma potrebbe usare alcune indicazioni sul suo utilizzo.
Simbamangu,

Risposte:


8

Secondo la sua pagina di manuale, il comando GRASS r.resamp.filter farà per i raster che rappresentano i dati dei punti esattamente ciò che ArcGIS farà per i livelli dei punti : usare l' filter=boxopzione per un raster "semplice" e usare l' filter=gaussopzione per l'altro kernel ArcGIS. Utilizzare il -nflag per evitare la propagazione di null.


Si noti che le stime della densità del kernel (dette "mappe di calore") non sono interpolazioni dei dati. Il valore di un KDE in una posizione x stima la quantità di un valore " Z " per unità di area vicino a x . (Il raggio o "larghezza di banda" quantifica il significato di "vicino".) I valori di Z non devono essere definiti in ogni posizione possibile sulla mappa. Ad esempio, Z potrebbe rappresentare la presenza di qualcosa come una persona, nel qual caso il KDE fornisce densità di popolazione . Né i valori di Z devono variare continuamente nella mappa. Per l'interpolazione, si presume che Zè definito in tutte le posizioni e che i dati sono osservazioni dei valori di Z in punti specifici. L'interpolatore tenta di prevedere i valori non osservati di Z in tutti gli altri punti. Ciò avrebbe senso quando Z , per esempio, è una temperatura o una pressione, ma di solito non ha senso quando Z registra la presenza di qualcosa o quando i dati sono un censimento completo. (In quest'ultimo caso, considera cosa potrebbe significare una mappa della densità stradale per una regione e come si potrebbe eventualmente avere un senso di "interpolazione" delle strade attraverso aree non stradali.)


Non mi sembra di avere r.resamp.filter nel mio toolbox GRASS (su OS X, GRASS 6.4). Tuttavia - fino a quando non lo hai menzionato, non mi sarei reso conto che le "mappe di calore" sono la stessa cosa di KD; Ho pensato che stessero interpolando l'intera superficie. Lo strumento Raster | Heatmap in QGIS fa un KD? Qual è il "rapporto di decadimento"?
Simbamangu,

Credo che il termine "mappa di calore" sia stato cooptato in GIS dal suo significato originale in uno che si riferisce generalmente e vagamente a quasi tutte le mappe di tipo raster. Dubito che qualsiasi GIS offra funzionalità che corrispondano al significato originale.
whuber

All'indagine, lo strumento Heatmap in QGIS fa qualcosa di simile a KD in Arc, se si imposta il rapporto di decadimento su 0 (rastremando la densità su 0 ai bordi del raggio). Sembrano esserci alcune differenze: valori di cella calcolati 25 volte più alti (raggio di 5 km / cella di 2,5 km), così come viene applicata la funzione alle celle - L'arco sembra usare un raggio attorno al punto effettivo, mentre QGIS seleziona la cella sovrapposta e si assottiglia da quel punto.
Simbamangu,

2
"Heatmap" nell'uso comune sembra significare molte cose: guardandomi intorno, vedo che si applica anche a superfici interpolate, densità del kernel e semplice colorazione di pixel non levigati. Documento interessante sull'uso / la cronologia originale - e sembra che dovremmo forse usare termini più precisi nell'etichettatura degli strumenti QGIS.
Simbamangu,

3
@Simbamangu r.resamp.filter è di nuovo in GRASS 7 , ma c'è un'un'istantanea mensile per OS X . Inoltre, lo strumento Heatmap non sembra presentare una scelta per l'algoritmo per la distribuzione della densità, quindi non è esattamente equivalente a Kernel Density o r.resamp.filter, credo.
Torsti,

3

Il modulo di SAGA "Stima della densità del kernel" è ciò che stai cercando.

Installare l'interfaccia del modulo SAGA in QGIS (nel menu: Plugin -> Scarica plug-in Python ..) e utilizzare il modulo. In bocca al lupo!


Mi piacerebbe usare SAGA, ma sto lavorando in OSX 10.7 e devo ancora costruirlo con successo (non ci sono binari per OSX); Di recente ho usato ore provando più di un metodo di compilazione, ma le build falliscono sempre.
Simbamangu,

Quindi devi piuttosto fare domande sulla compilazione di SAGA su OSX 10.7. A mio avviso, SAGA è l'unica alternativa ragionevole allo strumento ArcGIS KD.
Vladimir

3

Un metodo davvero semplicistico con GRASS GIS che è più vicino a Point Density in ArcMap che a Kernel Density:

  1. Importa i punti su una mappa raster r.in.xyzusando method = sum ad una risoluzione raster specificata (impostata con g.region).

  2. Utilizzare r.neighborsper smussare la mappa con method = average (impostazione predefinita) e utilizzare la dimensione dell'opzione per impostare il raggio di ricerca.

(Al momento non ho accesso a GRASS, quindi non ci ho provato!)


v.in.xyze v.neighborspotrebbe anche funzionare. Il manuale non specifica come impostare in quale attributo viene utilizzato v.neighbors.
Torsti,

2

Come hai richiesto ulteriori indicazioni su v.surf.rst, ecco i miei input

Innanzitutto, circa la dimensione della griglia - puoi usare Plugin -> GRASS -> Modifica la regione GRASS corrente e impostare la risoluzione di output. L'output di v.surf.rst avrà tale risoluzione.

Per il raggio, la "tensione" sembra essere il parametro. Non sono esperto di questo algoritmo ma leggendo dal manuale, questo sembra essere il bit rilevante

"... L'alta tensione" aumenta le distanze tra i punti "e riduce il raggio di impatto di ciascun punto, la bassa tensione" diminuisce la distanza "e i punti si influenzano a vicenda su un raggio più lungo) .."

Quindi potresti usare il parametro tension approssimativamente come utilizzeresti il ​​parametro radius.

Dai dati di esempio, il risultato di v.surf.rst è simile al seguente e sembra ragionevole dato che utilizza i conteggi come pesi per l'interpolazione

inserisci qui la descrizione dell'immagine


1
Grazie per questo - molto più facile da capire rispetto alla pagina di aiuto. Come notato sopra da @whuber, l'interpolazione non è il metodo giusto per questo tipo di dati di esempio punti.
Simbamangu,

2

Anche se non l'ho provato, nel repository dei contributori di QGIS c'è un plug-in chiamato "Stima dell'intervallo home con R". Ciò include i calcoli del kernel (densità?). Penso che, se funzionasse, questo sarebbe il metodo migliore. R farà il vero metodo statistico per calcolare la densità del kernel.

Se hai installato R dovresti essere in grado di installare il plugin e provarlo.


1

Se si accetta di eseguire un po 'di programmazione Java al di fuori di qgis, è possibile utilizzare semplicemente questa libreria per la creazione di mappe di densità .

Utilizzando il costruttore HeatMapBuilder(int w, int h, int[][] pts, int[] weights), è possibile assegnare un peso per ogni punto di cui hai bisogno. L'immagine di output può essere recuperata con il getImage()metodo e salvata sul disco con a ImageIO.write("mymap.png").

Ecco un esempio di output:

mappa del calore con libreria java opencarto

È possibile modificare la forza di levigatura e la tavolozza dei colori.

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.