R:更改空间点叠加的栅格值
R: change raster values where spatial points overlay
考虑以下数据:
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 p
的 a
的值替换这些栅格像元值。因此,我将 SpatialPointsDataFrame 转换为栅格:
p_ras <- rasterize(x = p, y = r, field = "a")
如何使用 p_ras
的值更新 r
的值,其中 p_ras
具有非空单元格值并按位置将值分配给 r
?
我自己通过研究这个 post 的答案找到了答案:https://gis.stackexchange.com/questions/95481/in-r-set-na-cells-in-one-raster-where-another-raster-has-values
我的解决方案是使用 raster
包中的 overlay
。
r_mod <- overlay(r, p_ras, fun = function(x, y){
x[!is.na(y[])] <- y[!is.na(y[])]
return(x)
})
这是一个使用 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 创建
该图显示了原始栅格和新更新栅格之间的差异。仅更新了相关单元格。
您的示例数据
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
的方法对于大对象是有风险的,因为它可能会强制所有值进入内存。
考虑以下数据:
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 p
的 a
的值替换这些栅格像元值。因此,我将 SpatialPointsDataFrame 转换为栅格:
p_ras <- rasterize(x = p, y = r, field = "a")
如何使用 p_ras
的值更新 r
的值,其中 p_ras
具有非空单元格值并按位置将值分配给 r
?
我自己通过研究这个 post 的答案找到了答案:https://gis.stackexchange.com/questions/95481/in-r-set-na-cells-in-one-raster-where-another-raster-has-values
我的解决方案是使用 raster
包中的 overlay
。
r_mod <- overlay(r, p_ras, fun = function(x, y){
x[!is.na(y[])] <- y[!is.na(y[])]
return(x)
})
这是一个使用 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 创建该图显示了原始栅格和新更新栅格之间的差异。仅更新了相关单元格。
您的示例数据
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
的方法对于大对象是有风险的,因为它可能会强制所有值进入内存。