Bagaimana cara menghitung statistik raster untuk poligon?

14

bagaimana saya bisa menghitung jumlah, rata-rata dll poin raster (multi-band) per poligon dari layer vektor. Saya diberitahu bahwa ini disebut "statistik zona". Saya mencobanya dengan QGIS terlebih dahulu.

Ada cara untuk melakukannya tetapi itu terlalu lambat (mengkonversi raster ke vektor, berpotongan dengan layer vektor kedua, menghitung geometri, angka ekspor, menghitung statistik dengan spreadsheet atau program lain, mengimpor kembali hasilnya, memakan waktu lama untuk saya 350.000 poin raster).

Saya juga diberi petunjuk untuk menggunakan saga-gis. Itu memiliki "statistik zonal" tetapi itu didasarkan pada kategori dari raster-band, bukan pada poligon dari layer vektor. Jadi untuk menggunakan ini saya harus mengubah layer vektor saya ke raster dan kemudian menghitung statistik.

Ini sepertinya cara yang salah untuk menyelesaikan ini. Tidak akan ada cara untuk menghitung titik raster yang dimiliki 2 atau lebih poligon karena mereka berpotongan dengan batas poligon. Saya berasumsi bahwa statistik berbasis poligon harus dapat menangani ini, jadi saya juga berasumsi bahwa saya belum menemukan modul yang benar.

Saga-gis memiliki banyak sekali modul. Tolong beri tahu saya yang mana yang tepat untuk aplikasi ini.

stn
sumber
Saya mencoba solusi Rudivonstaden, dan pesan kesalahan berikut muncul ketika saya memasukkan dua perintah terakhir: >>> zonalstats = qgis.analysis.QgsZonalStatistics (vectorlayer, rasterfile) Traceback (panggilan terakhir terakhir): File "<input>" , baris 1, dalam <module> AttributeError: objek 'modul' tidak memiliki atribut 'analisis' >>> zonalstats.calculateStatistics (Tidak Ada) Traceback (panggilan terakhir terakhir): File "<input>", baris 1, dalam <module > NameError: name 'zonalstats' tidak didefinisikan Saya bertanya-tanya apakah perintahnya benar atau apakah file raster yang saya gunakan berada dalam format yang benar? Terima kasih!
Dan Wolf
Hai Dan. Stackexchange bekerja sedikit berbeda dari forum. Tujuannya adalah untuk memiliki interaksi jenis Q&A daripada diskusi yang sedang berlangsung. Jika jawaban atas pertanyaan awal tidak menyelesaikan apa yang perlu Anda ketahui, Anda harus meminta klarifikasi di bagian komentar atau mempertimbangkan mengajukan pertanyaan baru.
Jay Guarneri
Terima kasih atas komentar Anda, Dan. Jawaban saya tidak ada pernyataan impor yang diperlukan, yang sekarang harus diperbaiki.
rudivonstaden

Jawaban:

22

Saya berjuang untuk melakukan hal yang persis sama, tetapi karena berbagai alasan saya berkomitmen untuk menggunakan QGIS. Saya mencoba menggunakan v.rast.stats menggunakan plugin GRASS dan juga melalui plugin Sextante. Pendekatan terakhir gagal, karena tampaknya melampirkan statistik ke lapisan vektor sementara yang kemudian dihapus. Plugin GRASS berfungsi, tetapi tidak berurusan dengan tumpang tindih poligon.

Setelah melakukan beberapa penggalian (dalam sumber plugin ZonalStats yang kedengarannya menjanjikan), saya menemukan bahwa QGIS sebenarnya memiliki metode statistik zona yang dibangun ke dalam API, dan ini juga memiliki binding Python. Jadi selama Anda hanya mencari count, sumdan meanstatistik untuk fitur poligon Anda, Konsol Python (Plugin> Konsol Python) saat ini merupakan cara termudah untuk melampirkan statistik ke tabel atribut poligon.

  1. Pilih layer raster Anda di TOC, dan ketik berikut ini ke konsol (itu mengambil nama file sumber dari layer raster Anda)

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

  2. Pilih layer vektor Anda, dan jalankan perintah berikut di konsol (itu mengambil layer vektor itu sendiri)

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

  3. Jalankan tiga perintah berikut di konsol (mereka meneruskan layer vektor dan file raster ke kalkulator statistik zona bawaan QGIS ')

    >>> import qgis.analysis

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

    >>> zonalstats.calculateStatistics(None)

Hasilnya akan ditambahkan sebagai bidang tambahan di lapisan poligon.

Statistik Zonal

Perhatikan bahwa jika Anda ingin menambahkan awalan ke bidang baru (bukan hanya memiliki mereka sebagai jumlah, rata-rata dan jumlah), maka Anda akan mengganti perintah pertama di langkah 3 dengan yang berikut (dengan asumsi Anda ingin menggunakan 'zonal_' sebagai awalan:

>>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile,"zonal_")
rudivonstaden
sumber
1
+1 qgis.analysis.QgsZonalStatistics ()
Aaron
Ada plugin Zonal Statistics di QGIS, jadi mungkin tidak perlu menjalankan perintah yang disebutkan sendiri: docs.qgis.org/2.2/en/docs/user_manual/plugins/... Saya bertanya-tanya, mengapa tidak ada kemungkinan untuk menghitung maksimum dan minimum nilai juga.
matandked
Saya menggunakan teknik Anda tetapi menghapus beberapa poligon :(
niahoo
6

Akhirnya menemukannya: Di Saga-GIS buka kategori-poligon dan data-grid, lalu bentuk-> grid-> nilai grid-> statistik grid untuk poligon

stn
sumber
3

Anda dapat melakukan ini dengan mudah dengan PostGIS. Lihat tutorial ini: http://trac.osgeo.org/postgis/wiki/WKTRasterTutorial01

Pierre Racine
sumber
THX untuk idenya. Saya berharap untuk menyelesaikan ini tanpa menambah dan mempelajari perangkat lunak lain. Saya akan tetap mengingat PostGIS untuk nanti.
stn
3

Masalah ini tampaknya telah diselesaikan beberapa waktu yang lalu, tetapi saya akan tetap menambahkan sendok saya ke sup karena saya baru-baru ini memerlukan beberapa statistik raster sendiri.

Metodologi QGIS yang dijelaskan oleh rudivonstaden bekerja seperti pesona, terima kasih atas tipnya. Namun, dalam kasus saya, saya juga ingin mengetahui nilai min & max dan std untuk nilai raster dalam poligon saya, dan fungsionalitas yang tidak dapat saya temukan di QGIS. Saya menemukan solusi melalui fungsi isectpolyrst di GME , yang merupakan favorit saya untuk menyelesaikan masalah SIG. Fungsi ini memberi saya statistik yang saya butuhkan dan juga agak cepat.

PS. GME memiliki sedikit ketergantungan yang tidak menguntungkan (ArcGIS). Jadi meskipun program itu sendiri tersedia secara bebas untuk semua orang, Anda perlu ArcGIS untuk menjalankannya. Tetapi jika Anda memiliki ArcGIS (tingkat lisensi apa pun), saya sarankan Anda mencobanya.

EDIT:

Saya mendapatkan statistik yang saya inginkan, tetapi kemudian saya menemukan bahwa saya melompat ke kesimpulan sedikit dengan tergesa-gesa setelah melihat angka yang sebenarnya. Anda mendapatkan statistik, ya, tetapi hanya untuk band pertama dalam raster. Jadi jika Anda beroperasi dengan gambar raster 3-band, statistiknya tidak lengkap. Saya seharusnya menunjukkan jumlah saluran di pos asli saya. Terbaik untuk menggunakan SAGA-GIS seperti stn yang diusulkan di atas jika Anda bekerja dengan gambar multi-band raster.

GISinHelsinki
sumber
3
zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)
zonalstats.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:

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

lihat API untuk semua opsi.

Fitzroy Hogsflesh
sumber