使用SpatVector掩膜SpatRaster会产生未对齐的结果

wdebmtf2  于 2023-02-27  发布在  其他
关注(0)|答案(1)|浏览(130)

使用terra,我试图用SpatVector屏蔽一个SpatRaster。由于某种原因,屏蔽结果masked没有按预期工作,它错误地将栅格像元对角地保留在东南方向。
此外,我用随机数据运行了terra::mask,它运行得很好,那么在我的具体情况下,问题会是什么呢?
下面是我的问题的一个可视化:黑色单元格表示SpatRaster masked,绿色多边形表示SpatVector areamaskmasked应完全被areamask隐藏,但结果未对齐。
下面我还附上了代码,以达到图中所示的结论。重新创建是我的原始光栅和矢量数据的一小块,使用相同的几何图形,属性值和crs。
我在Windows的R 4.2.2上使用terra_1.7-3。

library(terra)
library(dplyr)

# values for SpatRaster to be masked
cityraster_geom <- data.frame(
  x = c(381625, 381875, 381625, 381875, 381625, 381875, 382125, 382375, 381625, 381875, 382125, 382375), 
  y = c(6672875, 6672875, 6672625, 6672625, 6672375, 6672375, 6672375, 6672375, 6672125, 6672125, 6672125, 6672125))

cityraster_vals <- c(381, 157, NaN, NaN, 595, 186, NaN, NaN, 1117, 330, 70, 70, 1849, 679, 411, 496)

# values for SpatVector to be used as the mask
areamask_geom <- data.frame(
  geom = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7),
  x = c(381500, 381500, 381401, 381401, 381500, 381500, 381500, 381401, 381401, 381500, 381500, 381500, 381401, 381401, 381500, 381500, 381750, 381750, 381500, 381500, 382250, 382401, 382401, 382250, 382250, 381500, 381500, 381401, 381401, 381500, 381500, 381401, 381401, 381500, 381500),
  y = c(6672000, 6671900, 6671900, 6672000, 6672000, 6672250, 6672000, 6672000, 6672250, 6672250, 6672500, 6672250, 6672250, 6672500, 6672500, 6672750, 6672750, 6672500, 6672500, 6672750, 6672000, 6672000, 6671900, 6671900, 6672000, 6672750, 6672500, 6672500, 6672750, 6672750, 6672750, 6672750, 6673000, 6673000, 6672750)) %>% 
  as.matrix()

areamask_vals <- data.frame(
  x = c(381375, 381375, 381375, 381625, 382375, 381375, 381375),
  y = c(6671875, 6672125, 6672375, 6672625, 6671875, 6672625, 6672875),
  xyind = c(1, 2, 3, 4, 5, 6, 7))

# Create SpatRaster and SpatVector used for the masking
cityraster <- terra::rast(
  cityraster_geom,
  crs = "+proj=utm +zone=35 +ellps=GRS80 +units=m +no_defs")

cityraster[["focal"]] <- cityraster_vals

areamask <- terra::vect(
  areamask_geom,  
  "polygons", 
  atts = areamask_vals, 
  crs = "+proj=utm +zone=35 +ellps=GRS80 +units=m +no_defs")

masked <- terra::mask(cityraster, mask = areamask)
qco9c6ql

qco9c6ql1#

您的示例按预期工作:

plot(c(cityraster, masked), main="",
      fun=\()lines(areamask, lwd=3, col="blue"))

如果这不是你所追求的,那么也许你可以编辑你的问题,解释你希望发生什么。

相关问题