如何在不进行插值的情况下从不规则点数据制作RASTER


13

我试图从不规则间隔的点数据库制作光栅图像。数据看起来像-

> 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

我想在我创建的网格中使用这些“ z”值

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

我还希望为数据点之外的那些网格点将z值分配为“ NA”。网格上的点如下所示:https : //drive.google.com/file/d/0B6GUNg-8d30vYzlwTkhvaHBFTnc/edit?usp=我绘制时共享

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

问题是我不确定如何在此基础上进行构建,以下步骤不起作用,因为我的网格和数据点的比例不同!

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

如果仅使用数据点(没有任何网格)尝试制作栅格,R会引发错误,因为我的数据间隔不规则!

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

此外,我试图使用“栅格包”的“栅格化”功能(对于不规则网格),但无法解决:(。的创意,我想避免插值,是否有可能在没有idw或kriging方法的情况下制作不规则间隔数据点的栅格?


不规则间隔网格的问题在于,如果点太靠近/太靠近,则算法将失败。(非最佳)解决方法:为什么不使单元格之间的距离最小,并创建一个矩形矢量网格。然后将这些点的平均值加入该网格并对其进行栅格化。
Curlew

我有同样的问题-解决方案是使用SpatialPixelsDataFrame建议的tolerance参数(在您的情况下为0.916421)。
Tomas

Answers:


18

我假设您要在常规栅格上放置不规则点数据。在这种情况下,栅格化应该可以工作,而栅格化中的示例演示了如何进行。这是根据您的数据

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)

优秀的解决问题的办法@罗伯特
ToNoY

抱歉,您能否阐明为什么添加e <-e + 1000?
mmann1123 2015年

@ mman1123仅仅是使事情与这些奇怪的示例数据一起使用。所有y坐标都相同,因此在y方向上范围为零,因此我添加了1000 ---完全任意---以便能够根据范围制作栅格。
罗伯特·希曼斯

是否有针对此的pythonic解决方案?
raaj

5

这对我有用-解决方案是将SpatialPixelsDataFrame与建议的公差参数一起使用(在您的情况下为0.916421):

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

但是,由于公差值较高,因此栅格无法很好地适应原始点。可能适合得多。


1
代码的第一行缺少右括号?
安蒂(Antti)

@Antti谢谢,纠正了!
托马斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.