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
相关产品推荐
相关产品推荐

