在我的例子中,我有:
# Packages
library(sf)
library(ggplot2)
# Create some points
set.seed(1)
df <- data.frame(
gr = c(rep("a",5),rep("b",5)),
x = rnorm(10),
y = rnorm(10)
)
df <- st_as_sf(df,coords = c("x","y"),remove = F, crs = 4326)
df.laea = st_transform(
df,
crs = "+proj=laea +x_0=4600000 +y_0=4600000 +lon_0=0.13 +lat_0=0.24 +datum=WGS84 +units=m"
)
# Create a countour of the area
ch <- st_convex_hull(st_union(df.laea))
ggplot() +
geom_sf(data = ch, fill = "white", color = "black") +
geom_sf(data = df.laea,color = "black")
现在,我想创建10个随机点,但条件是这些点必须位于ch
边界内,并且与ch
区域内的每个df.laea
点的最小距离为10米。
拜托,能帮上忙吗?
3条答案
按热度按时间amrnrhlw1#
我认为这里唯一棘手的事情是,一个简单的
st_difference()
的多边形和缓冲点将返回十个多边形,每个都删除了其中一个点。因此,您必须使用for
循环或reduce()
从多边形中逐个删除缓冲点。要使用reduce()
,你必须把向量转换成一个sf
的列表,而不是一个sfc
向量,这就是我下面所做的。w9apscun2#
你可以按照你想要的距离缓冲这些点,然后将这些多边形与
ch
多边形相交,然后使用st_sample
和相关的参数来得到你想要的点。示例代码:
由reprex package(v2.0.1)于2023年2月14日创建
ryevplcw3#
作为对shs的回答的评论:可以首先对DF.LaEA对象使用X1 M0 N1 X调用,并将10个点合并为单个多点几何形状。
当缓冲时,这将作为必要的
sf::st_difference()
调用的输入,以形成带有孔的采样区域,从而消除对for cycle / map & reduce调用的需要。