Jak obliczyć statystyki rastrowe dla wielokątów?

14

jak mogę obliczyć sumy, średnie itp. punktów rastrowych (wielopasmowych) na wielokąt warstwy wektorowej. Powiedziano mi, że nazywa się to „statystykami strefowymi”. Najpierw spróbowałem tego z QGIS.

Jest na to sposób, ale jest to zbyt powolne (konwersja rastra na wektor, przecięcie z drugą warstwą wektorową, obliczanie geometrii, eksportowanie liczb, obliczanie statystyk za pomocą arkusza kalkulacyjnego lub innego programu, ponowne importowanie wyników, trwa wieczność dla mojego 350 000 punktów rastrowych).

Dano mi również podpowiedź do użycia saga-gis. Ma to „statystyki strefowe”, ale te oparte są na kategoriach z pasma rastrowego, a nie na wielokątach z warstwy wektorowej. Aby go użyć, musiałbym przekonwertować warstwę wektorową na raster, a następnie obliczyć statystyki.

To wydaje się niewłaściwy sposób na rozwiązanie tego. Nie byłoby sposobu, aby uwzględnić punkty rastrowe, które należą do 2 lub więcej wielokątów, ponieważ są one przecinane przez granicę wielokąta. Zakładam, że statystyki oparte na wielokącie powinny być w stanie sobie z tym poradzić, więc zakładam również, że nie znalazłem jeszcze odpowiedniego modułu.

Saga-gis ma naprawdę wiele modułów. Daj mi znać, który z nich jest odpowiedni dla tej aplikacji.

stn
źródło
Próbuję rozwiązania Rudivonstaden, a po wpisaniu dwóch ostatnich poleceń pojawiają się następujące komunikaty o błędach: >>> zonalstats = qgis.analysis.QgsZonalStatistics (vectorlayer, rasterfile) Traceback (ostatnie połączenie ostatnio): Plik „<input>” , wiersz 1, w <module> AttributeError: obiekt „module” nie ma atrybutu „analiza” >>> zonalstats.calculateStatistics (Brak) Traceback (ostatnie wywołanie ostatnio): Plik „<input>”, wiersz 1, w <module > NameError: nazwa „zonalstats” nie jest zdefiniowana Zastanawiam się, czy polecenia są prawidłowe, czy też plik rastrowy, którego używam, ma odpowiedni format? Dzięki!
Dan Wolf
Cześć Dan. Stackexchange działa nieco inaczej niż forum. Celem jest interakcja typu pytania i odpowiedź, a nie ciągła dyskusja. Jeśli odpowiedzi na pierwotne pytanie nie wyjaśniają tego, co musisz wiedzieć, powinieneś albo poprosić o wyjaśnienia w sekcji komentarzy, albo rozważyć zadanie nowego pytania.
Jay Guarneri
Dziękuję za komentarz, Dan. W mojej odpowiedzi brakowało niezbędnej instrukcji importu, którą należy teraz naprawić.
rudivonstaden

Odpowiedzi:

22

Próbowałem zrobić dokładnie to samo, ale z różnych powodów jestem zdecydowany korzystać z QGIS. Próbowałem użyć v.rast.stats przy użyciu wtyczki GRASS, a także wtyczki Sextante. To drugie podejście zawiodło, ponieważ wydaje się, że dołącza statystyki do tymczasowej warstwy wektorowej, którą następnie usuwa. Wtyczka GRASS działała, ale nie radzi sobie z nakładającymi się wielokątami.

Po kilku kopaniach (w źródle obiecująco brzmiącej wtyczki ZonalStats) odkryłem, że QGIS ma wbudowane w API metody statystyki strefowej, które również mają powiązania Pythona. Tak długo, jak tylko szukasz count, suma meanstatystyki dla swoich funkcji wielokąta, Python Console (Plugins> Python Console) jest obecnie najprostszym sposobem, aby dołączyć statystyk do tabeli atrybutów wielokąt.

  1. Wybierz warstwę rastrową w Spisie treści i wpisz następujące polecenie w konsoli (pobierze nazwę pliku źródłowego warstwy rastrowej)

    >>> rasterfile = qgis.utils.iface.mapCanvas().currentLayer().source()

  2. Wybierz warstwę wektorową i wykonaj następujące polecenie w konsoli (pobierze ona samą warstwę wektorową)

    >>> vectorlayer = qgis.utils.iface.mapCanvas().currentLayer()

  3. Wykonaj następujące trzy polecenia w konsoli (przekazują warstwę wektorową i plik rastrowy do wbudowanego kalkulatora statystyk strefowych QGIS)

    >>> import qgis.analysis

    >>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)

    >>> zonalstats.calculateStatistics(None)

Wyniki zostaną dołączone jako dodatkowe pola w warstwie wielokąta.

Statystyka strefowa

Zauważ, że jeśli chcesz dołączyć prefiks do nowych pól (zamiast mieć je tylko jako sumę, średnią i liczbę), zastąpisz pierwsze polecenie w kroku 3 następującym (zakładając, że chcesz użyć „zonal_” jako prefiks:

>>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile,"zonal_")
rudivonstaden
źródło
1
+1 qgis.analysis.QgsZonalStatistics ()
Aaron
W QGIS znajduje się wtyczka Zonal Statistics, więc prawdopodobnie nie musisz samodzielnie wykonywać wymienionych poleceń: docs.qgis.org/2.2/en/docs/user_manual/plugins/… Zastanawiam się, dlaczego nie ma możliwości obliczenia maksimum i minimum wartości również.
matandked
Użyłem twojej techniki, ale usuwa ona wielokąty :(
niahoo 14.04.16
6

W końcu znalazłem: W Saga-GIS otwórz kategorię-wielokąty i siatkę danych, a następnie kształty-> siatka-> wartość siatki-> statystyki siatki dla wielokątów

stn
źródło
3

Możesz to zrobić dość łatwo za pomocą PostGIS. Zobacz ten samouczek: http://trac.osgeo.org/postgis/wiki/WKTRasterTutorial01

Pierre Racine
źródło
THX za pomysł. Miałem nadzieję, że uda mi się to zrobić bez dodawania i uczenia się kolejnego oprogramowania. Będę jednak pamiętać o PostGIS na później.
stn
3

Wydaje się, że ten problem został rozwiązany już jakiś czas temu, ale i tak dodam łyżkę do zupy, ponieważ ostatnio sam potrzebowałem statystyk rastrowych.

Metodologia QGIS opisana przez rudivonstaden działała jak urok, dzięki za wskazówkę. Jednak w moim przypadku chciałem również znać wartości min i max oraz std dla wartości rastrowych w moich wielokątach i tej funkcji nie mogłem znaleźć w QGIS. Znalazłem rozwiązanie dzięki funkcji isectpolyrst w GME , która jest moją ulubioną do rozwiązywania problemów z GIS. Ta funkcja dała mi tylko statystyki, których potrzebowałem i dość szybko.

PS. GME ma trochę niefortunnej zależności (ArcGIS). Nawet jeśli sam program jest ogólnie dostępny dla wszystkich, potrzebujesz ArcGIS, aby go uruchomić. Ale jeśli masz ArcGIS (dowolny poziom licencji), zalecamy wypróbowanie go.

EDYTOWAĆ:

Dostałem statystyki, które chciałem, ale później dowiedziałem się, że do pochopnych wniosków wyciągnąłem nieco po spojrzeniu na rzeczywiste liczby. Otrzymujesz statystyki, ale tylko dla pierwszego zespołu w rastrze. Więc jeśli operujesz z 3-pasmowym obrazem rastrowym, statystyki są niekompletne. Powinienem był wskazać liczbę kanałów w moim oryginalnym poście. Najlepiej używać SAGA-GIS jak stn zaproponowany powyżej, jeśli pracujesz z wielopasmowymi obrazami rastrowymi.

GISinHelsinki
źródło
3
zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)
zonalstats.calculateStatistics(None)

domyślnie oblicza tylko liczbę, sumę i średnią (jak można stwierdzić Raster -> Zonal Statisticsw QGIS Desktop, może zrobić znacznie więcej).

Jeśli na przykład chcesz obliczyć tylko średnią, której musisz użyć:

zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer, rasterfile, QgsZonalStatistics.Mean)
zonalstats.calculateStatistics(None)

zobacz API dla wszystkich opcji.

Fitzroy Hogsflesh
źródło