使用光栅和形状文件约束对 R 中的随机点进行采样

问题描述 投票:0回答:1

我正在尝试根据 2 个条件对随机点进行采样:

  1. 在栅格的非 NA 单元中
  2. 在 shapefile 的多边形内部

我测试了

terra::spatSample()
功能,但无法满足第二个条件。

enter image description here

这是一个可重现的示例:

library(terra)
set.seed(1)
f <- system.file("ex/elev.tif", package="terra")
f <- terra::rast(f)

v <- system.file("ex/lux.shp", package="terra")
v <- vect(v)
v <- subset(v, v$NAME_2 != "Mersch")

test <- terra::crop(f, v, mask = TRUE)

sp <- terra::spatSample(test, 1000, method="random", replace=FALSE, na.rm=TRUE, as.df=TRUE, as.points=TRUE, xy=TRUE, warn=TRUE, weights=NULL)

plot(test)
plot(v, add = TRUE)
plot(sp, add = TRUE)
r gis raster shapefile terra
1个回答
0
投票

一种选择是首先将 f 转换为点 SpatVector,然后

intersect()
将所得点与 v 相交。这样,只会返回与 v 相交的点。然后您可以
sample()
您的积分:

library(terra)
library(tidyterra)
library(ggplot2)

set.seed(1)
f <- system.file("ex/elev.tif", package="terra")
f <- rast(f)

# Convert f to points SpatVector
p <- as.points(f, na.rm = TRUE)

v <- system.file("ex/lux.shp", package="terra")
v <- vect(v)
v <- subset(v, v$NAME_2 != "Mersch")

# Return p if intersects() with v
p <- intersect(p, v)

# Sample p
sp <- sample(p, 1000)

# Plot
ggplot() +
  geom_spatraster(data = f) +
  geom_spatvector(data = v) +
  geom_spatvector(data = sp) +
  coord_sf(xlim = c(5.8, 5.9),
           ylim = c(49.5, 49.6)) +
  scale_fill_continuous(na.value = "transparent") +
  scale_x_continuous(breaks = seq(5.8, 5.9, length.out = 3)) +
  theme(panel.background = element_blank())

result

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.