考虑以下数据:
library(sp)
library(raster)
# create raster
r <- matrix(c(1.8, 1.2, 1.8, 1.2, 2.5, 2.7, 8.5, 7, 2), 3,3)
r <- raster(r)
extent(r) <- c(45,46,54,55)
projection(r) <- "+proj=utm +zone=33 +ellps=GRS80 +units=m +no_defs"
# create points
coords <- data.frame(x = c(45.6, 45.2),
y = c(54.8, 54.2))
data <- data.frame(a = c(20,22), b = c(1.5, 2.5))
p <- SpatialPointsDataFrame(coords = coords,
data = data,
proj4string = crs(r))
plot(r)
plot(p, add=TRUE)
我有两个点,覆盖两个栅格细胞。我想用a
of SpatialPointsDataFrame p
替换这些光栅单元格值。因此,我将SpatialPointsDataFrame转换为光栅:
p_ras <- rasterize(x = p, y = r, field = "a")
如何使用r
的值更新p_ras
的值,其中p_ras
有非空的单元格值,并按位置将值分配给r
。
发布于 2019-08-15 17:39:46
您的示例数据
library(raster)
r <- raster(ncol=3, nrow=3, ext=extent(c(45,46,54,55)), crs = "+proj=utm +zone=33 +ellps=GRS80 +units=m")
values(r) <- c(1.8, 1.2, 1.8, 1.2, 2.5, 2.7, 8.5, 7, 2)
coords <- data.frame(x = c(45.6, 45.2), y = c(54.8, 54.2))
data <- data.frame(a = c(20,22), b = c(1.5, 2.5))
p <- SpatialPointsDataFrame(coords = coords, data = data, proj4string = crs(r))
你和rasterize
走在正确的轨道上。只需添加参数update=TRUE
x <- rasterize(p, r, field="a", update=TRUE)
这相当于
p_ras <- rasterize(p, r, field = "a")
p_ras <- cover(p_ras, r)
这应该比overlay
更清晰、更有效。对于大型对象来说,使用xyFromCell
的方法是危险的,因为它可能会将所有值强制放入内存中。
发布于 2019-08-15 14:45:15
我通过研究这篇文章的答案找到了答案:https://gis.stackexchange.com/questions/95481/in-r-set-na-cells-in-one-raster-where-another-raster-has-values
我的解决方案是从overlay
包中使用raster
。
r_mod <- overlay(r, p_ras, fun = function(x, y){
x[!is.na(y[])] <- y[!is.na(y[])]
return(x)
})
https://stackoverflow.com/questions/57511013
复制相似问题