Korzystasz z wtyczki QGIS Zonal Stats z konsoli Python?

9

Korzystam z wtyczki Zonal Stats w QGIS, aby wyodrębnić statystyki rastrowe z nakładających się wielokątów (mam pliki kształtowe rozmieszczenia gatunków i chcę wyodrębnić dane środowiskowe z zakresu każdego gatunku). Mam około 300 plików, z których muszę uzyskać dane, dlatego chciałbym napisać skrypt do uruchomienia w konsoli Pythona, ale jestem kompletnym nowicjuszem z pythonem i nie mam pojęcia, jak to zrobić.

Tomasz
źródło
Czad - tak, to podobne pytanie, ale bardziej szczegółowe. Nikt nie odpowiedział na inne pytanie, zamiast tego zasugerował inne sposoby rozwiązania problemu. Nie wiem, jak usunąć drugi post
Thomas
W drugim pytaniu wskazałem ci skrypt r zdolny do tego, czego chcesz, a Sylvester Sneekly nazwał cię dokładną metodą w pythonie. Jeśli nie jesteś przyzwyczajony do kodowania w Pythonie lub r, wszystkie dalsze wskazówki ci nie pomogą. Potrzebujesz samokodującego skryptu lub wielu kliknięć myszką. Naucz się kodowania, wypróbuj przykłady i zgłoś się, jeśli coś nie działa.
Curlew,
@ Curlew - metoda Sylwestra, choć brzmi bardzo dobrze, reprezentuje dla mnie ogromną krzywą uczenia się i na razie nie mam na to czasu. Doceniam pomoc Sylvester, ale nie była to prosta odpowiedź, której szukałem. Chyba miałem większość kodu, którego szukałem w poście, o którym wspomniałem w innym pytaniu ( gis.stackexchange.com/questions/23203/… ). Jeśli metoda Sylwestra jest jedynym sposobem na zrobienie tego w pythonie, być może nie doceniłem, jak trudne byłoby to.
Thomas
@ Curlew - Twój skrypt R rzeczywiście działa, dziękuję. Jedyną rzeczą, którą jeszcze opracowałem, jest sposób dołączenia wyników zwróconych w R do pliku .dbf dla moich plików kształtów (każda pomoc w tym przypadku byłaby bardzo wdzięczna).
Thomas

Odpowiedzi:

13

Poniższy kod działał dla mnie QGis 1.8.0

Możesz to zmienić, aby pomieścić wiele plików z pewną pętlą.

from qgis.analysis import QgsZonalStatistics

#specify polygon shapefile vector
polygonLayer = QgsVectorLayer('F:/temp/zonalstat/zonePoly.shp', 'zonepolygons', "ogr") 

# specify raster filename
rasterFilePath = 'F:/temp/zonalstat/raster1.tif'

# usage - QgsZonalStatistics (QgsVectorLayer *polygonLayer, const QString &rasterFile, const QString &attributePrefix="", int rasterBand=1)
zoneStat = QgsZonalStatistics (polygonLayer, rasterFilePath, 'pre-', 1)
zoneStat.calculateStatistics(None)
vinayan
źródło
Świetny. Dziękuję bardzo vinayan, właśnie tego szukałem.
Thomas
Zobacz także tutaj alternatywne rozwiązanie wykorzystujące R
Thomas
cieszę się, że ci pomogło!
vinayan
@vinayan QProgressDialog jest przydatny w środowiskach wizualnych, w których chcesz sprawdzić, jak daleko posunęły się obliczenia. Nie ma zastosowania z wiersza poleceń. Możesz użyć Nonejako parametru i działa dobrze. Wtedy nie potrzebujesz PyQt4..linii od ani progressDialog = linii. Zobacz podobny post na gis.stackexchange.com/questions/23203/…
rudivonstaden
@rudivonstaden - to ma sens teraz .. zaktualizowałem odpowiedź
vinayan
2

Oto sposób na zdobycie tego, co chcesz w SAGA GIS. Prawdopodobnie nie jest to pożądane rozwiązanie, ale działa. Zbadam przyczyny niepowodzenia moich wtyczek i zaktualizuję je jak najszybciej.

Zainstaluj SAGA GIS (powinien być również dostępny poprzez apt-get lub aptitudbe w twojej dystrybucji Linuksa).

  • Uruchom SAGA, załaduj swój kształt rastrowy i wektorowy (Moduły menu -> Plik -> Import GDAL / OGR). Możesz zobaczyć proces poniżej.
  • Wykonaj moduł „Statystyka siatki dla wielokątów” (Moduły menu -> Kształt -> Siatka -> Wartości siatki). Wartości są dodawane bezpośrednio do tabeli. Okno dialogowe powinno wyglądać takwprowadź opis zdjęcia tutaj
  • Przejdź do zakładki „Dane” w obszarze roboczym, kliknij prawym przyciskiem myszy warstwę wektorową i wybierz opcję „ zapisz jako ”, aby wyeksportować kształt z dodanymi atrybutami. Możesz także wyświetlić tabelę atrybutów, klikając prawym przyciskiem myszy, a następnie kliknąć opcję Pokaż tabelę

Działa to dla zestawu danych, który mi przesłałeś. Możliwe jest również wywoływanie modułów SAGA w QGIS za pośrednictwem SEXTANTE jako proces BATCH. W tym celu wystarczy aktywować moduły SAGA w opcjach SEXTANTE.

Kulik
źródło
dziękuję za sugestię, ale już próbowałem sagi - uzyskane przez nią wyniki były niespójne, tj. zrobienie tego samego dwa razy dało różne wyniki. Wiem, że wtyczka ZonalStats w QGIS działa, dlatego szukam sposobu na automatyzację ZonalStats.
Thomas
@vinayan Mam kod, który podałeś dla statystyki strefowej, ale tworzy on kolumny w warstwie wektorowej wielokąta, ale nie aktualizuje obliczonych wartości. Dlaczego tak jest
user99
2
zoneStat = QgsZonalStatistics (polygonLayer, rasterFilePath, 'pre-', 1)
zoneStat.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ć:

zoneStat = QgsZonalStatistics (polygonLayer, rasterFilePath, 'pre-', 1, QgsZonalStatistics.Mean)
zoneStat.calculateStatistics(None)

zobacz API dla wszystkich opcji.

Fitzroy Hogsflesh
źródło
Czy ktoś może pomóc w składni pozwalającej uzyskać dwie statystyki do wyboru, powiedzmy Min i Max jednocześnie? Próbowałem na różne sposoby, ale bez powodzenia
dorakiara
W Qgis 3 musisz zastąpić ścieżkę pliku rastrowego samym plikiem rastrowym! Dlatego rasterFilePath = 'F: /temp/zonalstat/raster1.tif' staje się: rasterFile = QgsRasterLayer ('F: /temp/zonalstat/raster1.tif', 'raster') Następnie zmieniasz plik rasterFilePath na plik rasterFile w strefieStat polecenie zoneStat = QgsZonalStatistics (polygonLayer, rasterFile, 'pre-', 1) zoneStat.calculateStatistics (Brak)
philsch 16.09.19