Rasterclustering mit QGIS

10

Ich suche nach einer Möglichkeit, ein klassifiziertes Raster basierend auf räumlichen Clustern innerhalb jeder Klasse in Polygone umzuwandeln. Damit die Cluster als gültig angesehen werden können, müssen sie aus einem Mindestprozentsatz von Zellen aus einer der Klassen bestehen.

Beispiel: Ein Bereich, der aus 70% (oder mehr) Zellen der Klasse "1" besteht, wird als Cluster der Klasse "1" betrachtet, obwohl der Bereich mit 30% Zellen verwechselt ist, die zu anderen Klassen gehören. Die Clusteranalyse sollte daher auf dem Abstand zwischen Zellen derselben Klasse basieren.

Eine andere Möglichkeit könnte darin bestehen, das Clustering auf einer minimalen Anzahl von Zellen innerhalb einer bestimmten Klasse zusammen mit einer Definition eines maximalen Suchbereichs zu basieren.

Zum Beispiel: Innerhalb eines bestimmten Bereichs sollte 100 Zellen der „Klasse 1“ sein , denn es ist ein Cluster berücksichtigt werden.  

Die meisten Tools im Zusammenhang mit Clustering scheinen nur für Vektoren zu funktionieren. Ich habe mir das SAGA-Tool Cluster-Analyse angesehen, aber es passte nicht wirklich zu meinem Zweck. Irgendwelche Ideen zur Lösung dieses oder anderer Tools, die hilfreich sein könnten?

Spiran
quelle
Sie können das Raster in einen Vektor konvertieren und die Vektorclustering-Tools verwenden.
csk
Das ist eine Option, aber ich denke, es ist viel einfacher, die Analyse wenn möglich im Rasterformat durchzuführen. Die Konvertierung in einen Vektor würde wahrscheinlich Polygone erzeugen, bei denen viele Details bei der Vereinigung von Rasterzellen verloren gehen oder viel zu viele Punkte zu verarbeiten sind (großer Datensatz).
Spiran
3
Ich weiß, dass dies keine QGIS-Lösung ist, aber könnten Sie Python oder R verwenden, um eine Nachbarschaftsfunktion zu erstellen, damit Sie ein neues Raster erstellen, in dem jede Zelle betrachtet wird und wenn> 70% der Zellen in der Nachbarschaft zu einer Klasse gehören wird diese Zelle dann in diese Klasse umklassifiziert?
Liam G
Das könnte sicher funktionieren, danke! Ich bin neu in Python, aber es ist einen Versuch wert.
Spiran

Antworten:

5

Wenn Sie dieses Problem lieber in der "Rasterlogik" behandeln möchten, können Sie einige Filter in Betracht ziehen. Die beste Wahl hängt von der räumlichen Verteilung Ihrer Pixel jeder Klasse innerhalb Ihrer "Hintergrund" -Werte ab. Hier sind jedoch zwei mögliche Lösungen:

Wenn Ihre Patches, die Sie entfernen möchten, relativ groß sind, sollten Sie "Sieb" verwenden (Raster> Analyse> Sieb in QGIS 3.2, das auf gdal_sieve.py basiert).

Das Skript gdal_sieve.py entfernt Rasterpolygone, die kleiner als eine angegebene Schwellengröße (in Pixel) sind, und ersetzt sie durch den Pixelwert des größten Nachbarpolygons. Das Ergebnis kann in das vorhandene Rasterband zurückgeschrieben oder in eine neue Datei kopiert werden.

Wenn Sie so etwas wie einen "Salz- und Pfeffereffekt" haben (viele isolierte Pixel verschiedener Klassen, aber nur wenige Pixel pro kleinen Pfaden, sollten Sie einen Mehrheitsfilter verwenden (z. B. zu den zusätzlichen Werkzeugen von GRASS> raster> r gehen). Nachbarn> Option "Modus" auswählen) Beachten Sie, dass dieser Filter Ihre Grenzen (geringfügig) beeinflusst.

r.neighbors - Macht jeden Zellkategoriewert zu einer Funktion der Kategoriewerte, die den Zellen um ihn herum zugewiesen sind, und speichert neue Zellenwerte in einem Ausgabe-Raster-Map-Layer

Wenn Sie möchten, finden Sie in den SAGA-Tools (SAGA> Rasterfilter) dieselben und andere Filter (Mehrheitsfilter, Siebklassen) und andere (Morphologie)

Radouxju
quelle
So habe ich es eigentlich gelöst. Grundsätzlich durch Verwendung des Gras-Nachbarschafts-Analyse-Tools zusammen mit einigen Berechnungen nebenbei. Ich habe jedoch vergessen, die Lösung zu veröffentlichen. Vielen Dank für Ihre Eingabe radouxju.
Spiran