使用R语言sf包查找未被A多边形集完全覆盖的B多边形实现方法
R语言sf包筛选未被A完全覆盖的B多边形方案
不需要写循环逻辑,直接使用sf包内置的矢量化空间操作即可高效实现需求,具体实现逻辑如下:
- 第一步:先合并A的所有多边形为单一无重叠的整体要素,使用
st_union()而非st_combine(),因为st_union()会自动溶解重叠区域的边界,得到A的完整覆盖范围,避免后续逐个和A中多边形比对的冗余计算。 - 第二步:使用
st_within()空间谓词判断B中每个多边形是否完全被合并后的A包含,将sparse参数设为FALSE直接返回逻辑矩阵,方便筛选。 - 第三步:取逻辑值为FALSE的行,就是你需要的「完全不与A重叠」或「仅部分重叠未被完全覆盖」的B多边形。
实现代码
library(sf) # 先校验A和B投影一致,不一致需先转换为相同CRS # st_crs(B) == st_crs(A) # 可选步骤:如果要素存在拓扑错误先修复,避免判断异常 A_valid <- st_make_valid(A) B_valid <- st_make_valid(B) # 合并A为单个完整覆盖范围 A_union <- st_union(A_valid) # 筛选未被A完全覆盖的B多边形 B_filtered <- B_valid[!st_within(B_valid, A_union, sparse = FALSE)[,1], ]
说明
st_within(x, y, sparse = FALSE)返回的是n行x元素、m列y元素的逻辑矩阵,此处y是合并后的单个A要素,所以矩阵只有1列,值为TRUE代表对应的B要素完全落在A的覆盖范围内,取反后筛选正好匹配你需要的两类B要素。
单独使用st_intersects无法实现需求,因为st_intersects仅能判断两个要素是否存在空间重叠,无法区分「部分重叠」和「完全包含」两种情况,需要结合覆盖判断类的空间谓词使用。
内容的提问来源于stack exchange,提问作者coder11
相关产品推荐
相关产品推荐

