Menggunakan QGIS Zonal Stats Plugin dari Python Console?


9

Saya menggunakan plugin Zonal Stats di QGIS untuk mengekstraksi statistik raster dari overlay poligon (saya memiliki shapefile distribusi spesies dan saya ingin mengekstraksi data lingkungan dari dalam kisaran masing-masing spesies). Saya memiliki 300 atau lebih file yang saya perlukan untuk mendapatkan data dan ingin menulis skrip untuk dijalankan di konsol python, namun saya seorang pemula yang lengkap dengan python dan tidak tahu bagaimana melakukan ini.



Chad - ya itu pertanyaan serupa tetapi lebih spesifik. Tidak ada yang menjawab pertanyaan lain, sebaliknya mereka menyarankan cara lain untuk menyelesaikan masalah. Saya tidak tahu cara menghapus posting lainnya
Thomas

Dalam pertanyaan lain saya menunjuk Anda ke r-script yang mampu apa yang Anda inginkan dan Sylvester Sneekly menamai Anda metode yang tepat dalam python. Jika Anda tidak terbiasa kode dalam python atau r dari semua petunjuk lebih lanjut tidak akan membantu Anda. Anda memerlukan skrip kode sendiri atau banyak mouseclick. Pelajari beberapa pengkodean, coba contoh dan laporkan kembali, jika sesuatu tidak berhasil.
Curlew

@ Curlew - metode Sylvester, walaupun kedengarannya sangat bagus, akan mewakili kurva pembelajaran yang sangat besar bagi saya dan saya tidak punya waktu untuk melakukan ini saat ini. Saya menghargai bantuan Sylvester tetapi itu bukan jawaban langsung yang saya cari. Saya pikir saya memiliki sebagian besar kode yang saya cari di pos yang saya sebutkan di pertanyaan saya yang lain ( gis.stackexchange.com/questions/23203/… ). Jika metode Sylvester adalah satu-satunya cara untuk melakukan ini dengan python mungkin saya meremehkan betapa sulitnya itu.
Thomas

@ Curlew - Skrip R Anda memang berfungsi, terima kasih. Satu-satunya hal yang belum saya kerjakan adalah bagaimana menambahkan hasil yang dikembalikan dalam R ke file .dbf untuk shapefile saya (bantuan apa pun dengan ini akan sangat dihargai).
Thomas

Jawaban:


13

Kode di bawah ini berfungsi untuk saya QGis 1.8.0

Anda dapat memodifikasi ini untuk mengakomodasi beberapa file dengan beberapa loop ..

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)

Bagus. Terima kasih banyak vinayan, itulah yang saya cari.
Thomas

Lihat juga di sini untuk solusi alternatif menggunakan R
Thomas

senang itu membantu Anda!
vinayan

@vinayan the QProgressDialog berguna untuk lingkungan visual tempat Anda ingin melihat sejauh mana kalkulasi telah berkembang. Tidak ada gunanya dari baris perintah. Anda dapat menggunakan Nonesebagai parameter dan berfungsi dengan baik. Maka Anda tidak perlu PyQt4..baris dari atau progressDialog = garis. Lihat posting serupa di gis.stackexchange.com/questions/23203/…
rudivonstaden

@rudivonstaden - itu masuk akal sekarang..saya memperbarui jawabannya
vinayan

2

Inilah cara untuk mendapatkan apa yang Anda inginkan dalam SAGA GIS. Ini mungkin bukan solusi yang Anda inginkan, tetapi berhasil. Saya akan melihat alasan mengapa plugin saya gagal dan memperbaruinya sesegera mungkin.

Instal SAGA GIS (juga harus tersedia melalui apt-get atau aptitudbe di distribusi linux Anda).

  • Mulai SAGA, muat dalam bentuk Raster dan vektor Anda (Modul Menu -> File -> Impor GDAL / OGR). Anda dapat melihat proses di bawah ini.
  • Jalankan Modul "Statistik grid untuk poligon" (Modul Menu -> Bentuk -> Kotak -> Nilai Grid). Nilai ditambahkan langsung ke tabel. Dialog akan terlihat seperti inimasukkan deskripsi gambar di sini
  • Buka tab "Data" di ruang kerja, klik kanan pada layer vektor Anda dan pilih " save as " untuk mengekspor bentuk dengan atribut yang ditambahkan. Anda juga bisa menampilkan tabel atribut melalui klik kanan dan kemudian klik pada acara tabel

Ini berfungsi untuk dataset yang Anda kirimi saya. Dimungkinkan juga untuk memanggil modul SAGA di QGIS melalui SEXTANTE sebagai proses BATCH. Untuk melakukan ini cukup aktifkan modul SAGA di opsi SEXTANTE.


terima kasih atas sarannya tetapi saya sudah mencoba saga - hasil yang dihasilkannya tidak konsisten yaitu melakukan hal yang sama dua kali memberikan hasil yang berbeda. Saya tahu plugin ZonalStats di QGIS berfungsi, maka saya mencari cara untuk mengotomatiskan ZonalStats.
Thomas

@vinayan saya punya kode yang telah Anda berikan untuk zonal statatika tetapi sedang membuat kolom di lapisan vektor poligon tetapi tidak memperbarui nilai yang dihitung. Kenapa gitu?
user99

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

menghitung secara default, cukup Hitung, Jumlah, dan Rata-rata (seperti yang Anda tahu dari Raster -> Zonal Statisticsdalam QGIS Desktop, ia dapat melakukan lebih banyak lagi).

Misalnya, jika Anda ingin menghitung Mean yang harus Anda gunakan:

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

lihat API untuk semua opsi.


Adakah yang bisa membantu dengan sintaksis untuk mendapatkan dua statistik pilihan, katakanlah Min & Max, pada saat yang sama? Saya sudah mencoba berbagai cara tetapi tidak berhasil
dorakiara

Di Qgis 3 Anda perlu mengganti jalur file raster dengan file raster itu sendiri! Oleh karena itu, rasterFilePath = 'F: /temp/zonalstat/raster1.tif' menjadi: rasterFile = QgsRasterLayer ('F: /temp/zonalstat/raster1.tif', 'raster') Kemudian Anda mengubah rasterFilePath ke rasterFile di zoneStat command zoneStat = QgsZonalStatistics (polygonLayer, rasterFile, 'pre-', 1) zoneStat.calculateStatistics (Tidak Ada)
philsch
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.