使用R在.shp多边形外边界生成随机位置的实现方法咨询
实现方案
方法1:沿用sp生态工具链(和你现有代码习惯完全兼容)
你不需要额外找新的采样函数,spsample本身就支持对线对象生成随机采样点,只需要先把多边形的外轮廓提取为线对象即可:
- 先加载
rgeos包调用gBoundary()提取多边形外边界:
library(rgeos) # 提取湖泊外边界为SpatialLines对象 lake_boundary <- gBoundary(lake) # 直接沿边界生成10个随机点 boundary_pts <- spsample(lake_boundary, n = 10, type = "random")
方法2:用sf包实现(更简洁的现代R空间操作方案)
如果可以接受切换到现在主流的sf空间数据框架,代码会更简洁,兼容性也更强:
library(sf) # 读取湖泊shapefile lake_sf <- st_read("湖泊文件路径.shp") # 提取外边界 lake_boundary <- st_boundary(lake_sf) # 沿边界生成10个随机点 boundary_pts <- st_sample(lake_boundary, size = 10, type = "random") # 若需要转回sp格式的点对象,加一行即可 boundary_pts_sp <- as(boundary_pts, "Spatial")
注意事项
- 如果你的湖泊多边形包含内环(比如湖中有岛),上述方法默认会同时在内岛的边界上采样,如果只需要最外侧的湖岸线,提取边界前先去掉多边形的内环即可:sp对象可遍历
Polygons槽只保留第一个外环,sf对象可通过st_geometry()提取几何后仅保留第一个环再转为线对象。 - 两种方法的随机采样默认都会按边界线段长度加权,不会出现短边和长边采样概率一致的偏差,符合常规沿边界随机采样的需求。
内容的提问来源于stack exchange,提问作者mchen
相关产品推荐
相关产品推荐

