Identifizieren von Überlappungsbereichen im R-Raster-Paket

8

Paket:

Daten:

  • Ein rasterStack mit 10 Bändern.
  • Jedes der Bänder enthält einen Bildbereich, der von NAs
  • umgeben ist
  • Bänder sind logisch, d. h. "1" für Bilddaten und "0" / NA für Umgebung
  • Die "Bildbereiche" jeder Bande sind nicht vollständig miteinander ausgerichtet, obwohl die meisten Teilüberlappungen aufweisen

Ziel:

  • Schreiben Sie eine schnelle Funktion, die entweder eine rasterLayer- oder Zellennummer für jede "Zone" zurückgibt, z. B. ein Pixel mit Daten nur von Band 1 und 2 in Zone 1, ein Pixel mit Daten nur von Band 3 und 4 in Zone 2 usw. Wenn eine rasterLayer zurückgegeben wird, muss der Zonenwert später mit Bandnummern übereinstimmen.

Erster Versuch:

%Vor%

Meine aktuelle Funktion benötigt sehr viel Zeit. Kannst du dir einen besseren Weg vorstellen? Beachten Sie, dass ich nicht nur wissen möchte, wie viele Bänder Daten an jedem Pixel haben, ich muss auch wissen, welche Bänder. Ziel ist es, die Bereiche anschließend unterschiedlich zu bearbeiten.

Beachten Sie auch, dass das reale Szenario ein 3000 x 3000 oder mehr Raster mit potenziell mehr als 10 Bändern ist.

BEARBEITEN

Einige Beispieldaten, die aus 10 versetzten Bildbereichen bestehen:

%Vor%

    
Benjamin 14.04.2011, 19:28
quelle

4 Antworten

6

BEARBEITEN: Antwort aktualisiert mit Nicks Trick und Matrix-Multiplikation.

Sie könnten die folgende Funktion ausprobieren, optimiert mit Nicks Trick und Matrixmultiplikation. Der Flaschenhals füllt jetzt den Stapel mit den einzelnen Ebenen, aber ich denke, die Zeiten sind jetzt ganz in Ordnung. Speicherverbrauch ist ein bisschen weniger, aber angesichts Ihrer Daten und der Art von R, weiß ich nicht, ob Sie ein bisschen knabbern können, ohne die Leistung große Zeit zu behindern.

%Vor%

Die Funktion gibt entweder einen rasterStack mit den verschiedenen Level-Kombinationen im Plot zurück (das sind nicht alle möglichen Level-Kombinationen, also haben Sie dort bereits etwas Gewinn), oder eine Matrix mit den Level-Nummer- und Level-Namen. Dies ermöglicht Ihnen beispielsweise Folgendes:

%Vor%

, um die Ebenennamen für jeden Zellpunkt zu erhalten. Wie unten gezeigt, können Sie diese Matrix leicht in ein rasterLayer-Objekt einfügen.

Die Funktion:

%Vor%

Proof of Concept unter Verwendung der Daten von RobertH:

%Vor%

%Vor%

    
Joris Meys 18.04.2011, 14:31
quelle
3

Ich bin nicht vertraut mit Raster, aber von dem, was ich von oben verstehe, haben Sie im Wesentlichen ein 10 * 3000 * 3000 Array, oder?

Wenn dies der Fall ist, können Sie für jede Position im Raster (zweiter und dritter Index, Currow und Curcol) einen eindeutigen Bezeichner für seine 'Zone' mit binary berechnen: run i über die 'bands' (erster Index) und Summe r [i, Currow, Curcol] * 2 ^ (i-1). Abhängig von der internen Arbeitsweise von Raster sollte es möglich sein, dies relativ schnell zu implementieren.

Dies führt zu einem neuen "Raster" der Größe 3000 * 3000, das die eindeutigen Identifikatoren jeder Position enthält. Wenn Sie dort die eindeutigen Werte finden, erhalten Sie die Zonen zurück, die tatsächlich in Ihren Daten vorkommen. Wenn Sie die Binärlogik umkehren, erhalten Sie die Bänder, die zu einer bestimmten Zone gehören.

Verzeihen Sie, wenn meine Interpretation von Raster falsch ist: dann ignorieren Sie bitte meine Gedanken. In jedem Fall keine vollständige Lösung.

    
Nick Sabbe 18.04.2011 14:09
quelle
3

Wie wäre es damit?

%Vor%

allgemeiner:

%Vor%

Das ist nicht gut, wenn Nlayer (s) zweistellig sind ("1", "2" ist gleich "12") und in diesen Fällen können Sie stattdessen die Funktion (fun2) verwenden:

%Vor%

nur für das Spielzeugbeispiel:

%Vor%     
RobertH 18.04.2011 00:59
quelle
1

Ich habe einen Code für @Nick Sabbes Vorschlag geschrieben, der meiner Meinung nach sehr kurz und relativ schnell ist. Dies setzt voraus, dass die Eingabe rasterStack bereits logische Daten 1 oder 0 enthält:

%Vor%     
Benjamin 18.04.2011 20:26
quelle

Tags und Links