Zliczasz kolejne wartości pikseli dla zestawu rastrów za pomocą ArcGIS Spatial Analyst?

23

Używam ArcGIS 10 z Spatial Analyst.

Mam zestaw rastrów (w sumie 8), które tylko zawierają 1 lub 0 dla każdej komórki. Każdy raster reprezentuje dane z różnych lat. Dla argumentów sake od roku 1 do roku 8.

Mogę dodać wszystkie rastry razem, co da mi ostateczną siatkę z wartościami od 0 do 8. 8 oznacza, że ​​komórka była stale 1 dla zestawu rastrów (wszystkie lata).

Chciałbym znaleźć dla każdej komórki najdłuższą z rzędu liczbę 1.

Na przykład całkowita siatka może rejestrować dla pojedynczej komórki wartość powiedzmy 5, ale w 8 siatkach komórka ma największą kolejną liczbę 1 równą 3. Lub inny sposób wyrażenia tego to przez 3 lata, że ​​komórka była 1 potem zaczęło oscylować między zerami a zerami.

Moje umiejętności przetwarzania rastrowego nie są tak zaawansowane, jak moje umiejętności przetwarzania wektorowego i dobrze przyjrzałem się plikowi pomocy ESRI, ale nie mogę się dowiedzieć, jak można to osiągnąć przy użyciu gotowych narzędzi do geo-przetwarzania?

Jakieś pomysły?

Hornbydd
źródło
1
To właściwie całkiem fajna analiza. Jak zwykle jest więcej niż jeden sposób na zrobienie tego, co próbujesz zrobić. Myślę jednak, że będziesz musiał zrobić programowanie, aby przejść przez wszystkie kombinacje.
MLowry
1
Ogólny komentarz (zainspirowany tą uwagą @MLowry): proszę głosować na pytania, gdy wyglądają interesująco lub są wyraźnie artykułowane. Dobre pytania napędzają wszystko na naszej stronie; zróbmy, co w naszej mocy, aby nagrodzić tych, którzy ich proszą!
whuber

Odpowiedzi:

14

Ponieważ jest to operacja lokalna, zastanówmy się, jak to zrobić dla pojedynczej komórki: Algebra Map zajmie się resztą.

Po pierwsze zauważ, że kolejność rastrów ma oczywiście znaczenie. Dlatego statystyki pojedynczego strzału komórki, takie jak suma komórek, tego nie zrobią.

Gdybyśmy napotkali sekwencję taką jak 01110101 w danej komórce, przetwarzalibyśmy ją od początku do końca i

  1. Zacznij od liczenia od zera.

  2. Zwiększaj liczbę za każdym razem, gdy napotykamy 1.

  3. Zresetuj licznik za każdym razem, gdy napotkamy 0, po zapisaniu ostatniego licznika .

  4. Na koniec weź maksymalną zapisaną liczbę (w tym końcową liczbę).

Krok 1 jest realizowany ze stałą zerową siatką. Kroki 2 i 3 zależą od tego, co napotykamy: jest to zatem operacja warunkowa . Krok 4 wyraźnie stanowi lokalne maksimum. W ten sposób kodowalibyśmy to nieco bardziej formalnie:

count = 0
result = 0
For each value:
    If (value==1):
        count=count+1
    else
        result = max(result, count)
        count=0
result = max(result, count)

Najlepiej zrobić to za pomocą skryptu Python, gdy masz wiele siatek, ale w przypadku ośmiu nie jest uciążliwe rozwijanie pętli i ręczne pisanie kroków. Ujawnia to niewielki problem: result=max(longest,count)jest to rodzaj „efektu ubocznego”, który trudno jest zakodować przy pomocy operacji rastrowych. (Ale można to zrobić, jak pokazano w drugim rozwiązaniu poniżej.) Jest to również nieefektywne, ponieważ dodaje dodatkowe obliczenia na każdym kroku. W związku z tym modyfikujemy nieco podejście, aby odłożyć maxoperację do końca. Będzie to wymagać zapisania osobnej liczby na każdym etapie.

Przechodząc przez ten proces, znalazłem też skrót do pierwszego kroku. Prowadzi to do następującego rozwiązania, które choć trochę długie i wymagające dużo pamięci RAM, jest proste i obejmuje szybko wykonywane kroki:

result1 = "grid1"
result2 = con("grid2"==1, "result1"+1, 0)
result3 = con("grid3"==1, "result2"+1, 0)
result4 = con("grid4"==1, "result3"+1, 0)
result5 = con("grid5"==1, "result4"+1, 0)
result6 = con("grid6"==1, "result5"+1, 0)
result7 = con("grid7"==1, "result6"+1, 0)
result8 = con("grid8"==1, "result7"+1, 0)
CellStatistics(["result1", "result2", "result3", "result4", "result5", "result6", "result7" "result8"], "max")

Rzeczywista składnia różni się w zależności od wersji ArcMap. (Na przykład, CellStatisticsjak sądzę , jest nowością w wersji 10, ale lokalna maksymalna operacja zawsze była dostępna).

W przykładzie z wejściem 01110101 sekwencja siatek „wynik *” będzie zawierać wartości 0, 1, 2, 3, 0, 1, 0, 1, więc na końcu CellStatisticszwróci 3, czyli długość najdłuższego ciągu 1's.

Jeśli brakuje pamięci RAM, rozwiązanie można zmodyfikować w celu ponownego wykorzystania wyników pośrednich, kosztem około dwukrotności czasu wykonania:

result = "grid1"
temp = con("grid2"==1, "result"+1, 0)
result = CellStatistics[["temp", "result"], "max"]
temp = con("grid3"==1, "temp"+1, 0)
result = CellStatistics[["temp", "result"], "max"]
...
temp = con("grid8"==1, "temp"+1, 0)
CellStatistics[["temp", "result"], "max"]

W przykładzie z wejściem 01110101 wartości („temp”, „wynik”) byłyby (NoData, 0) po pierwszym wierszu i po każdej parze operacji („Con”, „CellStatistics”) byłyby to (1 , 1), (2, 2), (3, 3), (0, 3), (1, 3), (0, 3), (1, 3). Jeszcze raz ostateczna wartość to 3.

Regularny wzór wyrażeń Algebry Map w obu rozwiązaniach wskazuje, jak kodować algorytm jako pętlę w skrypcie, zmieniając odpowiednio indeksy przy każdej iteracji.

Whuber
źródło
W bloku kodu może być literówka: liczba = liczba = 1 prawdopodobnie powinna być liczona = liczba + 1
MLowry
1
@ML Dzięki (dobre oczy!): Teraz naprawione. Trudno jest absolutnie poprawić pseudokod; ludzka recenzja to prawdziwy atut w znajdowaniu błędów. Ponadto, chociaż nie testowałem rozwiązań w ArcGIS, zaimplementowałem pierwsze rozwiązanie w języku R, więc mam pewność, że podejście jest prawidłowe.
whuber
1
„whuber” po raz kolejny jesteś tym, który wie! Boże, pomóż reszcie z nas, jeśli kiedykolwiek wpadniesz na autobus! Twoje początkowe podejście do Pythona było kierunkiem, o którym myślałem, ale wiem, że z rastrami często można zrobić wszystko o wiele sprawniej, co udowodniłeś. Jeśli znajdziesz się w Wielkiej Brytanii, to zaszczyt kupić Ci kufel naszego najlepszego piwa płaskiego o temperaturze pokojowej! :)
Hornbydd,
Dzięki, Duncan: ale sprawdź doskonałe rozwiązanie Andy'ego Harfoota!
whuber
14

Rozmawiając o tym i zastanawiając się, czy możesz podejść do problemu, traktując siatki wejściowe jako strumień binarny. Umożliwiłoby to ich połączenie w celu uzyskania unikalnej liczby całkowitej podsumowania dla sekwencji - tj. 01110101 = 117. Wartość tę można następnie przeklasyfikować w celu uzyskania maksymalnej liczby kolejnych 1.

Oto przykład pokazujący jeden ze sposobów łączenia ośmiu siatek:

2*(2*(2*(2*(2*(2*(2*"g8" + "g7") + "g6") + "g5") + "g4") + "g3") + "g2") + "g1"

Operacje bitowe można również wprowadzić do usługi dla tego etapu. Alternatywnie możesz użyć kombinacji, a następnie obliczenia pola. (Obliczenia pola będą miały wyrażenie podobne do poprzedniego).

Stół przekwalifikowanie musi dostarczyć max długości uruchamianie dla wszystkich wartości pomiędzy 00000000B = 0 i 11111111B = 255. W porządku, oto one:

0, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 6, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 6, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8

To podejście jest ograniczone do około 20 siatek w ArcGIS: użycie więcej niż tego może stworzyć nieporęczną tabelę atrybutów. ( Combinejest szczególnie ograniczony do 20 siatek).

Andy Harfoot
źródło
Ogromny +1: To bardzo dobry pomysł. (Jedynym ograniczeniem jest to, że gdy w grę wchodzi więcej niż 31 sieci, zabraknie Ci bitów do wykorzystania.) Pozwoliłem sobie trochę rozwinąć twój pomysł, aby inni mogli zobaczyć, jak łatwo jest go wdrożyć.
whuber
3

Czy zastanawiałeś się nad zmianą wartości z 0 i 1 na wartości o potędze 2 (1,2,4,8,16,32). Po połączeniu 8 siatek otrzymasz unikalne wartości dla każdej komórki, które dadzą ci kolejne informacje (tj. Wartość 3 oznacza rok 1 i 2, gdzie wartość 54 to lata od 6 do 8).

Tylko myśl

Ryan Garnett
źródło
To właśnie sugerował @Andy Harfoot kilka godzin wcześniej, Ryan. :-)
whuber
Dzięki i przepraszam Czytam to na telefonie podczas wakacji.
Ryan Garnett