Piksele po lewej stronie reprezentują lokalizacje drzewa i związane z nimi promienie korony (tj. Wartości pikseli w zakresie od 2 do 5). Chciałbym buforować te piksele rastrowe według ich wartości promienia korony. Obraz po prawej stronie jest tym, co mam nadzieję osiągnąć przy użyciu tylko metod przetwarzania rastrowego .
Początkowo pomyślałbym o zastosowaniu okrągłej sumy ogniskowej w ArcGIS, chociaż ustawienie sąsiedztwa jest stałą wartością, która nie uwzględniałaby promienia korony o zmiennej wielkości.
Jaka jest dobra metoda „buforowania” pikseli według ich wartości?
Odpowiedzi:
Oto czyste rozwiązanie rastrowe w
Python 2.7
użyciunumpy
iscipy
:Wkład:
Wydajność:
źródło
Podejście wektorowe
To zadanie można wykonać w trzech krokach:
Raster To Point
;Buffer
(użycieVALUE
pola jako pola bufora );Feature To Raster
.Uwaga: użycie pola bufora pozwala uniknąć obliczenia bufora dla każdej wartości promienia korony.
Podejście oparte na rastrze
Unikając rozwiązania wektorowego, problem ten sugeruje zastosowanie rodzaju automatów komórkowych opartych na najbliższych sąsiadach. Zakładając, że wszystkie czarne piksele są zerami, piksele są podniesione do kwadratu, a ich rozmiar jest równy 1 (lub, alternatywnie, są odpowiednio skalowane), zasady do przyjęcia są bardzo proste:
VALUE
) jest większa niż 1, jej wartość staje się,VALUE-1
a następnie rozważ otaczające ją piksele. Jeśli ich wartości są mniejsze niżVALUE-1
, piksele te rodzą się lub rosną, a ich wartość staje sięVALUE-1
. W przeciwnym razie piksele te przetrwają i pozostaną niezmienione.VALUE<=1
nic nie rób (piksel nie żyje!).Reguły te muszą być stosowane, dopóki wszystkie piksele nie będą martwe, tzn. Ich wartości będą równe 0 lub 1. Więc
N-1
razy, gdzieN
jest maksymalna wartość, którą masz w rastrze wejściowym. To podejście można dość łatwo zaimplementować za pomocą odrobiny Pythona i numpy.źródło
Inną opcją byłoby utworzenie osobnych rastrów dla każdej wartości piksela, w tym przypadku 4 rastrów, z warunkiem. Następnie rozwiń rastry o liczbę pikseli odpowiadającą wartości rastra (ewentualnie poprzez iterację po liście wartości). Na koniec dołącz do rastrów (algebraicznych lub przestrzennych), aby utworzyć jeden binarny raster koron drzew.
źródło
Jest to trudne pytanie w rastrze, ponieważ nie masz możliwości wykorzystania wartości piksela do zdefiniowania rozmiaru bufora. Dlatego musisz zrobić filtr ogniskowy dla każdej wartości, jak już powiedziałeś.
Oto możliwa odpowiedź, aby to zrobić za pomocą tylko 3 filtrów (nie mogłem znaleźć mniej), ale nie idealnie, jak wspomniał Whuber: twoje bufory zostaną obcięte, gdy drzewa będą blisko siebie.
1) EDYCJA: Alokacja euklidesowa (nie rozwiązuje to całkowicie problemu, ponieważ tnie bufory w pobliżu mniejszych drzew, ale jest lepsza niż artefakty z mojego pierwszego rozwiązania).
2) odległość euklidesowa wokół każdego piksela
3) kalkulator rastrowy (algebra mapy) z instrukcją warunkową
Pamiętaj, że możesz dostosować warunki w zależności od potrzeb w zakresie promienia (z lub bez centralnego piksela)
źródło
Zastanawiasz się, dlaczego nie korzystasz z narzędzia rozwijania ArcGIS ?
W przypadku nakładania się: najnowsze
expand
polecenie obejmie poprzednie.źródło
Jeśli masz pozycję w pikselach, promień i algorytm okręgu punktu środkowego (wariant Bresenham Alg.) Daje ci wskazówkę. IMO łatwo jest stworzyć wielokąt z tego podejścia i myślę, że łatwo jest to zaimplementować w Pythonie. Połączenie tego zestawu wielokątów zapewnia obszar pokrycia.
źródło