【问题标题】:R: change raster values where spatial points overlayR:更改空间点重叠的栅格值
【发布时间】:2019-12-21 23:22:54
【问题描述】:

考虑以下数据:

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 pa 值替换这些栅格像元值。因此,我将 SpatialPointsDataFrame 转换为栅格:

p_ras <- rasterize(x = p, y = r, field = "a")

如何使用p_ras 的值更新r 的值,其中p_ras 具有非空单元格值并按位置将值分配给r

【问题讨论】:

    标签: r r-raster sp


    【解决方案1】:

    您的示例数据

    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 的方法对于大型对象是有风险的,因为它可能会强制所有值进入内存。

    【讨论】:

      【解决方案2】:

      这是一个使用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 年 8 月 15 日创建

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

      【讨论】:

      • 不错的解决方案!
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-01
        • 2023-04-10
        • 1970-01-01
        • 2017-12-14
        • 2013-01-21
        • 2015-09-27
        • 1970-01-01
        • 2011-08-05
        相关资源
        最近更新 更多