Saya telah mengalami berbagai masalah menggunakan ArcGIS ZonalStats dan berpikir R bisa menjadi cara yang hebat. Mengatakan bahwa saya cukup baru untuk R, tetapi mendapat latar belakang pengkodean.
Situasinya adalah bahwa saya memiliki beberapa raster dan poligon bentuk dengan banyak fitur ukuran yang berbeda (meskipun semua fitur lebih besar dari sel raster dan fitur poligon disejajarkan dengan raster). Saya telah menemukan cara untuk mendapatkan nilai rata-rata untuk setiap fitur poligon menggunakan perpustakaan raster dengan ekstrak:
#load packages required
require(rgdal)
require(sp)
require(raster)
# ---Set the working directory-------
datdir <- "/test_data/"
#Read in grid of water depth
ras <- raster("test_data/raster/pl_sm_rp1000/w001001.adf")
#read in polygon shape file
proxNA <- shapefile("test_data/proxy/PL_proxy_WD_NA_test")
#calc mean depth per polygon feature
#unweighted - only assigns grid to district if centroid is in that district
proxNA$RP1000 <- extract(ras, proxNA, fun = mean, na.rm = TRUE, weights = FALSE)
#plot depth values
spplot(proxNA[,'RP1000'])
Masalah yang saya miliki adalah bahwa saya juga membutuhkan rasio berbasis area antara area poligon dan semua sel non NA dalam poligon yang sama. Saya tahu apa ukuran sel raster itu dan saya bisa mendapatkan luas untuk setiap poligon, tetapi tautan yang hilang adalah jumlah semua sel non-NA di setiap fitur. Saya berhasil mendapatkan nomor sel semua sel dalam poligon proxNA@data$Cnumb1000 <- cellFromPolygon(ras, proxNA)
dan saya yakin ada cara untuk mendapatkan nilai aktual dari sel raster, yang kemudian membutuhkan loop untuk mendapatkan jumlah semua sel non-NA dikombinasikan dengan hitungan, dll. TAPI, saya yakin ada cara yang jauh lebih baik dan lebih cepat untuk melakukan itu! Jika ada di antara Anda yang memiliki ide atau dapat mengarahkan saya ke arah yang benar, saya akan sangat berterima kasih!
ras
memegang bendera NA menggunakan nilai yang sah? Sepertinya Anda bisa memfilter untuk nilai itu atau mendapatkan hitungan dari nilai-nilai itu setelah faktanya.Jawaban:
Contoh data dari Jeffrey
Sekarang gunakan ekstrak
Jika Anda memiliki banyak raster, pertama gunakan stack untuk menggabungkannya (jika mereka memiliki tingkat dan resolusi yang sama)
Untuk mendapatkan area poligon yang sebenarnya Anda tidak harus menggunakan pendekatan slot (i, 'area'). Untuk data planar Anda dapat menggunakan rgeos :: gArea (polys, byid = TRUE) Untuk data bola (lon / lat) Anda dapat menggunakan geosphere :: areaPolygon
sumber
Saya tidak yakin apakah Anda ingin rasio berdasarkan "nilai riil" area poligon atau area sel yang memotongnya. Berikut adalah beberapa contoh kode yang menggunakan semua sel yang memotong poligon (pada dasarnya, rasio sel NA dengan sel non-NA). Ini adalah contoh tiruan dan Anda harus menulis fungsi Anda sendiri.
Anda dapat menggunakan potongan kode ini untuk menambahkan kolom area ke data poligon Anda dengan mengekstraksi dari slot area. Ini dapat digunakan jika Anda ingin membuat perbandingan menggunakan area poligon "nyata".
Alternatif yang paling efisien, dan lebih cepat, untuk loop adalah "berlaku" seperti fungsi. Ada sejumlah ini tersedia di R yang digunakan untuk kelas objek atau struktur data yang berbeda. Dalam hal ini, karena ekstrak mengembalikan daftar, kami akan menggunakan lapply (daftar berlaku). Ini adalah cara untuk menerapkan fungsi basis atau kustom ke objek daftar. Kelas objek yang disimpan dalam daftar adalah vektor, fungsinya cukup lurus ke depan. Jika Anda menggunakan ekstrak pada objek bata atau tumpukan raster objek yang dihasilkan disimpan dalam daftar akan menjadi objek data.frame.
sumber
Saya tidak memiliki akses ke file Anda, tetapi berdasarkan apa yang Anda uraikan, ini seharusnya berfungsi:
sumber