Die Pixel auf der linken Seite stellen Baumpositionen und die zugehörigen Kronenradien dar (dh Pixelwerte im Bereich von 2 bis 5). Ich möchte diese Rasterpixel nach ihrem Kronenradiuswert puffern. Das Bild rechts ist das, was ich nur mit Rasterverarbeitungsmethoden erreichen möchte .
Ich würde anfänglich überlegen, in ArcGIS eine kreisförmige Brennpunktsumme zu verwenden, obwohl die Nachbarschaftseinstellung ein fester Wert ist, der den variablen Kronenradius nicht berücksichtigt.
Was ist eine gute Methode, um Pixel nach ihren Werten zu "puffern"?
Antworten:
Hier ist eine reine Rasterlösung für die
Python 2.7
Verwendung vonnumpy
undscipy
:Eingang:
Ausgabe:
quelle
Vektorbasierter Ansatz
Diese Aufgabe kann in drei Schritten ausgeführt werden:
Raster To Point
;Buffer
(unter Verwendung desVALUE
Feldes als Pufferfeld );Feature To Raster
.Hinweis: Wenn Sie das Pufferfeld verwenden, wird die Berechnung eines Puffers für jeden Kronenradiuswert vermieden.
Raster-basierter Ansatz
Dieses Problem vermeidet die vektorbasierte Lösung und schlägt vor, eine Art zellularer Automaten zu verwenden, die auf den nächsten Nachbarn basieren. Angenommen, alle schwarzen Pixel sind Nullen, die Pixel sind quadriert und ihre Größe ist gleich 1 (oder alternativ werden sie angemessen skaliert), sind die zu übernehmenden Regeln sehr einfach:
VALUE
) größer als 1 ist, wird sein Wert zuVALUE-1
den umgebenden Pixeln und berücksichtigt diese. Wenn ihre Werte kleiner als sindVALUE-1
, werden diese Pixel geboren oder wachsen und ihr Wert wirdVALUE-1
. Ansonsten überleben diese Pixel und bleiben unverändert.VALUE<=1
, nichts tun (das Pixel ist tot!).Diese Regeln müssen angewendet werden, bis alle Pixel tot sind, dh ihre Werte sind gleich 0 oder 1. Also
N-1
mal, woN
ist der maximale Wert, den Sie im Eingabe-Raster haben. Dieser Ansatz lässt sich mit etwas Python und Numpy recht einfach umsetzen.quelle
Eine andere Option wäre, separate Raster für jeden Pixelwert zu erstellen, in diesem Fall 4 Raster mit einer Bedingung. Erweitern Sie dann die Raster um eine Pixelanzahl, die dem Rasterwert entspricht (indem Sie möglicherweise über eine Werteliste iterieren). Verbinden Sie zuletzt die Raster (entweder algebraisch oder räumlich), um ein binäres Raster für die Baumkronen zu erstellen.
quelle
Es ist eine schwierige Frage, dies im Raster zu tun, da Sie nicht die Möglichkeit haben, den Wert des Pixels zum Definieren der Größe des Puffers zu verwenden. Aus diesem Grund müssten Sie, wie bereits erwähnt, für jeden Wert den Fokusfilter verwenden.
Hier ist eine mögliche Antwort, um es mit nur 3 Filtern zu tun (ich konnte nicht weniger finden), aber nicht perfekt, wie von Whuber erwähnt: Ihre Puffer werden abgeschnitten, wenn Bäume nahe beieinander stehen.
1) BEARBEITEN: Euklidische Zuordnung (dies löst das Problem nicht vollständig, da es die Puffer in der Nähe kleinerer Bäume schneidet, aber es ist besser als die Artefakte meiner ersten Lösung).
2) Euklidianabstand um jedes Pixel
3) Rasterrechner (Kartenalgebra) mit einer bedingten Anweisung
Beachten Sie, dass Sie den Zustand in Bezug auf den Radius (mit oder ohne das zentrale Pixel) an Ihre Bedürfnisse anpassen können.
quelle
Fragen Sie sich, warum Sie nicht das Erweiterungstool von ArcGIS verwenden?
Bei Überlappung: Der letzte
expand
Befehl deckt die vorherigen ab.quelle
Wenn Sie die Pixelposition haben, geben Ihnen der Radius und der Mittelpunktkreis-Algorithmus (eine Variante des Bresenham Alg.) Einen Hinweis. IMO ist es einfach, ein Polygon aus diesem Ansatz zu erstellen, und ich denke, es ist einfach, dies in Python zu implementieren. Eine Vereinigung dieser Menge von Polygonen ergibt den Abdeckungsbereich.
quelle