Zastanawiam się, czy istnieje sposób na znalezienie minimalnego zasięgu granicznego dla rastra o określonej wartości. Wyciągnąłem raster z obrazu globalnego, a zasięg jest ustawiony jako zasięg globalny z dużą ilością obszaru NoData. Chciałbym usunąć obszar NoData z tego rastra i zachować tylko obszar zawierający piksele o określonej wartości. W jaki sposób mogę to zrobić?
Oto mój przykład: Chciałbym wyodrębnić wartość = 1 (niebieski obszar) i użyć zasięgu niebieskiego obszaru zamiast całego świata do dalszego przetwarzania.
arcgis-desktop
raster
extents
Widziany
źródło
źródło
Odpowiedzi:
JEŻELI poprawnie zrozumiałem pytanie, brzmi to tak, jakbyś chciał znać minimalną ramkę ograniczającą wartości, które nie są zerowe. Być może możesz przekonwertować raster na wielokąty, wybierz interesujące Cię wielokąty, a następnie przekonwertować je z powrotem na raster. Następnie możesz spojrzeć na wartości właściwości, które powinny dać ci minimalną ramkę ograniczającą.
źródło
Sztuką jest obliczenie limitów danych, które mają wartości. Być może najszybszym, najbardziej naturalnym i najogólniejszym sposobem ich uzyskania jest zastosowanie streszczeń strefowych: przy użyciu wszystkich komórek spoza strefy NoData dla strefy, minimalne i maksymalne strefy siatki zawierające współrzędne X i Y zapewnią pełny zakres.
ESRI nieustannie zmienia sposoby wykonywania tych obliczeń; na przykład wbudowane wyrażenia dla siatek współrzędnych zostały usunięte z ArcGIS 8 i wydaje się, że nie powróciły. Dla zabawy, oto zestaw szybkich, prostych obliczeń, które wykonają zadanie bez względu na wszystko.
Przekształć siatkę w jedną strefę , zrównując ją ze sobą, jak w
„My grid” == „My grid”
Utwórz siatkę indeksu kolumny, gromadząc przepływ stałą siatkę o wartości 1. (Indeksy zaczną się od 0.) W razie potrzeby pomnóż to przez wielkość komórki i dodaj współrzędną x źródła, aby uzyskać siatkę współrzędnych x ” X ”(pokazano poniżej).
Podobnie utwórz siatkę indeksu wierszy ( a następnie siatkę współrzędnych Y „Y”), akumulując przepływ stałą siatkę o wartości 64.
Użyj siatki stref z kroku (1), aby obliczyć strefową min. I maks. „X” i „Y” : masz teraz pożądany zasięg.
(Zasięg, jak pokazano w dwóch tabelach statystyk strefowych, jest przedstawiony na tym rysunku prostokątnym konturem. Siatka „I” jest siatką strefy uzyskaną w kroku (1).)
Aby przejść dalej, musisz wyodrębnić te cztery liczby z ich tabel wyjściowych i użyć ich do ograniczenia zakresu analizy. Kopiowanie oryginalnej siatki, z ograniczonym zakresem analizy, kończy zadanie.
źródło
Oto wersja metody @whubers dla ArcGIS 10.1+ jako przybornika python (.pyt).
źródło
Opracowałem rozwiązanie oparte na gdal i numpy. Dzieli macierz rastrową na wiersze i kolumny i upuszcza puste wiersze / kolumny. W tej implementacji „pusta” jest mniejsza niż 1 i uwzględniono tylko rastry z pojedynczym pasmem.
(Zdaję sobie sprawę, gdy piszę, że to podejście ze skanowaniem jest odpowiednie tylko dla obrazów z „kołnierzami” nodata. Jeśli twoje dane są wyspami na morzach zerowych, przestrzeń między wyspami również zostanie usunięta, zgniatając wszystko razem i całkowicie psując georeferencje .)
Części biznesowe (wymagają rozwinięcia, nie będą działać tak, jak są):
W pełnym skrypcie:
Skrypt znajduje się w mojej skrytce kodu na Githubie, jeśli link zawiera 404 polowanie; te foldery są gotowe do reorganizacji.
źródło
MemoryError
Source raster (geo units): Origin (top left): 2519950.0001220703, 5520150.00012207 Pixel size (x,-y): 100.0, -100.0 Columns, rows : 42000, 43200 Traceback (most recent call last): File "D:/11202067_COACCH/local_checkout/crop_raster.py", line 72, in <module> cropped_raster, cropped_transform = main(src_raster) File "D:/11202067_COACCH/local_checkout/crop_raster.py", line 22, in main data = np.array(raster.ReadAsArray()) MemoryError
Mimo całej swojej mocy analitycznej ArcGIS nie ma podstawowych manipulacji rastrowych, które można znaleźć w tradycyjnych edytorach graficznych, takich jak GIMP . Oczekuje, że chcesz użyć tego samego zakresu analizy dla rastra wyjściowego, co raster wejściowy, chyba że ręcznie zastąpisz ustawienie środowiska Output Extent . Ponieważ jest to dokładnie to, czego szukasz, a nie ustawienie, przeszkadza ci sposób ArcGIS.
Pomimo moich najlepszych starań i bez uciekania się do programowania, nie mogłem znaleźć sposobu na uzyskanie pożądanego podzbioru obrazu (bez konwersji rastra na wektor, która jest marnotrawstwem obliczeniowym).
Zamiast tego użyłem GIMP do wybrania niebieskiego obszaru za pomocą narzędzia Wybierz według koloru, a następnie odwróciłem zaznaczenie, uderzyłem w Usuń, aby usunąć resztę pikseli, ponownie odwróciłem zaznaczenie, przyciąłem obraz do zaznaczenia, a na koniec wyeksportowałem go z powrotem do PNG. GIMP zapisał go jako 1-bitową głębię obrazu. Wynik jest poniżej:
Oczywiście, ponieważ w twoim obrazie próbnym brakowało komponentu odniesienia przestrzennego, a GIMP nie jest przestrzennie świadomy, obraz wyjściowy jest tak samo użyteczny jak twój przykładowy plik wejściowy. Będziesz musiał georeferencję , aby mogła być użyta w analizie przestrzennej.
źródło
Oto jedna z możliwości korzystania z SAGA GIS: http://permalink.gmane.org/gmane.comp.gis.gdal.devel/33021
Inną możliwością używając tylko narzędzi ArcGIS GP byłoby zbudować TIN korzystając ze swojego rastra Raster Tin , obliczyć jego granica użyciu TIN domeny i Klip swój raster przez granicę (lub koperty przy użyciu Feature Envelope wielokąt ).
źródło