Jak utworzyć mapę upałów lub Choropletha, która wykorzystuje wielokąty w QGis?

12

Bawiłem się wtyczką Heatmap dla QGIS i zastanawiam się, czy można zrobić Heatmap za pomocą podobnej wtyczki / narzędzia, które używa wielokątów, a także punktów?

Chciałbym uzyskać reprezentację gęstości danych w taki sam sposób, jak wtyczka heatmap robi z punktami.

Poniższy obraz jest przybliżonym szkicem mojego pożądanego rezultatu:

wprowadź opis zdjęcia tutaj

NWT Adam
źródło
3
Czy zastanawiałeś się nad wygenerowaniem centroidów dla swoich wielokątów i zbudowaniem z nich mapy cieplnej?
andytilia,
1
Przydałoby się więcej szczegółów na temat twoich danych. Co reprezentują wielokąty i jak są rozmieszczone? Czy możesz opublikować przykładowe zdjęcie?
andytilia,
@andytilia: Centroidy nie odzwierciedlają dokładnie zasięgu wielokątów. Wieloboki reprezentują wykorzystanie zasobów w obszarze 1200 m2. Niektóre wielokąty są małe, co stanowi dobrą plamę jagodową, a inne są ogromne, pokrywając siedliska karibu i łosia. Zastanawiałem się nad binowaniem heksagonalnej siatki, a następnie liczeniem nakładania się ... ale jestem raczej noobem, więc nie znalazłem dobrego samouczka, który mógłbym zrozumieć na ten temat.
NWT Adam
1
zobacz wtyczkę QGIS heatmap qgis.spatialthoughts.com/2012/07/...
rkm
Czy wartości liczbowe mają dla Ciebie jakieś znaczenie, czy szukasz ładnej / przejrzystej wizualizacji?
podmrok

Odpowiedzi:

5

Może możesz wygenerować zestaw losowych punktów w swoich wielokątach, istnieje na to narzędzie QGIS ? Jeśli masz zachodzące na siebie wielokąty, masz ich większą gęstość w tym obszarze. Następnie użyj punktów Heatmap dla punktów. Musisz znaleźć kilka rund, aby znaleźć optymalną liczbę punktów, ponieważ wynik zależy od tego.

Jeśli twoje dane pokazują rozmieszczenie niektórych siedlisk, które i tak jest rozmyte, może to być najbliższe rzeczywistej sytuacji, w której jeden punkt odzwierciedla w przybliżeniu jeden okaz.

JaakL
źródło
1
+1 Świetny pomysł. Jedyne, co chciałbym dodać, to dołączyć do lokalizacji z danymi punktów i sześciokątnymi polami, pozbyć się niepasujących elementów, a następnie wygenerować w nich punkty, aby twoje pojedyncze punkty nie utonęły wśród wszystkich innych punktów.
RomaH
To wydaje się dawać najlepiej wyglądający wynik. Dziękujemy wszystkim osobom, które oferowały rozwiązania. Czuję się źle, przyznając nagrodę tylko jednej osobie, ponieważ wydaje się, że istnieje wiele dobrych rozwiązań!
NWT Adam
6

Jeśli dobrze rozumiem twoje pytanie, zrobiłem wcześniej coś podobnego; musiałem tylko pamiętać, co zrobiłem.

Działa to, jeśli twoje polisy zachodzą na siebie ORAZ nie na tej samej warstwie. Jeśli znajdują się na tej samej warstwie i jest to możliwe, przenieś je na osobne warstwy, jeśli nie, warstwa docelowa odziedziczy jedną z wartości.

Kluczowym procesem do zastosowania jest połączenie atrybutów według lokalizacji w menu Wektor> Zarządzanie danymi . Tutaj określ pole heksagonalne jako warstwę docelową, a warstwę łączenia jako jeden z twoich wielokątów. Nazwij powstałą warstwę i zaznacz przycisk opcji Zachowaj wszystkie rekordy .

Powstała warstwa powinna być kopią twojej heksagonalnej warstwy ze wszystkimi komórkami, które przecięły twoją warstwę wielokąta. Teraz do interakcji użyj ostatniej wynikowej warstwy jako warstwy docelowej i dołącz do następnej warstwy wielokąta. Weź powstały lasyer i dołącz do następnej warstwy, aż dołączysz do wszystkich warstw.

Ostatnia warstwa powinna odziedziczyć wszystkie pola atrybutów poprzednich warstw, a znaczna część z nich może mieć wartość NULL.

Tutaj musimy zagrać w niektóre wnętrzności pliku kształtu, więc jeśli nie zapisałeś warstwy jako pliku kształtu, zrób to teraz. I usuń warstwę z obszaru roboczego w QGIS.

Otwórz pliki * .dbf pliku shapefile w OpenOffice Calc, NIE używaj programu Excel. Zniszczy plik i będzie bezużyteczny, nauczyłem się tego na własnej skórze. Nie zmieniaj kolejności danych, jest to również bardzo określone w kolejności wierszy w pliku. Sprawdź, czy NULL są teraz zerami, jeśli nie są, wymień je ostrożnie.

Teraz włóż plik kształtu do QGIS i otwórz tabelę atrybutów . Powinien teraz pokazywać zera zamiast NULL. Skorzystaj z Kalkulatora pola i zsumuj pola, które są dostosowane do pracy w nowej kolumnie.

Teraz masz pole sumowane, które powinno pokazywać z pewnym stopniem dokładności wartości wszystkich kolekcji obiektów pokrywających się z polem docelowym. Możesz użyć funkcji Symbology, aby pokolorować swoje wielokąty w oparciu o wartość zsumowanego pola dla ładnej mapy choropleth.

Jeśli chcesz pozbyć się wszystkich nieużywanych pól w pliku. Po prostu otwórz plik dbf ponownie w Calc i usuń niechciane kolumny do woli. Osobiście radziłbym, aby nauczyć się, jak w ten sposób wygodnie tworzyć plik kształtu, ponieważ często to robię.

RomaH
źródło
Niestety na tej samej warstwie nakładają się setki wielokątów. Czy potrafisz to obejść bez rozdzielenia ich na kilkaset warstw?
NWT Adam
1
Możesz utworzyć nakładkę wielokąta za pomocą PostGIS (jeśli go używasz), która rozbija nakładające się na siebie polisy. gis.stackexchange.com/questions/83/... Być może ktoś z lepszym SQL-fu może nam tutaj pomóc i jak uzyskać wynikowe polisy do dziedziczenia swoich wartości, nie jestem w tym zbyt dobry.
RomaH
1
Inną opcją, którą zdecydowanie zalecam, jest może czas ponownie przemyśleć swoje dokładne podejście do problemu. Jakie dane próbujesz zmapować? Czy istnieje powód, by zakładać, że wartość byłaby jednorodna w wielokątach? Czy nakładający się wielokąt rzeczywiście miałby efekt kumulacyjny? Chyba że masz dobre dowody, aby zasugerować te rzeczy, użycie tej mapy do dowolnego rodzaju modelowania predykcyjnego może być niepewne. Zastanów się dobrze, możesz mieć właściwe rozwiązanie, ale możesz znaleźć lepszy sposób na jego modelowanie lub mapowanie.
RomaH,
1
Dzięki za sugestię PostGIS. Rzucę na to okiem, ale dopiero się uczę, jak korzystać z PostGIS. Co do ponownej oceny pytania ... Rozumiem, co masz na myśli, ale nie jestem pewien, jak inaczej wyobrażę sobie to, co próbujemy wyrazić. Nasze dane reprezentują wszystkie obszary, które starsi społeczności i użytkownicy zasobów odwzorowują jako produktywne lub ważne z kulturowego punktu widzenia. Rozumiemy, że mapa wartości nie jest jednorodna w całym wielokącie, ale jest wystarczająco blisko punktu, który chcemy wyrazić za pomocą mapy.
NWT Adam,
1
Kciuk w dół do jakiejkolwiek instrukcji w qgis - szczególnie, gdy zaczniesz radzić sobie z // tonami // plików kształtów, możesz skończyć w naprawdę frustrującej pozycji. Nie pożałujesz używania SQL-fu, czy to z wtyczką postGIS, czy wtyczką GRASS (zobacz moją odpowiedź poniżej: gis.stackexchange.com/a/42188/7689 ).
egbutter
4

Jest to ogólny przepływ pracy przy użyciu rastrów. Nie znam szczegółów, aby to osiągnąć w QGIS.

  1. Użyj narzędzia przecięcia, aby utworzyć nową warstwę wektorową pokrywających się obszarów wielokąta
  2. Konwertuj warstwy wektorowe, w tym warstwę nakładającą się, na rastry
  3. Użyj arytmetyki rastrowej (prawdopodobnie dodanej), aby połączyć rastry
  4. Wynikiem powinien być raster wyglądający jak mapa termiczna

Wartości alfa / null i / lub przezroczystość warstwy pozwolą na nałożenie rastra na dowolną mapę bazową.


źródło
Po przejściu przez ten proces pracy zostaje mi duży szary blok pokrywający zasięg nowego rastra. Jak sprawić, by wyglądało to jak mapa cieplna?
NWT Adam,
1
Czy w końcowym rastrze są przypisane różne wartości? Kilka przemyśleń: Podczas tworzenia rastrów może być konieczne określenie lepszej rozdzielczości (więcej pikseli); rastry powinny być tego samego rozmiaru i rozdzielczości; konieczne może być rozciągnięcie lub zmodyfikowanie wynikowej mapy kolorów rastra, aby wyświetlać jaśniejsze kolory dla większych wartości.
Ok mam skonfigurowaną mapę kolorów, ale dostaję tylko dwa kolory: niebieski (wartość 0) i czerwony (2), czerwona wartość pokrywa obszar moich oryginalnych warstw wektorowych i moją warstwę nakładającą się. Domyślam się, że każda warstwa otrzymała wartość 1 zamiast każdego wielokąta, gdy zostały zrasteryzowane. Następnie, gdy dodano rastry, łączna wartość wyniosła 2. Jak uzyskać wartości, które należy zachować / dodać na poziomie wielokąta, a nie na poziomie warstwy?
NWT Adam,
raster o lepszej rozdzielczości powinien pomóc
Jak zrobić raster o lepszej rozdzielczości?
NWT Adam,
4

Wypróbuj to zamiast tego, jeśli pasuje do twoich wymagań, nie jest to rozwiązanie obliczeniowe dla zestawu danych, ale jeśli szukasz po prostu rozwiązania infograficznego, możesz spróbować zamiast tego.

Połącz atrybuty według lokalizacji, z heaksgonalnymi komórkami jako celem, a danymi punktów jako złączeniem. Wybierz, aby zachować wszystkie funkcje. Ustaw symbol na komórki z odziedziczoną wartością na pożądany kolor i ustaw przezroczystość na około 50%.

Następnie na warstwie z polami koła ustaw ich symbolikę na ten sam kolor i przezroczystość. Umieść kółko poli przed ogniwem poli. To da iluzję zwiększonego nasycenia wraz ze wzrostem wartości.

Jeśli chcesz, możesz również wyodrębnić linie wszystkich polis i nakładkę na górze, aby kontury podwarstwy nie były pokolorowane przez inne warstwy.

Będziesz musiał bawić się kolorami i przezroczystością, aby znaleźć najlepsze rozwiązanie. Uważam, że te same kolory wyglądają najlepiej, ale eksperymentują.

RomaH
źródło
4

Sugeruję użycie wtyczki GRASS - QGIS ma dość ograniczoną funkcjonalność (i po co wymyślać koło w pythonie, skoro oprogramowanie takie jak GRASS już istnieje?):

v.in.ogr.qgis

[następne dwa wiersze mogą być konieczne, w zależności od tego, czy wielokąty mają już wartość]

v.db.addcol 
v.db.update_const 

w tym miejscu sumujemy nakładanie się wielokątów, a następnie tworzymy raster na podstawie tych kolumn

v.to.db ... qcolumns=sum(col_with_polygon_value)
v.to.rast.attr

v.out.ogr [r.out.ogr]
egbutter
źródło
3

W zwykłym QGIS może to być trudne, możesz potrzebować niestandardowego skryptu lub użyć przestrzennej bazy danych, takiej jak PostGIS lub Spatialite. Chciałbym utworzyć regularną siatkę punktów za pomocą PostGIS lub wygenerować jako plik tekstowy CSV i zaimportować to. Następnie narysuj okrąg wokół każdego punktu za pomocą st_buffer lub prostokątów za pomocą ST_MakeEnvelope i policz wszystkie nakładające się obszary każdego bufora. Następnie prawdopodobnie chcesz usunąć wszystkie wartości 0, jeśli oznacza to „brak danych”. Na koniec możesz wykonać mapę cieplną dla siatki, używając licznika jako pola Ciężar.

Musisz eksperymentować z różnymi rozdzielczościami siatki, aby znaleźć optymalną. Zasadniczo jest bardzo podobny do podejścia rastrowego sugerowanego przez Kevina, po prostu pozostając w świecie wektorowym.

JaakL
źródło