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:
- Zidentyfikuj kontur w obrębie tropiciela (zwykle 1-2 komórki od mojego istniejącego rastra)
- 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:
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
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 punkty
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).
źródło
Sample
narzędzia.Odpowiedzi:
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:
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
Sample
narzę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
Sample
narzę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
Sample
z 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.)
źródło
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 )
źródło
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.
źródło