Finden des nächsten Rasterzellenwerts basierend auf dem Vektorpunkt?

9

Ich habe zwei Ebenen in ArcGIS: Eine ist ein Vektorpunkt und die andere ist eine Rasterebene. Ich möchte den Wert des Rasterdatengitters an den Vektorpunkt anhängen. Das Problem ist, dass der Vektorpunkt von allen vorhandenen Rastergittern mit Wert entfernt ist, sodass der Befehl "Beispiel" keinen Wert für diesen Vektorpunkt zurückgibt.

Meine Frage lautet also: Wie kann ich die nächste Rasterzelle mit einem Vektorpunkt finden und den Wert aus der Zelle extrahieren?

Eigentlich muss ich zwei Dinge tun:

  1. Identifizieren Sie den Outliner innerhalb eines Waldläufers (normalerweise 1-2 Zellen von meinem vorhandenen Raster entfernt).
  2. Weisen Sie ihnen einen Wert aus dem nächstgelegenen Raster zu, wenn sie sich in einem Bereich befinden

Bearbeitet: Ich habe ungefähr 3000 Vektorpunkte und mein Problem ist folgendes: Geben Sie hier die Bildbeschreibung ein

Ich muss den Rasterwert basierend auf den Positionen an die Vektorpunkte anhängen. Ich habe das Tool "Sample" verwendet und es funktioniert für die meisten Punkte gut.

Es gibt jedoch eine solche Situation Geben Sie hier die Bildbeschreibung ein

Der rechte Punkt kann den Wert aus dem Raster abrufen ("Beispiel" funktioniert), der linke Punkt jedoch aufgrund von Ausrichtungsproblemen nicht.

Raster zu Polygon funktioniert nicht, da die Fehlermeldung angezeigt wird, dass ich sie nicht in Vektoren umwandeln kann, da sie sich außerhalb der Domäne befinden. Auch ich habe solche PunkteGeben Sie hier die Bildbeschreibung ein

Diese oberen Punkte sollten keine Werte erhalten, da sie zu weit vom Raster entfernt sind.

Ich dachte an Möglichkeiten, um das Problem zu umgehen:

Schritt 1. Machen Sie zuerst die "Probe"

Schritt 2. Wählen Sie den Nullwert nach den "Beispiel" -Operationen aus

Schritt 3. Erstellen Sie Pufferzonen (innerhalb von 1 Dezimalgrad) basierend auf den Nullpunkten

Schritt 4. Zonenstatistik verwenden? ? oder andere Werkzeuge, um alle Rasterzellen im Puffer zu durchlaufen, die nächste zu finden, ihren Wert zu extrahieren und in den Vektorpunkt zu setzen.

Ich stecke in Schritt 4 fest. Ich weiß nicht, mit welchem ​​Tool in ArcSDK ich diese Funktion ausführen kann.

Oder sonst ... Hast du eine bessere Idee, damit umzugehen?

Ich habe 20 Rasterebenen wie diese und möchte sie automatisch erstellen (mit Model Builder und ArcObject).

Gesehen
quelle
@whuber: Deine Methode klingt sehr clever. Meine Frage ist, ob ich Daten auf globaler Ebene verarbeite und wie ich x0 und x1 für das Gliederungsraster bestimmen kann.
Gesehen
Überprüfen Sie die Eigenschaften, nachdem Sie sie dem Projekt hinzugefügt haben.
whuber
1
Zonenstatistiken sind eine Sackgasse. Basierend auf Ihrer Bearbeitung gibt es eine einfache direkte Lösung: Erweitern Sie das Raster leicht um seine Grenze und probieren Sie das erweiterte Raster aus. Es gibt viele Möglichkeiten, dies zu tun, aber alle erfordern eine kleine Einrichtung mit Rasterberechnungen. Eine der einfachsten Möglichkeiten besteht darin, den Analyseumfang zu vergrößern, einen Fokusmittelwert zu berechnen und (mit 'con') seine Werte in die NoData-Grenzzone einzufügen. Dadurch wird jedem Off-Raster-Beispielort ein Mittelwert der Rasterwerte in der Nähe zugewiesen.
whuber
@whuber Es gibt ein weiteres Problem ist, dass ich nicht weiß, wo die Outliner sind. Es gibt also tatsächlich zwei Verfahren in meinem Prozess: Identifizieren Sie die Outliner und weisen Sie ihnen Werte zu.
Gesehen
Was ist ein "Outliner"? Wenn es sich um einen Punkt handelt, der nicht von einem Rasterwert abgedeckt wird, müssen Sie ihn finden: Dies sind die Punkte, die beim Anwenden des SampleWerkzeugs keine Werte erhalten .
whuber

Antworten:

8

Ein Rasterumriss nimmt ein Rechteck ein, das unten links vom Ursprung begrenzt wird und Koordinaten (z. B.) (x0, y0) und oben rechts von (x1, y1) aufweist. Dies sind Eigenschaften, die von jedem Raster leicht entdeckt werden können. Mit diesen Informationen können Sie Punkte außerhalb der Rasterausdehnung auf den nächstgelegenen Punkt an der Rastergrenze verschieben und die Rasterwerte an den neuen Positionen extrahieren.

Aufgaben wie diese lassen sich oft unter Berücksichtigung geringerer Abmessungen leicht lösen . Die Ausdehnung eines eindimensionalen Rasters ist nur ein Intervall von Zahlen, beispielsweise von x0 bis x1> x0, konventionell geschrieben [x0, x1]. Angenommen, Sie möchten den nächstgelegenen Punkt in diesem Intervall zu einer bestimmten Zahl x finden. Es gibt drei Fälle: x <x0 (x ist links), x0 <= x <= x1 (x ist im Intervall) und x1 <x (x ist rechts). Offensichtlich sind die nächsten Punkte x0, x bzw. x1. Eine Formel für dieses Ergebnis lautet

x -> min (max (x, x0), x1),

Wie Sie sehen können, betrachten Sie jeden der drei Fälle separat.

Da die Ausdehnung eines Rasters das kartesische Produkt zweier Intervalle ist, [x0, x1] * [y0, y1], funktioniert dieselbe Formel in zwei Dimensionen. Wenden Sie es einfach auf jedes Intervall an. Somit können die Koordinaten des projizierten Punktes (beispielsweise in einem Feldrechner) als berechnet werden

(x, y) -> (min (max (x, x0), x1), min (max (y, y0), y1).

Hier ist diese Formel in Aktion mit 100 Punkten, die zufällig um und innerhalb der Ausdehnung eines Gitters platziert werden:

Zahl

Die gestrichelten Linien ordnen visuell Punkte außerhalb der Ausdehnung den Orten zu, an denen sie verschoben werden.

Erstellen Sie aus diesen berechneten Koordinaten eine Punktebene und wenden Sie das SampleWerkzeug an, um die Rasterwerte zu extrahieren. Verbinden Sie die Ergebnisse wieder mit der ursprünglichen Punktebene.

Als eine praktische Sache , um Probleme mit der Gleitkommarundung zu vermeiden , dass die neuen Punkte aus, die innerhalb des Rasters Ausmaß halten könnte, wäre es klug x0 und y0 etwas größer als die wahre Herkunft zu machen sein (Sie die Hälfte der Zellengröße zu ihnen hinzufügen möchte ) und in ähnlicher Weise x1 und y1 etwas kleiner machen.

Zusammenfassend besteht der Workflow aus der Berechnung von zwei Feldern (den neuen Koordinaten) in der Tabelle der ursprünglichen Punktebene, der Erstellung einer Punktereignisebene aus diesen neuen Koordinaten, der Ausführung des SampleTools und der Durchführung einer Datenbankverknüpfung (keine räumliche Verknüpfung).


Wenn Sie viel mehr Vektorpunkte haben als Zellen im Raster , sollten Sie die Lösung von @celenius bevorzugen (der vorschlägt, das Raster in Punkte zu konvertieren und eine räumliche Verknüpfung zu verwenden). Normalerweise haben Raster jedoch viele Zellen - Millionen bis Milliarden - und die Konvertierung in Punkte ist so zeit- und festplattenintensiv, dass mit Vorsicht vorgegangen werden sollte.

Alternativ können Sie die Celenius-Lösung beschleunigen, indem Sie mithilfe einer Rasterberechnung ein ganzzahliges Raster mit Werten nur entlang seiner Grenze erstellen . Konvertieren , dass bis zu einem Punkt Schicht ist schnell und einfach , weil es einige Punkte hat. Nennen wir dies die "Grenzschicht". Probieren Sie das Gitter an den Grenzschichtpunkten aus und kopieren Sie dabei die Gitterwerte in die Attributtabelle der Grenzschicht. SampleEntfernen Sie nach dem Ausführen mit der ursprünglichen Punktebene alle Punkte, an denen eine Probe erfolgreich erhalten wurde. Verbinden Sie die Grenzschicht räumlich mit den verbleibenden Punkten, um den Probenahmevorgang abzuschließen.

(Eine Möglichkeit , ein Raster mit Werten nur entlang seiner Grenze zu erstellen, besteht darin, eine fokale Nachbarschaftsoperation anzuwenden, die entlang der Grenze fehlschlägt. Beispiele hierfür sind das Auffinden von Steigungen, Hillshading und 3 x 3 Fokusstatistiken für die Nachbarschaft. Dicker Ring von NoData um seinen Rand. Wenn Sie IsNull und SetNull verwenden, um NoData-Zellen zu erkennen und zwischen NoData und Datenzellen zu konvertieren, wird ein Raster voller NoData-Werte erzeugt, außer um die Grenze herum.)

whuber
quelle
Zusammenfassend besteht der Workflow aus der Berechnung von zwei Feldern (den neuen Koordinaten) in der Tabelle der ursprünglichen Punktebene, der Erstellung einer Punktereignisebene aus diesen neuen Koordinaten, der Ausführung des Beispielwerkzeugs und der Durchführung einer Datenbankverknüpfung (keine räumliche Verknüpfung). Könnten Sie näher erläutern, wie das geht? (Sie können meine Bilder für mein Problem sehen). Vielen Dank!
Gesehen
Ich habe ungefähr 15% Punkte haben dieses Problem. Wie können Sie x0 und x1 für jeden Punkt bestimmen?
Gesehen
1
@Seen die x0, y0, x1, y1 sind für die Gitter. Die Punktkoordinaten (x, y) können im Feldrechner wie in der ArcGIS-Hilfe oder in mehreren Threads auf dieser Site beschrieben berechnet werden. Es gibt Menüelemente zum Erstellen einer XY-Punktebene und Datenbankverknüpfungen: Dies sind Standardoperationen.
whuber
4

Sie können das Raster in Punkte konvertieren ( ref ) und dann eine räumliche Verknüpfung der Punkte (von den Rastern) zum Punkt vornehmen.

(Ich habe gerade erfahren, dass hier gestern Punkte räumlich verbunden werden können )

djq
quelle
1
+1 für einen cleveren Ansatz. Konvertieren Sie bei großen Gittern, bei denen dies nicht praktikabel ist, nur die Grenzzellen des Rasters in Punkte. (Ich beschreibe wie am Ende meiner Antwort.)
whuber
Ich habe Tausende von Zellen jeder Rasterebene und ich habe 20 solcher Ebenen ... also ist es zeitaufwändig, diese in Vektorpunkte umzuwandeln ...
Gesehen
Wenn ich versuche, ein Raster für ein Polygon zu erstellen, wird eine Fehlermeldung als FEHLER 000864 Eingabe-Raster angezeigt: Die Eingabe befindet sich nicht innerhalb der definierten Domäne. FEHLER 000863: Ungültiger GP-Datentyp
Gesehen
Erhalten Sie eine Fehlermeldung beim Konvertieren von Raster in Punkte?
DJQ
@celenius Es funktioniert, aber es hat lange gedauert.
Gesehen
1

Sie können die Rasterebene mit dem Werkzeug Raster in Polygon in ein Polygon konvertieren und entweder eine räumliche Verknüpfung ausführen (klicken Sie mit der rechten Maustaste auf die Punktebene und wählen Sie Verknüpfungen und Verknüpfungen - Verknüpfung aus. Wählen Sie im ersten Dropdown-Menü die Option räumliche Verknüpfung aus und wählen Sie die Option aus, die am nächsten liegt Option auf der Readio-Schaltfläche) oder verwenden Sie das Near-Tool.

Artwork21
quelle
Wie verwenden Sie das Ergebnis der räumlichen Verknüpfung, um den entsprechenden Rasterwert zu extrahieren?
whuber
@whuber: Wenn Sie im Dialogfeld "Daten verbinden" die Option "Ist am nächsten" auswählen, wählt die räumliche Verknüpfung das nächstgelegene Polygon-Feature aus (Ergebnis des Werkzeugs "Raster zu Polygon") und fügt diese Attributinformationen dem Punkt-Feature hinzu. Ist es das, was Sie gefragt haben? Meine erste Antwort wurde vor seiner Bearbeitung veröffentlicht. Ich vermute, dass das Raster von Seen möglicherweise zu groß war, um in ein Polygon konvertiert zu werden.
Artwork21
Die Idee ist nicht, das nächste Raster zu finden. Was wirklich gewünscht wird, ist eine Möglichkeit, die Werte eines Rasters über seinen ursprünglichen Umfang hinaus zu extrapolieren. Die Frage schlägt einen Ansatz für den nächsten Nachbarn vor: Suchen Sie an einem beliebigen Punkt in der Nähe, der sich nicht im Raster befindet, die nächste Zelle im Raster und verwenden Sie den Wert dieser Zelle.
whuber
Wenn Sie Ihren letzten Kommentar erneut lesen, scheint es, als würden Sie vorschlagen, das Raster nicht in "ein Polygon", sondern in eine Polygonebene mit einem Polygon für jede Zelle (oder einen zusammenhängenden Satz von Zellen) umzuwandeln. Wenn dem so ist, könnte es mit sehr kleinen Rastern gelingen, aber warum schlagen Sie dies vor - was eine komplexe, teure Operation ist (und nur für ganzzahlige Gitter funktioniert) - anstelle der ähnlichen, aber effizienteren Lösung, die @celenius zuvor angeboten hat? Welche Vorteile bietet Ihre Lösung?
whuber
@whuber, Polygonebene ist korrekt. Ja, die Celenius-Methode würde weniger Speicher kosten.
Artwork21