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

R中sf::st_within明明有空间重叠却无匹配结果的问题

用sf包筛选多面对象的问题解决

问题根源

你用st_within得到空结果,不是函数有问题,是**st_within的判断逻辑不符合你的实际需求**:这个函数要求目标多边形完全被包含在筛选边界框内才会返回匹配,但美国大都市区(CBSA)的多边形基本都是跨纬度范围的,很少有完全落在36.5°以南的,所以哪怕视觉上有重叠,st_within也会判定为不匹配。

解决方法

方法一:保留所有与边界框重叠的要素(最常用)

如果你的需求是只要多边形和筛选框有交集就保留,直接把st_within换成st_intersects:

cbsa_22_S <- st_intersects(cbsa_22, filt_bbox)
cbsa_22_S1 <- cbsa_22[which(lengths(cbsa_22_S) != 0), ]

方法二:精确筛选完全在36.5°以南的要素

如果确实需要保留完全处于36.5°以南的多边形,直接计算每个多边形的最大纬度来筛选更准确:

# 计算每个多边形的最高纬度
cbsa_22 <- cbsa_22 %>%
  mutate(max_lat = st_coordinates(geometry)[, 2] %>% max())

# 筛选最高纬度≤36.5的要素
cbsa_22_S1 <- cbsa_22 %>% filter(max_lat <= 36.5)

额外检查:确认坐标系一致

虽然你已经设置了CRS,但可以再验证两者的坐标系是否完全匹配:

st_crs(cbsa_22) == st_crs(filt_bbox)

如果返回FALSE,重新设置筛选框的CRS为目标对象的坐标系(get_acs返回的CBSA默认是EPSG:4269)。

验证结果

可以用以下代码可视化筛选后的结果,确认是否符合预期:

plot(cbsa_22_S1$geometry, col = "#1f77b4")
plot(filt_bbox, col = NA, border = "#ff7f0e", lwd = 2, add = TRUE)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 05:26:13