Was ist der beste Weg, um eine Dichtekarte aus gewichteten Punkten in QGIS zu erstellen?

18

Ich möchte die Funktionalität des ArcGIS Kernel Density-Tools unbedingt wiederholen. Wie kann ich das tun?

Ich möchte Antworten auf einfach zu installierende freie und Open-Source-Software beschränken - dh QGIS lässt sich problemlos mit GRASS auf allen Plattformen installieren, sodass QGIS + GRASS in Ordnung wäre, SAGA jedoch nicht (leider, da es was kann) das ideale Werkzeug sein).

Ich versuche Dichtekarten von Wildtieren in geschützten Gebieten in QGIS zu erstellen. Die Dichtekarte im folgenden Beispiel wurde in ArcGIS anhand von Punktbeobachtungen von Wildtieren erstellt. Dabei wurden die Rohzahlen der Gruppengröße (ein Feld in der Vektordatei) verwendet, um die Dichte jeder Gitterzelle im Werkzeug "Kerneldichte" (SpatialAnalyst) zu gewichten Ein ausgewählter Suchradius und eine Rasterzellengröße:

Wildtierdichte im Kafue National Park mit 5x5km Gitterzellen und einer Kerndichte von 7,5 km Radius

In einer früheren Frage zur Dichte wurde vorgeschlagen, das Tool GRASS v.kernel zu verwenden, um das Tool ArcGIS Kernel Density nachzuahmen, aber v.kernel übernimmt nicht die gleiche Aufgabe . Nach einem Blick auf dem Handbuch und (erfolgreich) eine Dichtekarte produziert, so scheint es , dass die v.kernel Funktion funktioniert nur mit Punktdichte , und es gibt keine Möglichkeit , eine Variable für jeden Punkt (wie Rohzählungen), um jeden Punkt zu gewichten .

AKTUALISIEREN

Es scheint verschiedene *.surf.*Tools in GRASS zu geben, mit denen sich eine Dichtefläche erstellen lässt - und diese akzeptieren eine Gewichtungsspalte oder einen Z-Wert oder werden mit Rastern ausgeführt. @underdark schlug v.surf.rst vor - und die 'zcolumn' wäre meine Gewichtungsvariable (count) - aber ich kann nicht herausfinden, wie ich das Tool auffordern soll, eine bestimmte Rastergröße zu erstellen oder einen bestimmten Radius zu verwenden.

Vorschläge zur Verwendung von v.surf.rst oder einer anderen Methode?


Beispieldaten

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
Simbamangu
quelle
Können Sie Ihre Eingabedaten genauer beschreiben? Vielleicht wäre v.surf.rst passender als v.kernel grass.osgeo.org/gdp/html_grass64/v.surf.rst.html . Haben Sie einen Zählwert pro oben angezeigter Gitterzelle?
Underdunkel
@underdark - Einige Beispieldaten hinzugefügt. Es sind Punktdaten mit Zählern (Anzahl der gesehenen Elefanten) und es kann mehr als eine Beobachtung pro Gitterzelle geben. Normalerweise wird in ArcGIS "count" zum Feld "population" des Kernel-Density-Tools.
Simbamangu
Je mehr ich darüber nachdenke, desto weniger glaube ich, dass v.kernel eine gute Wahl für Ihren Anwendungsfall ist. Hast du die Literatur durchgesehen? Stellen Sie vielleicht zuerst eine Frage, welche Methode in diesem Fall geeignet ist.
Underdunkel
Meine Hauptfrage ist, wie die Funktionalität der Kerneldichte in Arcview, einer bekannten Methode, wiederholt werden kann. Sie haben recht, v.kernel ist mit ziemlicher Sicherheit nicht das richtige Werkzeug dafür!
Simbamangu
@underdark, danke - ich habe die Frage etwas erweitert, was helfen kann; v.surf.rst sieht zwar angemessen aus, könnte jedoch Hinweise zu seiner Verwendung enthalten.
Simbamangu

Antworten:

8

Laut Handbuch funktioniert der GRASS-Befehl r.resamp.filter für Raster, die Punktdaten darstellen, genau so wie ArcGIS für Punkt-Layer : Verwenden Sie die filter=boxOption für ein "einfaches" Raster und die filter=gaussOption für den anderen ArcGIS-Kernel. Verwenden Sie das -nFlag, um die Weitergabe von Nullen zu vermeiden.


Beachten Sie, dass Schätzungen der Kerneldichte (auch "Heatmaps" genannt) keine Interpolationen der Daten sind. Der Wert eines KDE an einem Ort x schätzt die Menge eines Wertes " Z " pro Flächeneinheit in der Nähe von x . (Der Radius oder die "Bandbreite" gibt an, was "nahe" bedeutet.) Die Werte von Z müssen nicht an jeder möglichen Stelle auf der Karte definiert werden. Beispielsweise könnte Z die Anwesenheit einer Person darstellen. In diesem Fall gibt KDE die Bevölkerungsdichte an . Die Werte von Z müssen auch nicht kontinuierlich über die Karte variieren. Für die Interpolation wird angenommen, dass Zist an allen Stellen definiert und die Daten sind Beobachtungen der Werte von Z an festgelegten Punkten. Der Interpolator versucht, die nicht beobachteten Werte von Z an allen anderen Punkten vorherzusagen . Dies wäre sinnvoll, wenn Z beispielsweise eine Temperatur oder ein Druck ist, ist jedoch normalerweise unsinnig, wenn Z das Vorhandensein von etwas aufzeichnet oder wenn die Daten eine vollständige Zählung sind. (Überlegen Sie sich im letzteren Fall, was eine Straßendichtekarte für eine Region bedeuten könnte und wie eine "Interpolation" von Straßen über Nichtstraßenbereiche sinnvoll sein könnte.)

whuber
quelle
Ich habe anscheinend keinen r.resamp.filter in meiner GRASS-Toolbox (unter OS X, GRASS 6.4). Doch bis Sie es erwähnt haben, war mir nicht klar, dass "Heatmaps" dasselbe sind wie KD. Ich nahm an, dass sie die gesamte Oberfläche interpolierten. Führt das Raster | Heatmap-Tool in QGIS eine KD durch? Was ist die "Zerfallsrate"?
Simbamangu
Ich glaube, der Begriff "Heatmap" wurde in GIS von seiner ursprünglichen Bedeutung in eine Bezeichnung umgewandelt , die sich allgemein und vage auf fast jede rasterähnliche Karte bezieht. Ich bezweifle, dass jedes GIS Funktionen bietet, die der ursprünglichen Bedeutung entsprechen.
Whuber
Bei der Untersuchung führt das Heatmap-Tool in QGIS eine ähnliche Aktion wie KD in Arc aus, wenn Sie das Abklingverhältnis auf 0 setzen (wobei die Dichte an den Kanten des Radius auf 0 verringert wird). Es scheint einige Unterschiede zu geben: Berechnete Zellenwerte 25 x höher (5 km Radius / 2,5 km Zelle), so wie die Funktion auf Zellen angewendet wird - Arc scheint einen Radius um den tatsächlichen Punkt zu verwenden, während QGIS die überlappende Zelle auswählt und verjüngt sich von diesem Punkt aus.
Simbamangu
2
"Heatmap" im allgemeinen Sprachgebrauch scheint eine Menge Dinge zu bedeuten - wenn ich mich umsehe, sehe ich, dass es auch auf interpolierte Oberflächen, die Kerneldichte und das einfache Färben von nicht geglätteten Pixeln angewendet wird. Interessantes Papier über die ursprüngliche Verwendung / Geschichte - und es scheint, als sollten wir bei der Kennzeichnung von QGIS-Tools präzisere Begriffe verwenden.
Simbamangu
3
@Simbamangu r.resamp.filter ist neu in GRASS 7 , aber es gibt eine monatliche Momentaufnahme für OS X . Außerdem scheint das Heatmap-Tool keine Wahl für den Algorithmus zur Verteilung der Dichte zu bieten, so dass es meiner Meinung nach nicht genau der Kerneldichte oder dem r.resamp.filter entspricht.
Torsti
3

SAGAs Modul 'Kernel Density Estimation' ist genau das, wonach Sie suchen.

Installieren Sie die SAGA-Modul-Schnittstelle in QGIS (im Menü: Plugins -> Python-Plugins abrufen ..) und verwenden Sie das Modul. Viel Glück!

Vladimir
quelle
Ich würde SAGA LIEBEN, arbeite aber in OSX 10.7 und muss es noch erfolgreich erstellen (es gibt keine Binärdateien für OSX). Ich habe in letzter Zeit Stunden damit verbracht, mehr als eine Kompilierungsmethode auszuprobieren, aber Builds schlagen immer fehl.
Simbamangu
Dann müssen Sie eher Fragen zur SAGA-Kompilierung unter OSX 10.7 stellen. Aus meiner Sicht ist SAGA die einzig sinnvolle Alternative zu ArcGIS KD.
Vladimir
3

Eine sehr vereinfachte Methode mit GRASS GIS, die in ArcMap der Punktdichte näher kommt als der Kerneldichte:

  1. Importieren Sie die Punkte mit r.in.xyzmethod = sum in eine Rasterkarte mit einer festgelegten Rasterauflösung (festgelegt mit g.region).

  2. Verwenden Sie r.neighborsdiese Option, um die Karte mit method = average (Standardeinstellung) zu glätten, und verwenden Sie die Option size, um den Suchradius festzulegen.

(Ich habe im Moment keinen Zugang zu GRASS, also habe ich das nicht wirklich ausprobiert!)

Torsti
quelle
v.in.xyzund v.neighborskönnte auch funktionieren. Das Handbuch legt jedoch nicht fest, wie Sie festlegen, welches Attribut verwendet wird v.neighbors.
Torsti
2

Da Sie mehr Anleitung auf v.surf.rst angefordert haben, sind hier meine Eingaben

Zunächst zur Rastergröße - Sie können Plugin -> GRASS -> Aktuelle GRASS-Region bearbeiten und die Ausgabeauflösung einstellen. Ihre Ausgabe von v.surf.rst hat diese Auflösung.

Für den Radius scheint die Spannung der Parameter zu sein. Ich bin kein Experte für diesen Algorithmus, aber ich lese aus dem Handbuch, dies scheint das relevante Bit zu sein

"... Hohe Spannung" vergrößert die Abstände zwischen den Punkten "und verringert die Aufprallreichweite jedes Punktes, niedrige Spannung" verringert die Entfernung "und die Punkte beeinflussen sich gegenseitig über eine größere Reichweite."

Sie können den Spannungsparameter also ungefähr so ​​verwenden wie den Radiusparameter.

Ausgehend von Ihren Beispieldaten sieht das Ergebnis von v.surf.rst wie folgt aus und erscheint angemessen, da die Zählungen als Gewichtungen für die Interpolation verwendet werden

Bildbeschreibung hier eingeben

räumliche Gedanken
quelle
1
Vielen Dank dafür - viel einfacher zu verstehen als die Hilfeseite. Wie oben von @whuber erwähnt, ist die Interpolation jedoch nicht die richtige Methode für diese Art von Punktabtastdaten.
Simbamangu
2

Während ich es noch nicht getestet habe, gibt es im Repository von QGIS Contributors ein Plugin namens 'Home Range Estimation with R'. Dies beinhaltet Kernel (Dichte?) Berechnungen. Ich denke, wenn es funktioniert, wäre dies die beste Methode. R führt die reale statistische Methode zur Berechnung der Kerneldichte aus.

Wenn Sie R installiert haben, sollten Sie in der Lage sein, das Plugin zu installieren und es auszuprobieren.

Alex Leith
quelle
1

Wenn Sie ein wenig Java-Programmierung außerhalb von QGIS akzeptieren, können Sie einfach diese Density Map Builder-Bibliothek verwenden .

Mit dem Konstruktor HeatMapBuilder(int w, int h, int[][] pts, int[] weights)ist es möglich, für jeden Punkt eine Gewichtung nach Bedarf festzulegen. Das Ausgabebild kann mit der getImage()Methode abgerufen und mit a auf Ihrer Festplatte gespeichert werden ImageIO.write("mymap.png").

Hier ist ein Beispiel für die Ausgabe:

Heatmap mit OpenCarto Java Bibliothek

Es ist möglich, die Glättungsstärke und die Farbpalette zu ändern.

julien
quelle