You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

额外注意事项

  1. 示例代码存在语法错误,比如POINT (-125.139 48 83)应为POINT (-125.139 48.83),且创建sf对象不能用c(),需用st_sf(),实际使用时要确保数据格式正确
  2. 若border包含多个多边形,st_within()会判断点是否在任意一个多边形内;若需判断点在特定多边形内,需指定对应要素

内容的提问来源于stack exchange,提问作者FanCou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 21:15:06