R:更改空间点重叠处的栅格值

时间:2019-08-15 14:13:36

标签: r r-raster sp

请考虑以下数据:

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)

我有2个点覆盖了2个栅格像元。我想将这些栅格像元值替换为SpatialPointsDataFrame a的{​​{1}}值。因此,我将SpatialPointsDataFrame转换为栅格:

p

如何使用p_ras <- rasterize(x = p, y = r, field = "a") 的值来更新r的值,其中p_ras具有非空单元格值,并按位置将值分配给p_ras

3 个答案:

答案 0 :(得分:2)

您的示例数据

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的方法存在风险,因为它可能会将所有值强制存储到内存中。

答案 1 :(得分:1)

我通过查看这篇帖子的答案来自己找到答案: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)

})

答案 2 :(得分:1)

这是使用cellXY

的解决方案
############# START ORIGINAL CODE ############# 
library(sp)  
library(raster)
#> Warning: package 'raster' was built under R version 3.6.1

# 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(1,2), b = c(1.5, 2.5))
p <- SpatialPointsDataFrame(coords = coords,
                            data = data, 
                            proj4string = crs(r))

############# END ORIGINAL CODE ############# 

我要做的是用cellXY查找与坐标对应的单元格,然后用p$a值替换这些值。

# Save original raster for comparison
r_before <- r

# Update cells
r[cellFromXY(r, p@coords)] <- p$a

# Plot difference
plot(r - r_before)
plot(p, add=TRUE)

reprex package(v0.3.0)于2019-08-15创建

该图显示了原始栅格和新更新的栅格之间的差异。只有相关的单元格已更新。