使用sf::st_within判断点是否在多边形内结果异常问题排查
问题:sf包判断点是否在多边形内结果与实际不符
场景重现
- 两个采用WGS84投影的sf对象:
sf_object:存储船舶轨迹点的点要素数据框border:由shapefile转换而来的多边形边界要素
- 绘图可见部分轨迹点位于多边形外,但执行以下代码后,结果显示所有点都在多边形内:
sf_object$InCanada<-st_within(border_sf$geometry,sf_object$geometry, sparse=F)%>%diag()
问题根源
st_within()的参数顺序完全搞反了:
- 该函数的第一个参数是「待判断的目标要素」(这里是船舶轨迹点),第二个参数是「参考边界要素」(这里是多边形border)
- 当前写法是判断「多边形是否包含在每个点内」,完全违背业务逻辑,错误的参数顺序导致返回结果失真
修正方案
调换参数顺序,正确写法如下:
# 直接判断每个点是否在多边形内,返回N×1的逻辑矩阵 inside_matrix <- st_within(sf_object$geometry, border$geometry, sparse = FALSE) # 将矩阵转为向量,添加到sf_object中 sf_object$InCanada <- inside_matrix[, 1] # 或者用sparse=TRUE的更高效写法 sf_object$InCanada <- lengths(st_within(sf_object$geometry, border$geometry)) > 0
额外注意事项
- 示例代码存在语法错误,比如
POINT (-125.139 48 83)应为POINT (-125.139 48.83),且创建sf对象不能用c(),需用st_sf(),实际使用时要确保数据格式正确 - 若
border包含多个多边形,st_within()会判断点是否在任意一个多边形内;若需判断点在特定多边形内,需指定对应要素
内容的提问来源于stack exchange,提问作者FanCou
相关产品推荐
相关产品推荐

