Znalezienie najbliższej wartości komórki rastrowej na podstawie punktu wektorowego?

9

Mam dwie warstwy w ArcGIS: Jedna to punkt wektorowy, a druga to warstwa rastrowa. Chcę dołączyć wartość siatki danych rastrowych do punktu wektorowego. Problem polega na tym, że punkt wektorowy jest oddalony od wszelkich istniejących siatek rastrowych o wartości, więc polecenie „Próbka” nie zwraca żadnej wartości dla tego punktu wektorowego.

Więc moje pytanie brzmi: jak znaleźć najbliższą komórkę rastrową z danym punktem wektorowym i wyodrębnić wartość z komórki?

Właściwie muszę zrobić dwie rzeczy:

  1. Zidentyfikuj kontur w obrębie tropiciela (zwykle 1-2 komórki od mojego istniejącego rastra)
  2. Przypisz im wartość od najbliższego rastra, jeśli są w zakresie

Edytowano: Mam około 3000 punktów wektorowych i mój problem jest następujący: wprowadź opis zdjęcia tutaj

Muszę dołączyć wartość rastra na podstawie lokalizacji do punktów wektora. Użyłem narzędzia „Próbka” i działa dobrze dla większości punktów.

Istnieje jednak taka sytuacja wprowadź opis zdjęcia tutaj

Właściwy punkt może uzyskać wartość z rastra (działa „Próbka”), ale lewy punkt nie może z powodu problemów z wyrównaniem.

Raster to polygon nie działa, ponieważ pojawia się komunikat o błędzie, że nie mogę zamienić ich na wektor, ponieważ są one poza domeną. Też mam takie punktywprowadź opis zdjęcia tutaj

Te górne punkty nie powinny otrzymywać żadnych wartości, ponieważ znajdują się zbyt daleko od rastra.

Pomyślałem, że jakoś obejść:

Krok 1. Najpierw wykonaj „próbkę”

Krok 2. Wybierz wartość zerową po operacjach „przykładowych”

Krok 3. konstruuj strefy buforowe (z dokładnością do 1 stopnia dziesiętnego) na podstawie punktów zerowych

Krok 4. Użyj statystyk strefowych? ? lub inne narzędzia do pętli przez wszystkie komórki rastrowe w buforze, znajdź najbliższą, wyodrębnij jej wartość i umieść ją w punkcie wektorowym.

Utknąłem w kroku 4. Nie wiem, którego narzędzia w ArcSDK mogę użyć do osiągnięcia tej funkcji.

A może… Czy masz lepszy pomysł, aby sobie z tym poradzić?

Mam 20 takich warstw rastrowych i chciałbym zrobić to automatycznie (używając konstruktora modeli i arcobject).

Widziany
źródło
@whuber: Twoja metoda brzmi bardzo sprytnie. Moje pytanie brzmi: przetwarzam dane w skali globalnej i jak mogę ustalić x0 i x1 dla konspektu rastrowego?
Widziany
Sprawdź jego właściwości po dodaniu go do projektu.
whuber
1
Statystyki strefowe to ślepy zaułek. W oparciu o edycję istnieje proste bezpośrednie rozwiązanie: lekko powiększ raster wokół jego granicy i próbkuj rozwinięty raster. Można to zrobić na wiele sposobów, ale wszystkie wymagają niewielkiej ułatwienia w obliczeniach rastrowych. Jednym z najprostszych jest zwiększenie zasięgu analizy, obliczenie średniej ogniskowej i (użycie „con”) wklejenie jej wartości do strefy granicznej NoData. Przypisuje to średnią pobliskich wartości rastrowych do każdej lokalizacji próbki poza rastrem.
whuber
@ whuber Jest jeszcze jeden problem, ponieważ nie wiem, gdzie są konspekty. Tak naprawdę w moim procesie są 2 procedury: zidentyfikuj kontury i przypisz im wartości.
Widziany
Co to jest „konturówka”? Jeśli jest to punkt nie objęty wartością rastrową, nie możesz pomóc w znalezieniu ich: będą to punkty, które nie otrzymają żadnych wartości po zastosowaniu Samplenarzędzia.
whuber

Odpowiedzi:

8

Kontur rastrowy zajmuje prostokąt ograniczony w lewym dolnym rogu przez punkt początkowy, mający współrzędne (powiedzmy) (x0, y0), a w prawym górnym rogu przez (x1, y1): są to właściwości łatwo odkryte przez dowolnego rastra. Możesz użyć tych informacji, aby przenieść dowolne punkty poza zasięg rastra do najbliższego punktu na granicy rastra i wyodrębnić wartości rastra w nowych lokalizacjach.

Takie zadania często są łatwo opracowywane, biorąc pod uwagę mniejsze wymiary . Jednowymiarowy zasięg rastra to po prostu przedział liczb, powiedzmy od x0 do x1> x0, tradycyjnie zapisany [x0, x1]. Załóżmy, że chcesz znaleźć najbliższy punkt w tym przedziale dla podanej liczby x. Istnieją trzy przypadki: x <x0 (x jest po lewej), x0 <= x <= x1 (x jest w przedziale) i x1 <x (x jest po prawej). Najwyraźniej najbliższymi punktami są odpowiednio x0, x i x1. Wzór na ten wynik to

x -> min (maks. (x, x0), x1),

jak widać, rozważając każdy z trzech przypadków osobno.

Ponieważ zasięg rastra jest iloczynem kartezjańskim dwóch przedziałów, [x0, x1] * [y0, y1], ta sama formuła działa w dwóch wymiarach. Po prostu zastosuj go do każdego interwału. W ten sposób współrzędne rzutowanego punktu można obliczyć (powiedzmy w kalkulatorze pola) jako

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

Oto ta formuła w akcji ze 100 punktami losowo rozmieszczonymi wokół i w zasięgu siatki:

Postać

Linie przerywane wizualnie kojarzą punkty poza zasięgiem z miejscami, w których zostaną przeniesione.

Utwórz warstwę punktową z tych obliczonych współrzędnych i zastosuj Samplenarzędzie, aby wyodrębnić wartości rastrowe. Połącz wyniki z powrotem do oryginalnej warstwy punktowej.

W praktyce , aby uniknąć problemów z zaokrąglaniem zmiennoprzecinkowym, które mogłyby powstrzymywać nowe punkty przed leżeniem w zasięgu siatki, rozsądnie byłoby, aby x0 i y0 były nieco większe niż prawdziwe pochodzenie (możesz dodać do nich połowę rozmiaru komórki) i podobnie sprawiają, że x1 i y1 są nieco mniejsze.

Podsumowując , przepływ pracy polega na obliczeniu dwóch pól (nowych współrzędnych) w tabeli oryginalnej warstwy punktowej, utworzeniu warstwy zdarzeń punktowych z tych nowych współrzędnych, uruchomieniu Samplenarzędzia i wykonaniu połączenia z bazą danych (nie połączenia przestrzennego).


Gdy masz dużo więcej punktów wektorowych niż komórek w rastrze , powinieneś preferować rozwiązanie podane przez @celenius (który proponuje konwersję rastra na punkty i użycie łączenia przestrzennego). Zwykle jednak rastry mają wiele komórek - od milionów do miliardów - a konwersja na punkty jest tak czasochłonna i dyskowa, że ​​należy do niej podchodzić ostrożnie.

Alternatywnie, możesz przyspieszyć rozwiązanie Celeniusa, używając obliczeń rastrowych, aby utworzyć siatkę całkowitą z wartościami tylko wzdłuż jej granicy. Konwersja że do warstwy punktowej jest szybkie i łatwe, ponieważ będzie to miało kilka punktów. Nazwijmy to „warstwą graniczną”. Próbkuj siatkę w punktach warstwy granicznej, kopiując w ten sposób wartości siatki do tabeli atrybutów warstwy granicznej. Po uruchomieniu Samplez oryginalną warstwą punktową usuń wszystkie punkty, w których próbka została pomyślnie uzyskana. Połącz przestrzennie warstwę graniczną z pozostałymi punktami, aby zakończyć proces próbkowania.

(Jednym ze sposobów utworzenia siatki z wartościami tylko wzdłuż jej granicy jest zastosowanie operacji ogniskowej sąsiedztwa, która kończy się niepowodzeniem wzdłuż granicy: przykłady obejmują wyszukiwanie stoków, cieniowanie wzgórza, statystyki ogniskowania okolic 3 x 3. To tworzy siatkę z jedną komórką gruby pierścień NoData wokół jego krawędzi. Używanie IsNull i SetNull do wykrywania komórek NoData i konwertowania między NoData a komórkami danych tworzy siatkę pełną wartości NoData z wyjątkiem wokół granicy.)

Whuber
źródło
Podsumowując, przepływ pracy polega na obliczeniu dwóch pól (nowych współrzędnych) w tabeli oryginalnej warstwy punktowej, utworzeniu warstwy zdarzeń punktowych z tych nowych współrzędnych, uruchomieniu narzędzia Próbka i wykonaniu połączenia z bazą danych (nie połączenia przestrzennego). Czy możesz wyjaśnić, jak to zrobić? (Możesz zobaczyć moje zdjęcia mojego problemu). Dzięki!
Widziany
Mam około 15% punktów mam ten problem. jak możesz określić x0 i x1 dla każdego punktu?
Widziany
1
@ Siedem x0, y0, x1, y1 jest dla siatek. Współrzędne punktu (x, y) można obliczyć w kalkulatorze polowym, jak opisano w pomocy ArcGIS lub w kilku wątkach na tej stronie. Istnieją elementy menu służące do tworzenia warstwy punktów XY i łączenia z bazą danych: są to standardowe, podstawowe operacje.
whuber
4

Możesz przekonwertować raster na punkty ( odwołanie ), a następnie wykonać przestrzenne połączenie punktów (od rastrów) do punktu.

(Właśnie dowiedziałem się, że wczoraj można tutaj dołączyć przestrzennie )

djq
źródło
1
+1 za sprytne podejście. W przypadku dużych siatek, gdzie staje się to niewykonalne, zamień tylko komórki graniczne rastra na punkty. (
Opiszę
Mam tysiące komórek każdej warstwy rastrowej i mam 20 takich warstw ... więc przekształcenie ich w punkty wektorowe jest czasochłonne ...
Widziany
Ponadto, gdy próbuję zrobić raster na wielokącie, pojawia się komunikat o błędzie jako ERROR 000864 Input raster: dane wejściowe nie mieszczą się w zdefiniowanej domenie. BŁĄD 000863: Niepoprawny typ danych GP
Widziany
Czy pojawia się błąd podczas konwersji rastra na punkty?
djq
@celenius To działa, ale zajęło to dużo czasu.
Widziany
1

Możesz przekonwertować warstwę rastrową na wielokąt za pomocą narzędzia Raster na wielobok i albo uruchomić połączenie przestrzenne (kliknij prawym przyciskiem myszy warstwę punktową i wybierz Połączenia i odnosi się - Połącz, przy pierwszym rozwijanym menu wybierz opcję łączenia przestrzennego i wybierz najbliższą do opcji na przycisku readio) lub użyj narzędzia Blisko.

grafika 21
źródło
Jak wykorzystujesz wynik sprzężenia przestrzennego, aby wyodrębnić odpowiednią wartość rastra?
whuber
@ whuber, w oknie dialogowym Połącz dane po wybraniu opcji „najbliżej niego” połączenie przestrzenne wybiera najbliższą operację wielokąta (wynik z narzędzia Raster do wielokąta) i dodaje tę informację o atrybucie do operacji punktowej. Czy o to pytasz? Moja wstępna odpowiedź została opublikowana przed jego edycją. Zgaduję, że raster Seen mógł być zbyt duży, aby przekształcić go w wielokąt?
grafika 21
Nie chodzi o znalezienie najbliższego rastra. Naprawdę potrzebny jest sposób ekstrapolacji wartości rastra poza pierwotny zakres. Pytanie proponuje podejście do najbliższego sąsiada: w dowolnym pobliskim punkcie nie znajdującym się na rastrze znajdź najbliższą komórkę w rastrze i użyj wartości tej komórki.
whuber
Po ponownym przeczytaniu ostatniego komentarza wydaje się, że możesz zaproponować przekształcenie rastra nie w „wielobok”, ale w warstwę wieloboku z jednym wielokątem dla każdej komórki (lub ciągłego zestawu komórek). Jeśli tak, może się to udać z bardzo małymi rastrami, ale dlaczego proponujesz to - co jest złożoną, kosztowną operacją (i działa tylko dla siatek całkowitych) - zamiast podobnego, ale bardziej wydajnego rozwiązania oferowanego wcześniej przez @celenius? Jakie zalety oferuje twoje rozwiązanie?
whuber
@ whuber, warstwa wielokąta jest poprawna. Tak, metoda celenius kosztowałaby mniej pamięci.
grafika 21