Dapatkan Nilai Raster dari Hamparan Poligon di Solusi GIS opensource


16

Saya punya dua lapisan. Lapisan bentuk poligon dengan banyak ubin dan lapisan raster yang mengandung tutupan lahan CORINE 2006 dengan banyak kategori dalam peta warna. Saya ingin mendapatkan untuk setiap poligon di shapelayer sejumlah setiap kategori tutupan lahan dari layer raster.

Misalnya ada poligon dengan id '2' dan saya ingin atribut seperti ini untuk poligon ini (dalam persen atau meter persegi):

  • Tanah yang subur: 15%
  • Hutan: 11%
  • Streets: 2% (... dan satu)

Saya mencoba melakukannya di rumput, qgis (tidak ada fungsi), saga (hanya menjumlahkan setiap nilai total) r (jumlah total), tetapi saya masih belum menemukan solusi. Sebagian besar plugin (statistik zona dalam qgis) hanya mendukung 0-1 lapisan raster. v.rast.stats juga tidak membantu. Saya terbuka untuk solusi apa pun yang baik dan cerdas !. Mungkin saya bahkan menggunakan pendekatan yang salah atau membuat kesalahan.

Di Arcgis tugas ini cukup mudah, jika saya ingat benar, tetapi saya masih kehilangan solusi yang baik untuk pengguna linux sehari-hari Anda.

Saya menjalankan sistem linux debian dan ini sebabnya saya hanya dapat menggunakan program untuk OS ini.


EDIT: Karena pertanyaan ini masih memiliki begitu banyak pandangan dan pengunjung: Saya menulis QGIS-plugin, yang juga mampu menghitung landcover layer raster. Saya belum mengkodekan hamparan poligon, tetapi pasti direncanakan. Temukan plugin di sini dan instal perpustakaan Scipy terlebih dahulu.


Ini pasti bisa dilakukan di R, itu hanya soal mencari tahu fungsi yang mana. Anda perlu overlay setiap poligon dengan raster, dan kemudian gunakan table () untuk mendapatkan ringkasan piksel "cookie-cut". Paket raster, rgdal, dan rgeos mungkin berguna. Baca "R Spatial Task View" (google akan menemukannya)
Spacedman

tentu, tapi bagaimana saya bisa mendapatkan ringkasan seperti itu. Anda dapat dengan mudah overlay layer poligon dengan layer raster dengan! Is.na (overlay (Poly, Raster)), tetapi dengan perintah seperti ekstrak saya hanya dapat menghitung total area dalam pixel cookie-cut dan bukan kategori berbeda dari colourmap . Saya tidak tahu rgeos, tetapi saya melihat melalui api dan tidak menemukan fungsi untuk melakukan ini.
Curlew

Periksa r.univar dalam GRASS, seperti lihat grasswiki.osgeo.org/wiki/Zonal_statistics
markusN

Hai! Terima kasih telah membuat plugin QGIS! Saya hanya ingin menyebutkan, bahwa plugin macet (> 13000 poligon). Akan lebih bagus jika akan membagi tugas agar tidak crash. Dan akan luar biasa jika memiliki opsi untuk menambahkan semua kelas sekaligus (misalnya, sehingga tabel atribut mendapat 2 bidang baru LandcoverID dan Landcover% di mana keduanya memegang daftar CSV dengan nilai-nilai) :)
Mfbaer

@Joran: Jika Anda pikir ini adalah bug, naikkan laporan bug daripada menulis ini dalam komentar ( github.com/Martin-Jung/LecoS/issues ). Lebih jauh 1) itu bukan pekerjaan plugin untuk membuat cerita bersambung atau mengolah tugas Anda. Jalankan di subset yang lebih kecil. 2) Tentu. Akan ada banyak hal indah untuk ditambahkan. Kode adalah open source, Jangan ragu untuk mengodekannya :)
Curlew

Jawaban:


13

Gunakan 'ekstrak' untuk overlay fitur poligon dari SpatialPolygonsDataFrame (yang dapat dibaca dari shapefile menggunakan maptools: readShapeSpatial) pada raster, kemudian gunakan 'tabel' untuk meringkas. Contoh:

> c=raster("cumbria.tif") # this is my CORINE land use raster
> summary(spd)
Object of class SpatialPolygonsDataFrame
[...]
> nrow(spd)  # how many polygons:
[1] 2
> ovR = extract(c,spd)
> str(ovR)
List of 2
 $ : num [1:542] 26 26 26 26 26 26 26 26 26 26 ...
 $ : num [1:958] 18 18 18 18 18 18 18 18 18 18 ...

Jadi poligon pertama saya mencakup 542 piksel, dan yang kedua saya mencakup 958. Saya dapat meringkas masing-masing:

> lapply(ovR,table)
[[1]]

 26  27 
287 255 

[[2]]

  2  11  18 
 67  99 792 

Jadi poligon pertama saya adalah 287 piksel kelas 26, dan 255 piksel kelas 27. Cukup mudah untuk menjumlahkan dan membagi dan mengalikannya dengan 100 untuk mendapatkan persentase.


Hebat, terima kasih banyak atas usahanya. Saya akan mencobanya dan melaporkan kembali :-)
Curlew

6

Saya ingin melaporkan kembali dan inilah saya. Solusi Spacedman bekerja sangat baik dan saya dapat mengekspor semua informasi untuk setiap poligon dalam bentuk saya. Untuk berjaga-jaga jika seseorang memiliki masalah yang sama, berikut adalah cara saya mendahului:

...
tab <- apply(ovR,table)
# Calculate percentage of landcover types for each polygon-field.
# landcover is a datastream with the names of every polygon
for(i in 1:length(tab)){
 s <- sum(tab[[i]])
 mat <- as.matrix(tab[[i]])
 landcover[i,paste("X",row.names(mat),sep="")] <- as.numeric(tab[[i]]/s)
}

3

jika saya mengerti dengan benar apa yang Anda inginkan, dan dengan asumsi Anda sudah memiliki layer vektor 'mypolygonlayer' dan layer raster 'corina' di dalam database GRASS GIS Anda:

Pertama saya akan mengkonversi vektor ke raster. Kucing akan memastikan Anda memiliki satu pengidentifikasi unik per poligon. Jika Anda memiliki kolom dengan pengidentifikasi numerik unik, Anda bisa menggunakan kolom itu. Kolom label opsional:

input v.to.rast = lapisan mypolygonlayer = 1 output = mypolygons use = cat labelcolumn = NameMappingUnit

Kemudian jalankan r.stats untuk mendapatkan statistik Anda:

r.stats -a -l input = mypolygons, corina separator =; output = / home / paulo / corinastats.csv

Langkah terakhir adalah membuka corinastats.csv di misalnya, LibreOffice dan buat tabel pivot atau gunakan R untuk membuat tabel silang Anda


3

Saya tahu posting ini cukup lama tetapi saya baru-baru ini ingin melakukan analisis yang sama tetapi mengunduh program seperti R sedikit merepotkan pada komputer kerja saya dan perlu persetujuan. Setelah berjam-jam meneliti metode yang bisa saya gunakan hanya dengan QGis dan Excel, saya menemukan metode ini bekerja paling baik untuk saya dan ingin menawarkannya kepada orang-orang dalam situasi yang sama.

  1. Klip polygon ke layer raster (Raster → ekstraksi → clipper: file input = layer raster, pilih nama output & lokasi Anda, klik pada layer mask, pilih poligon → ok)

  2. Polygonise layer clipper (Raster → Conversion → polygonise: file input = layer klip Anda, simpan output → ok)

  3. Menghitung jumlah piksel (Klik pada file bentuk yang baru saja Anda buat → kalkulator bidang terbuka: centang “buat bidang baru” dan tambahkan nama bidang, Fungsi = geometri → area → ok). Anda sekarang harus memiliki kolom baru di tabel atribut Anda yang menunjukkan jumlah piksel.

  4. Simpan lapisan poligonise (Klik kanan lapisan poligonise, simpan sebagai: format = file DBF, simpan sebagai → ok)

  5. Meringkas jumlah piksel untuk masing-masing habitat (mulai unggul, buka file, jika judul tidak ditambahkan sekarang untuk setiap kolom, klik pada sel kosong, buka tab DATA, konsolidasi, pastikan itu dalam jumlah, klik pada panah merah di sebelah "browse ..." dan pilih Anda dua kolom (termasuk judul), klik "tambah" dan centang kotak "Baris atas" dan "kolom kiri" → ok)

  6. Jika, seperti saya, Anda memiliki banyak poligon untuk dianalisis dan perlu membandingkannya dalam tabel yang sama, langkah ini akan sangat membantu. Dalam buku kerja excel baru, daftar nomor habitat Anda di kolom A (untuk saya 1 hingga 48) dan tempatkan dua kolom yang baru saja Anda konsolidasi di kolom B dan C (habitat di B dan jumlah piksel di C). Di sel D1 tulis rumus berikut: = IFNA (INDEX (C: C; MATCH (A2; B: B; 0)); "") dan seret (atau klik dua kali sudut kanan bawah) ke nilai terakhir Anda (jadi jika Anda memiliki 48 habitat ke sel D48). Jumlah piksel sekarang dalam sel yang sesuai dengan habitat Anda dan Anda dapat mengulangi proses ini untuk semua poligon Anda.


2

Bagaimana mengkonversi data CORINE menjadi dataset vektor poligon menggunakan QGIS ( Raster> Conversion> Polygonize ) dan kemudian menggunakan fungsi Union ( Vector> Geoprocessing Tools> Union ) untuk bergabung dengan poligon. Dataset vektor yang dihasilkan akan berisi area dari setiap kelas CORINE di setiap poligon.


terima kasih untuk saran ini. Belum memikirkan serikat vektor. Mungkin saya akan mencobanya, jika R-processing gagal.
Curlew

0

QGIS.

Di bagasi QGIS, ada versi lain dari ZonalStats yang tersedia, itu disebut Statistik Zonal.

Ini melakukan fungsi yang Anda butuhkan.

Mengenai alur kerja, saya tidak jelas berapa banyak raster yang Anda miliki atau apakah mereka hanya pita dalam raster?


terima kasih atas komentarnya, tetapi Statistik Zonal hanya memakan raster tanpa kategori. Iam menggunakan QGIS Trunk 1.9
Curlew

0

Menentang sebagian besar jawaban di atas, saya berpendapat bahwa opsi yang lebih baik adalah meraster poligon Anda dan daripada bekerja dengan dua set data raster daripada dua set data poligon. Ini jauh lebih sedikit pemrosesan intensif dan akibatnya satu-satunya solusi yang mudah diterapkan untuk memproses raster besar dan file poligon besar di R.

Setelah meraster poligon Anda ke tingkat dan resolusi data raster yang sama persis, Anda dapat membuat tabulasi statistik ringkasan seperti yang dijelaskan di sini , yang sesuai jika raster Anda sesuai dengan memori (layer raster kecil / menengah) atau Anda dapat membuat binariasi setiap kategori dengan reclassfungsi tersebut. dan daripada menghitung zonalstatistik untuk setiap kelas. Berikut adalah solusi yang menggabungkan statistik rasterisasi dan zona menjadi satu fungsi dan berfungsi baik dengan kumpulan data yang sangat besar.

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.