Saya memiliki raster nilai:
m <- matrix(c(2,4,5,5,2,8,7,3,1,6,
5,7,5,7,1,6,7,2,6,3,
4,7,3,4,5,3,7,9,3,8,
9,3,6,8,3,4,7,3,7,8,
3,3,7,7,5,3,2,8,9,8,
7,6,2,6,5,2,2,7,7,7,
4,7,2,5,7,7,7,3,3,5,
7,6,7,5,9,6,5,2,3,2,
4,9,2,5,5,8,3,3,1,2,
5,2,6,5,1,5,3,7,7,2),nrow=10, ncol=10, byrow = T)
r <- raster(m)
extent(r) <- matrix(c(0, 0, 10, 10), nrow=2)
plot(r)
text(r)
Dari raster ini, bagaimana saya bisa menetapkan nilai (atau mengubah nilai) ke 8 sel yang berdekatan dari sel saat ini menurut ilustrasi ini? Saya menempatkan titik merah di dalam sel saat ini dari baris kode ini:
points(xFromCol(r, col=5), yFromRow(r, row=5),col="red",pch=16)
Di sini, hasil yang diharapkan adalah:
di mana nilai sel saat ini (yaitu, 5 dalam nilai raster) diganti dengan 0.
Secara keseluruhan, nilai baru untuk 8 sel yang berdekatan harus dihitung sebagai berikut:
Nilai baru = rata-rata nilai sel yang terkandung dalam persegi panjang merah * jarak antara sel saat ini (titik merah) dan sel yang berdekatan (yaitu, sqrt (2) untuk sel yang berdekatan secara diagonal atau 1 sebaliknya)
Memperbarui
Ketika batas untuk sel yang berdekatan berada di luar batas raster, saya perlu menghitung nilai baru untuk sel yang berdekatan yang menghormati kondisi. Sel-sel yang berdekatan yang tidak menghormati kondisinya akan sama dengan "NA".
Misalnya, jika posisi referensi adalah c (1,1) alih-alih c (5,5) dengan menggunakan notasi [baris, kolom], hanya nilai baru di sudut kanan bawah yang dapat dihitung. Dengan demikian, hasil yang diharapkan adalah:
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 0 NA
[3,] NA NA New_value
Misalnya, jika posisi referensi adalah c (3,1), hanya nilai-nilai baru di sudut kanan atas, kanan dan kanan bawah dapat dihitung. Dengan demikian, hasil yang diharapkan adalah:
[,1] [,2] [,3]
[1,] NA NA New_value
[2,] NA 0 New_value
[3,] NA NA New_value
Ini adalah upaya pertama saya untuk ini dengan menggunakan fungsi focal
tetapi saya memiliki beberapa kesulitan untuk membuat kode otomatis.
Pilih sel yang berdekatan
mat_perc <- matrix(c(1,1,1,1,1,
1,1,1,1,1,
1,1,0,1,1,
1,1,1,1,1,
1,1,1,1,1), nrow=5, ncol=5, byrow = T)
cell_perc <- adjacent(r, cellFromRowCol(r, 5, 5), directions=mat_perc, pairs=FALSE, sorted=TRUE, include=TRUE)
r_perc <- rasterFromCells(r, cell_perc)
r_perc <- setValues(r_perc,extract(r, cell_perc))
plot(r_perc)
text(r_perc)
jika sel yang berdekatan terletak di sudut kiri atas sel saat ini
focal_m <- matrix(c(1,1,NA,1,1,NA,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
jika sel yang berdekatan terletak di sudut tengah atas sel saat ini
focal_m <- matrix(c(1,1,1,1,1,1,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
jika sel yang berdekatan terletak di sudut kiri atas sel saat ini
focal_m <- matrix(c(NA,1,1,NA,1,1,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
jika sel yang berdekatan terletak di sudut kiri sel saat ini
focal_m <- matrix(c(1,1,NA,1,1,NA,1,1,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
jika sel yang berdekatan terletak di sudut kanan sel saat ini
focal_m <- matrix(c(NA,1,1,NA,1,1,NA,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
jika sel yang berdekatan terletak di sudut kiri bawah sel saat ini
focal_m <- matrix(c(NA,NA,NA,1,1,NA,1,1,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
jika sel yang berdekatan terletak di sudut tengah-bawah sel saat ini
focal_m <- matrix(c(NA,NA,NA,1,1,1,1,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
jika sel yang berdekatan terletak di sudut kanan bawah sel saat ini
focal_m <- matrix(c(NA,NA,NA,NA,1,1,NA,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
raster
paket R danfocal()
fungsinya (hlm. 90 dokumentasi): cran.r-project.org/web/packages/raster/raster.pdfmat <- matrix(c(1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0), nrow=5, ncol=5, byrow = T)
f.rast <- function(x) mean(x)*sqrt(2)
aggr <- as.matrix(focal(r, mat, f.rast))
. Bagaimana saya bisa mendapatkan hasil hanya untuk 8 sel yang berdekatan dari sel saat ini dan tidak semua raster? Di sini, hasilnya harus:res <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)
. Terima kasih banyak !Jawaban:
Fungsi di
AssignValuesToAdjacentRasterCells
bawah ini mengembalikan objek RasterLayer baru dengan nilai yang diinginkan ditetapkan dari input raster asli . Fungsi memeriksa apakah sel yang berdekatan dari posisi referensi berada di dalam batas raster. Ini juga menampilkan pesan jika ada yang keluar. Jika Anda perlu memindahkan posisi referensi, Anda cukup menulis iterasi mengubah posisi input ke c ( i , j ).Input data
Fungsi
Jalankan contoh
Plot contoh
Contoh gambar
Catatan:
NA
nilai rata-rata sel putihsumber
Untuk operator matriks pada matriks kecil ini masuk akal dan dapat ditelusuri. Namun, Anda mungkin ingin benar-benar memikirkan kembali logika Anda ketika menerapkan fungsi seperti ini ke raster besar. Secara konseptual, ini tidak benar-benar melacak dalam aplikasi umum. Anda berbicara tentang apa yang secara tradisional disebut sebagai statistik blok. Namun, statistik blok pada dasarnya dimulai pada satu sudut raster dan mengganti blok nilai, dalam ukuran jendela yang ditentukan, dengan operator. Biasanya jenis operator ini adalah untuk mengumpulkan data. Akan jauh lebih mudah ditelusuri jika Anda berpikir dalam hal menggunakan kondisi untuk menghitung nilai tengah dari sebuah matriks. Dengan cara ini Anda dapat dengan mudah menggunakan fungsi fokus.
Hanya perlu diingat bahwa fungsi fokus raster membaca dalam blok data yang mewakili nilai-nilai fokus dalam lingkungan yang ditentukan berdasarkan matriks yang diteruskan ke argumen w. Hasilnya adalah vektor untuk masing-masing lingkungan dan hasil dari operator fokus ditugaskan hanya untuk sel fokus dan bukan seluruh lingkungan. Anggap saja mengambil matriks yang mengelilingi nilai sel, beroperasi di atasnya, menetapkan nilai baru ke sel lalu pindah ke sel berikutnya.
Jika Anda memastikan bahwa na.rm = FALSE maka vektor akan selalu mewakili lingkungan yang tepat (mis., Vektor dengan panjang yang sama) dan dipaksa menjadi objek matriks yang dapat dioperasikan di dalam suatu fungsi. Karena itu, Anda cukup menulis fungsi yang mengambil vektor harapan, memaksa ke dalam matriks, menerapkan logika notasi lingkungan Anda dan kemudian menetapkan nilai tunggal sebagai hasilnya. Fungsi ini kemudian dapat diteruskan ke fungsi raster :: focal.
Inilah yang akan terjadi pada setiap sel berdasarkan pada paksaan sederhana dan evaluasi jendela fokus. Objek "w" pada dasarnya akan menjadi definisi matriks yang sama bahwa seseorang akan melewati argumen w dalam focal. Inilah yang mendefinisikan ukuran vektor subset di setiap evaluasi fokus.
Sekarang buat fungsi yang bisa diterapkan untuk fokus menerapkan logika di atas. Dalam hal ini Anda bisa menetapkan objek se sebagai nilai atau menggunakannya sebagai kondisi dalam sesuatu seperti "ifelse" untuk menetapkan nilai berdasarkan evaluasi. Saya menambahkan pernyataan ifelse untuk menggambarkan bagaimana seseorang akan mengevaluasi beberapa kondisi lingkungan dan menerapkan kondisi posisi matriks (notasi lingkungan). Dalam fungsi dummy ini, paksaan x ke matriks sama sekali tidak perlu dan hanya untuk menggambarkan bagaimana hal itu akan dilakukan. Satu dapat menerapkan kondisi notasi lingkungan langsung ke vektor, tanpa paksaan matriks, karena posisi dalam vektor akan berlaku untuk lokasinya di jendela fokus dan tetap tetap.
Dan menerapkannya pada raster
sumber
Anda dapat dengan mudah memperbarui nilai raster dengan menyetel raster menggunakan notasi [row, col]. Perhatikan saja bahwa baris dan kolom dimulai dari sudut kiri atas raster; r [1,1] adalah indeks piksel kiri atas dan r [2,1] adalah yang di bawah r [1,1].
sumber