Cara membuat RASTER dari data titik tidak beraturan tanpa interpolasi

13

Saya mencoba membuat gambar raster dari basis data titik yang tidak beraturan. Data terlihat seperti-

> head(s100_ras)
         x       y         z
1 267573.9 2633781 213.29545
2 262224.4 2633781  69.78261
3 263742.7 2633781  51.21951
4 259328.4 2633781 301.98413
5 264109.8 2633781 141.72414
6 255094.8 2633781  88.90244

Saya ingin nilai-nilai 'z' ini di dalam mesh yang saya buat

# Create a fine mesh grid
my_mesh=expand.grid(seq(min(s100_ras$Y),max(s100_ras$Y),l=100),
                    seq(min(s100_ras$X),max(s100_ras$X),l=100))

Saya juga ingin nilai-z ditetapkan sebagai 'NA' untuk titik-titik mesh yang berada di luar titik data. Poin di atas jala terlihat seperti ini: https://drive.google.com/file/d/0B6GUNg-8d30vYzlwTkhvaHBFTnc/edit?usp=sharing ketika saya merencanakan

plot(my_mesh)
points(s100_ras$Y, s100_ras$X, pch="*", col='blue')

Masalahnya adalah saya tidak yakin bagaimana membangunnya, langkah-langkah berikut ini tidak berfungsi karena grid mesh dan titik data saya tidak memiliki skala yang sama !!

library(rgdal)
library(raster)
xyz<-cbind(my_mesh, s100_ras)
r <- rasterFromXYZ(xyz)
image(r)

Jika saya mencoba membuat raster hanya dengan menggunakan titik data (tanpa mesh apa pun), R melempar kesalahan karena data saya berjarak tidak teratur!

library(sp)
s100_ras <- data.frame(expand.grid(x = s100_ras$Y, y = s100_ras$X), 
                       z = as.vector(s100_ras$mean))
coordinates(s100_ras) <- ~x+y
proj4string(s100_ras) <- CRS("+proj=utm +zone=46 +datum=WGS84")
gridded(s100_ras) = TRUE

suggested tolerance minimum: 0.916421 
Error in points2grid(points, tolerance, round) : 
  dimension 1 : coordinate intervals are not constant

Selain itu, saya mencoba untuk bermain dengan fungsi 'rasterize' (untuk grid tidak teratur) dari 'paket raster', tetapi tidak bisa mengatasinya :(. Saya tahu bagaimana cara interpolasi dan membuat grid biasa, tapi demi itu orisinalitas, saya ingin MENGHINDARI interpolasi. Apakah mungkin membuat raster titik data yang tidak beraturan tanpa metode idw atau kriging?

ToNoY
sumber
Masalah dengan grid spasi tidak teratur adalah bahwa algoritma gagal jika poin terletak terlalu dekat / jauh bersama. Solusi (tidak optimal): Mengapa tidak mengambil jarak minimal antara sel dan membuat kotak vektor persegi panjang. Kemudian gabungkan nilai rata-rata poin ke kisi itu dan rasterisasi.
Curlew
Saya memiliki masalah yang sama - solusinya adalah menggunakan argumen yang SpatialPixelsDataFramedisarankan tolerance(0,916421 dalam kasus Anda).
Tomas

Jawaban:

18

Saya berasumsi Anda ingin data titik tidak teratur Anda pada raster biasa. Dalam hal itu, rasterize harus berfungsi, dan contoh-contoh di? Rasterize menunjukkan caranya. Ini adalah sesuatu berdasarkan data Anda

s100 <- matrix(c(267573.9, 2633781, 213.29545, 262224.4, 2633781, 69.78261, 263742.7, 2633781, 51.21951, 259328.4, 2633781, 301.98413, 264109.8, 2633781, 141.72414, 255094.8, 2633781, 88.90244),  ncol=3,  byrow=TRUE)
colnames(s100) <- c('X', 'Y', 'Z')

library(raster)
# set up an 'empty' raster, here via an extent object derived from your data
e <- extent(s100[,1:2])
e <- e + 1000 # add this as all y's are the same

r <- raster(e, ncol=10, nrow=2)
# or r <- raster(xmn=, xmx=,  ...

# you need to provide a function 'fun' for when there are multiple points per cell
x <- rasterize(s100[, 1:2], r, s100[,3], fun=mean)
plot(x)
Robert Hijmans
sumber
solusi sempurna untuk masalah @ Robert
ToNoY
Maaf bisakah Anda menjelaskan mengapa Anda menambahkan e <- e + 1000?
mmann1123
@ mman1123 Itu hanya untuk membuat hal-hal berfungsi dengan data contoh aneh ini. Semua koordinat y adalah sama dan karenanya tingkatnya adalah nol dalam arah y, jadi saya menambahkan 1000 --- sepenuhnya arbitrer --- untuk dapat membuat raster dari luasnya.
Robert Hijmans
Apakah ada solusi pythonic untuk ini?
raaj
5

Ini bekerja untuk saya - solusinya adalah menggunakan SpatialPixelsDataFrame dengan argumen toleransi yang disarankan (0,916421 dalam kasus Anda):

points <- SpatialPoints(s100_ras[,c('x','y')], s100_ras[,c('z')])
pixels <- SpatialPixelsDataFrame(points, tolerance = 0.916421, points@data)
raster <- raster(pixels[,'z'])

Namun, karena nilai toleransi yang tinggi, raster tidak cocok dengan poin aslinya. Bisa pas jauh lebih baik.

Tomas
sumber
1
Baris kode pertama memiliki tanda kurung tutup yang hilang?
Antti
@ Antti terima kasih, diperbaiki!
Tomas