Naprawdę chciałbym powtórzyć funkcjonalność narzędzia ArcGIS Kernel Density - jak to zrobić?
Chciałbym ograniczyć odpowiedzi do łatwego do zainstalowania bezpłatnego oprogramowania typu open-source - tzn. QGIS łatwo instaluje się z GRASS na wszystkich platformach, więc QGIS + GRASS byłby w porządku, ale SAGA nie (niestety, ponieważ ma to, co może być idealnym narzędziem).
Staram się tworzyć mapy zagęszczenia dzikiej przyrody na obszarach chronionych w QGIS. Mapę gęstości w poniższym przykładzie opracowano w ArcGIS na podstawie punktowych obserwacji dzikiej przyrody, przy użyciu surowych zliczeń wielkości grupy (pola w pliku wektorowym) zastosowanych do ważenia gęstości każdej komórki siatki w narzędziu Gęstość jądra (SpatialAnalyst), z wybrany promień wyszukiwania i rozmiar komórki siatki:
W poprzednim pytaniu dotyczącym gęstości sugerowano użycie narzędzia GRASS v.kernel do naśladowania narzędzia ArcGIS Kernel Density, ale wersja v.kernel nie wykonuje tej samej pracy . Po spojrzeniu na instrukcję i (pomyślnym) stworzeniu mapy gęstości wydaje się, że funkcja v.kernel działa tylko z gęstością punktów i nie ma możliwości podania zmiennej dla każdego punktu (np. Liczby surowe) w celu ważenia każdego punktu .
AKTUALIZACJA
Wydaje się, że *.surf.*
w GRASS są różne narzędzia, które mogą pomóc w tworzeniu powierzchni gęstości - i one akceptują kolumnę ważącą lub wartość Z lub są wykonywane na rastrach. @underdark zasugerował v.surf.rst - a „zcolumn” byłaby moją zmienną ważącą (zliczającą) - ale nie mogę wymyślić, jak poprosić narzędzie o utworzenie określonego rozmiaru siatki lub użycie określonego promienia.
Sugestie dotyczące korzystania z v.surf.rst lub innej metody?
Przykładowe dane
x,y,count
431250,8707500,0
418750,8707500,5
413750,8707500,3
411250,8707500,1
408750,8685000,0
411250,8685000,0
416250,8685000,0
416250,8682500,6
411250,8682500,3
418750,8680000,0
433750,8677500,3
421250,8677500,0
423750,8675000,1
431250,8672500,0
428750,8672500,2
426250,8672500,2
423750,8670000,0
Odpowiedzi:
Według strony podręcznika polecenie GRASS r.resamp.filter zrobi dla rastrów reprezentujących dane punktowe dokładnie to, co ArcGIS zrobi dla warstw punktowych : użyj
filter=box
opcji dla „prostego” rastra i użyjfilter=gauss
opcji dla drugiego jądra ArcGIS. Użyj-n
flagi, aby uniknąć propagowania wartości zerowych.Zauważ, że szacunki gęstości jądra (znane również jako „mapy cieplne”) nie są interpolacjami danych. Wartość KDE w lokalizacji x szacuje wielkość wartości „ Z ” na jednostkę powierzchni w pobliżu x . (Promień lub „szerokość pasma” określa ilościowo, co oznacza „blisko”). Wartości Z nie trzeba definiować w każdym możliwym miejscu na mapie. Na przykład Z może oznaczać obecność czegoś takiego jak osoba, w którym to przypadku KDE zapewnia gęstość zaludnienia . Wartości Z nie muszą się zmieniać w sposób ciągły na mapie. Do interpolacji przyjmuje się, że Zjest zdefiniowany we wszystkich lokalizacjach, a dane są obserwacjami wartości Z w określonych punktach. Interpolator próbuje przewidzieć nieobserwowane wartości Z we wszystkich innych punktach. Ma to sens, gdy Z jest, powiedzmy, temperaturą lub ciśnieniem, ale zwykle jest nonsensowne, gdy Z rejestruje obecność czegoś lub gdy dane są kompletnym spisem powszechnym. (W tym drugim przypadku zastanów się, co może oznaczać mapa zagęszczenia dróg dla regionu i jak można sensownie „interpolować” drogi w obszarach innych niż drogi).
źródło
Moduł SAGA „Szacowanie gęstości jądra” jest tym, czego szukasz.
Zainstaluj interfejs modułu SAGA w QGIS (w menu: Wtyczki -> Pobierz wtyczki Pythona ...) i użyj modułu. Powodzenia!
źródło
Naprawdę uproszczona metoda z GRASS GIS, która jest bliższa punktowej gęstości w ArcMap niż gęstość jądra:
Zaimportuj punkty do mapy rastrowej za
r.in.xyz
pomocą metody = suma w określonej rozdzielczości rastrowej (ustawionej za pomocąg.region
).Użyj,
r.neighbors
aby wygładzić mapę metodą = średnia (która jest domyślna) i użyj rozmiaru opcji, aby ustawić promień wyszukiwania.(W tej chwili nie mam dostępu do GRASS, więc nie próbowałem tego!)
źródło
v.in.xyz
iv.neighbors
może również działać. Jednak instrukcja nie określa, w jaki sposób ustawić, który atrybut jest używanyv.neighbors
.Ponieważ poprosiłeś o więcej wskazówek na v.surf.rst, oto moje dane wejściowe
Po pierwsze, o rozmiarze siatki - możesz użyć wtyczki -> GRASS -> Edytuj bieżący region GRASS i ustawić rozdzielczość wyjściową. Twoje wyjście z v.surf.rst będzie miało tę rozdzielczość.
W przypadku promienia „napięcie” wydaje się parametrem. Nie jestem ekspertem od tego algorytmu, ale czytając instrukcję, wydaje się, że jest to odpowiedni bit
Możesz więc użyć parametru naprężenia mniej więcej tak, jak parametru promienia.
Z danych przykładowych wynik v.surf.rst wygląda jak poniżej i wydaje się rozsądny, biorąc pod uwagę, że wykorzystuje on liczby jako wagi do interpolacji
źródło
Chociaż go nie testowałem, w repozytorium QGIS Contributors znajduje się wtyczka o nazwie „Szacowanie zasięgu domowego z R”. Obejmuje to obliczenia jądra (gęstość?). Uważam, że jeśli to zadziała, byłaby to najlepsza metoda. R wykona prawdziwą statystyczną metodę obliczania gęstości jądra.
Jeśli masz zainstalowany R, powinieneś być w stanie po prostu zainstalować wtyczkę i spróbować.
źródło
Jeśli akceptujesz trochę programowania Java poza qgis, możesz po prostu użyć tej biblioteki konstruktora map gęstości .
Za pomocą konstruktora
HeatMapBuilder(int w, int h, int[][] pts, int[] weights)
można przypisać wagę każdemu punktowi zgodnie z potrzebami. Obraz wyjściowy można pobraćgetImage()
metodą i zapisać na dysku za pomocąImageIO.write("mymap.png")
.Oto przykład wyniku:
Można zmienić siłę wygładzania i paletę kolorów.
źródło