基于边界与最小距离条件在凸包内生成随机点的技术求助
生成满足距离约束的随机点解决方案
以下是实现需求的完整代码,在你原有代码基础上添加了生成符合条件的随机点的逻辑:
# 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 contour of the area ch <- st_convex_hull(st_union(df.laea)) # -------------------------- # 生成符合条件的随机点部分 # -------------------------- # 为每个原始点创建10米缓冲区,然后取并集 buffer_zones <- st_buffer(df.laea, dist = 10) %>% st_union() # 计算可生成随机点的区域:凸包减去所有缓冲区 safe_area <- st_difference(ch, buffer_zones) # 在安全区域内生成10个随机点 set.seed(2) # 设置种子保证结果可复现 new_points <- st_sample(safe_area, size = 10, type = "random") # 可视化验证 ggplot() + geom_sf(data = ch, fill = "white", color = "black") + geom_sf(data = df.laea, color = "black", size = 2) + geom_sf(data = buffer_zones, fill = "lightgray", alpha = 0.5) + # 显示缓冲区 geom_sf(data = new_points, color = "red", size = 2) # 显示新生成的点
关键步骤说明
- 创建安全区域:通过
st_buffer给每个原始点生成10米的缓冲区,再用st_difference从凸包中减去这些缓冲区,得到的区域就是既在凸包内、又和所有原始点保持至少10米距离的区域。 - 生成随机点:使用
st_sample在安全区域内随机抽取指定数量的点,设置set.seed可以让结果固定可复现。 - 可视化验证:把缓冲区和新点都画出来,直观确认新点满足约束条件。
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

