Cách tạo RASTER từ dữ liệu điểm bất thường mà không cần nội suy


13

Tôi đã cố gắng tạo một hình ảnh raster từ cơ sở dữ liệu điểm cách đều nhau. Dữ liệu trông như-

> 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

Tôi muốn các giá trị 'z' này trong một lưới mà tôi đã tạo bởi

# 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))

Tôi cũng muốn các giá trị z được gán là 'NA' cho các điểm lưới nằm ngoài các điểm dữ liệu. Các điểm trên lưới trông như thế này: https://drive.google.com/file/d/0B6GUNg-8d30vYzlwTkhvaHBFTnc/edit?usp=shaming khi tôi vẽ

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

Vấn đề là tôi không chắc cách xây dựng dựa trên điều này, các bước sau đây không hoạt động vì lưới lưới và các điểm dữ liệu của tôi không cùng tỷ lệ !!

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

Nếu tôi cố gắng tạo raster chỉ bằng cách sử dụng các điểm dữ liệu (không có lưới), R sẽ xuất hiện lỗi do dữ liệu của tôi cách đều nhau!

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

Hơn nữa, tôi đã cố gắng chơi với chức năng 'rasterize' (đối với lưới không đều) của 'gói raster', nhưng không thể tìm ra cách nào với nó :(. Tôi biết cách nội suy và tạo lưới thông thường, nhưng vì lợi ích về tính nguyên bản, tôi muốn AVOID nội suy. Có thể tạo một raster các điểm dữ liệu cách đều nhau mà không cần các phương thức idw hoặc kuceing không?


Vấn đề với các lưới cách đều nhau là thuật toán thất bại nếu các điểm nằm quá gần / xa nhau. Cách giải quyết (không tối ưu): Tại sao không lấy khoảng cách tối thiểu giữa các ô và tạo lưới vectơ hình chữ nhật. Sau đó nối các giá trị trung bình của các điểm vào lưới đó và rasterize nó.
Curlew

Tôi đã có cùng một vấn đề - giải pháp là sử dụng SpatialPixelsDataFramevới toleranceđối số được đề xuất (0.916421 trong trường hợp của bạn).
Tomas

Câu trả lời:


18

Tôi giả sử bạn muốn dữ liệu điểm bất thường của bạn trên một raster thông thường. Trong trường hợp đó, rasterize sẽ hoạt động và các ví dụ trong? Rasterize hiển thị như thế nào. Đây là một cái gì đó dựa trên dữ liệu của bạn

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)

giải pháp tuyệt vời cho vấn đề @ Robert
ToNoY

Xin lỗi, bạn có thể làm rõ lý do tại sao bạn thêm e <- e + 1000 không?
mmann1123

@ mman1123 Đó chỉ là để làm cho mọi thứ hoạt động với những dữ liệu ví dụ kỳ lạ này. Tất cả các tọa độ y đều giống nhau và do đó phạm vi bằng 0 theo hướng y, vì vậy tôi thêm 1000 --- hoàn toàn tùy ý --- để có thể tạo raster từ phạm vi.
Robert Hijmans

Có một giải pháp pythonic cho điều này?
raaj

5

Điều này hiệu quả với tôi - giải pháp là sử dụng SpatialPixelsDataFrame với đối số dung sai được đề xuất (0.916421 trong trường hợp của bạn):

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

mặc dù, do giá trị dung sai cao, raster không phù hợp lắm với các điểm ban đầu. Có thể phù hợp hơn nhiều.


1
Dòng mã đầu tiên có một dấu ngoặc đóng?
Antti

@Antti cảm ơn, đã sửa!
Tomas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.