基于OpenStreetMap数据在R中构建Voronoi图遇问题求助
解决st_voronoi的envelope参数报错与覆盖范围问题
报错原因分析
你遇到的vapply报错,本质是传入envelope参数的对象维度不符合要求:st_voronoi要求envelope必须是带Z/M维度的三维空间对象(比如POLYGON Z类型),而你传入的村域多边形大概率是二维的(仅POLYGON类型),二维空间对象的class长度为2,无法满足函数内部对三维对象的长度3检查,因此触发报错。
分步解决方案
1. 给村域多边形添加Z维度
先将二维的村域多边形转换为三维对象(Z值统一设为0即可):
# 假设你的村域多边形对象名为 village_poly village_poly_3d <- st_zm(village_poly, drop = FALSE, what = "Z")
st_zm函数的drop=FALSE参数会保留/添加指定维度,what="Z"就是强制添加Z维度。
2. 用三维多边形作为envelope构建Voronoi图
确保教堂点是sf的几何对象(sfc类型),再传入处理后的envelope:
# 假设教堂点对象名为 churches_points,先提取其几何部分 churches_sfc <- st_geometry(churches_points) # 生成带村域范围约束的Voronoi图 voronoi <- st_voronoi(churches_sfc, envelope = village_poly_3d)
3. 裁剪Voronoi图到村域边界
生成的Voronoi图是GEOMETRYCOLLECTION类型,需要先转为多边形,再裁剪以精确匹配村域:
# 将几何集合转为单个多边形列表 voronoi_polys <- st_cast(voronoi, "POLYGON") # 裁剪到村域范围 voronoi_clipped <- st_intersection(voronoi_polys, village_poly)
关于无envelope时覆盖不全的说明
不传入envelope参数时,st_voronoi会自动使用教堂点集的最小外接矩形作为约束范围,这个范围通常小于实际村域,因此生成的Voronoi图无法覆盖整个Wetwang村区域。通过上述步骤用村域多边形作为约束,并最终裁剪,就能得到完全覆盖村域的Voronoi分区。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

