Jaki jest najlepszy sposób na stworzenie mapy gęstości z punktów ważonych w QGIS?

18

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:

Gęstość dzikiej fauny i flory w parku narodowym Kafue z 5 x 5 km komórkami siatki i gęstością jądra w promieniu 7,5 km

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
Simbamangu
źródło
Czy możesz opisać swoje dane wejściowe bardziej? Może v.surf.rst byłoby bardziej odpowiednie niż v.kernel grass.osgeo.org/gdp/html_grass64/v.surf.rst.html . Czy masz jedną wartość zliczenia na komórkę siatki pokazaną powyżej?
podmrok
@underdark - Dodano kilka przykładowych danych. Są to dane punktowe z zliczeniami (liczba widocznych słoni) i może istnieć więcej niż jedna obserwacja na komórkę siatki. Zwykle w ArcGIS „liczba” stałaby się polem „populacji” narzędzia do zagęszczania jądra.
Simbamangu,
Im więcej o tym myślę, tym mniej wierzę, że v.kernel jest dobrym wyborem dla twojego przypadku użycia. Czy sprawdziłeś literaturę? Może najpierw zadaj pytanie, która metoda jest odpowiednia w tym przypadku.
podmrok
moim głównym pytaniem jest, jak powtórzyć funkcjonalność gęstości jądra z Arcview, która jest znaną metodą. Masz rację, v.kernel prawie na pewno nie jest odpowiednim narzędziem do tego!
Simbamangu,
@ w mroku, dzięki - rozszerzyłem nieco pytanie, które może pomóc; v.surf.rst wydaje się odpowiedni, ale może skorzystać z pewnych wskazówek na temat jego używania.
Simbamangu,

Odpowiedzi:

8

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=boxopcji dla „prostego” rastra i użyj filter=gaussopcji dla drugiego jądra ArcGIS. Użyj -nflagi, 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).

Whuber
źródło
Wydaje mi się, że nie mam r.resamp.filter w moim zestawie narzędzi GRASS (w OS X, GRASS 6.4). Jednak - dopóki o tym nie wspomniałeś, nie zdawałem sobie sprawy, że „mapy cieplne” to to samo, co KD; Zakładałem, że interpolują całą powierzchnię. Czy narzędzie Raster | Heatmap w QGIS wykonuje KD? Co to jest „współczynnik rozpadu”?
Simbamangu,
Sądzę, że termin „mapa cieplna” został ponownie wybrany w GIS z jego pierwotnego znaczenia na taki, który odnosi się ogólnie i niejasno do prawie każdej mapy podobnej do rastra. Wątpię, czy jakikolwiek GIS oferuje funkcjonalność pasującą do pierwotnego znaczenia.
whuber
Po zbadaniu narzędzie mapy cieplnej w QGIS robi coś podobnego do KD w łuku, jeśli ustawisz współczynnik rozpadu na 0 (zwężając gęstość do 0 na krawędziach promienia). Wydaje się, że istnieją pewne różnice: obliczone wartości komórek 25 x wyższe (promień 5 km / 2,5 km komórek), podobnie jak sposób, w jaki funkcja jest stosowana do komórek - Arc wydaje się używać promienia wokół rzeczywistego punktu, podczas gdy QGIS wybiera nakładającą się komórkę i zwęża się od tego momentu.
Simbamangu,
2
„Mapa cieplna” w powszechnym użyciu wydaje się oznaczać wiele rzeczy - rozglądając się, widzę, że jest stosowana do interpolowanych powierzchni, gęstości jądra i prostego kolorowania nie wygładzonych pikseli. Ciekawy artykuł na temat oryginalnego użycia / historii - i wydaje się, że być może powinniśmy używać bardziej precyzyjnych terminów w znakowaniu narzędzi QGIS.
Simbamangu,
3
@Simbamangu r.resamp.filter jest nowy w trawie 7 , ale nie ma co miesiąc migawka dla OS X . Ponadto narzędzie do mapowania ciepła nie wydaje się być wyborem dla algorytmu rozkładu gęstości, więc myślę, że nie jest dokładnie równoważne z gęstością jądra lub r.resamp.filter.
Torsti,
3

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!

Vladimir
źródło
Chciałbym użyć SAGA, ale pracuję w OSX 10.7 i jeszcze go nie zbudowałem (nie ma plików binarnych dla OSX); Spędziłem ostatnio godziny próbując więcej niż jednej metody kompilacji, ale kompilacje zawsze kończą się niepowodzeniem.
Simbamangu,
Musisz raczej zadać pytanie o kompilację SAGA na OSX 10.7. Według mnie SAGA to jedyna rozsądna alternatywa dla narzędzia ArcGIS KD.
Vladimir
3

Naprawdę uproszczona metoda z GRASS GIS, która jest bliższa punktowej gęstości w ArcMap niż gęstość jądra:

  1. Zaimportuj punkty do mapy rastrowej za r.in.xyzpomocą metody = suma w określonej rozdzielczości rastrowej (ustawionej za pomocą g.region).

  2. Użyj, r.neighborsaby 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!)

Torsti
źródło
v.in.xyzi v.neighborsmoże również działać. Jednak instrukcja nie określa, w jaki sposób ustawić, który atrybut jest używany v.neighbors.
Torsti,
2

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

„... Wysokie napięcie” zwiększa odległości między punktami ”i zmniejsza zasięg uderzenia każdego punktu, niskie napięcie„ zmniejsza odległość ”, a punkty wpływają na siebie w większym zakresie).”

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

wprowadź opis zdjęcia tutaj

myśli przestrzenne
źródło
1
Dzięki za to - dużo łatwiejsze do zrozumienia niż strona pomocy. Jak zauważono powyżej przez @whuber, interpolacja nie jest jednak właściwą metodą dla tego rodzaju danych próbki punktowej.
Simbamangu,
2

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ć.

Alex Leith
źródło
1

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:

mapa cieplna z biblioteką Java OpenCarto

Można zmienić siłę wygładzania i paletę kolorów.

Julien
źródło