如何在R语言中判断坐标点是否处于osmdata获取的Multipolygon内?
解决sf::st_contains判断点是否在OSM Multipolygon内返回空的问题
排查步骤与解决方案
1. 确认并统一坐标系
首先检查多边形和点的CRS是否完全一致,OSM数据默认是WGS84(EPSG:4326),但偶尔会出现CRS未正确识别的情况:
# 查看多边形CRS st_crs(dat1$osm_multipolygons) # 查看点的CRS st_crs(ptCoord) # 若不一致,转换多边形到点的坐标系 poly <- if (st_crs(dat1$osm_multipolygons) != st_crs(ptCoord)) { st_transform(dat1$osm_multipolygons, st_crs(ptCoord)) } else { dat1$osm_multipolygons }
2. 修复无效几何对象
OSM获取的Multipolygon可能存在自相交、环方向错误等几何无效问题,这会导致空间判断函数失效:
# 检查多边形是否有效 st_is_valid(poly) # 修复无效几何 poly <- st_make_valid(poly)
3. 换用st_within或调整参数顺序
st_contains(a, b) 判断的是a是否包含b,而st_within(b, a) 判断的是b是否在a内部,两者逻辑等价但有时结果呈现更直观。同时关闭稀疏返回,直接得到布尔值:
# 用st_within判断点是否在多边形内 result <- st_within(ptCoord, poly, sparse = FALSE) print(result) # 输出TRUE表示点在内部,FALSE则不在 # 或者用st_contains的反向验证 result2 <- st_contains(poly, ptCoord, sparse = FALSE) print(result2)
4. 拆分Multipolygon为单个Polygon检查
如果获取的是包含多个子多边形的Multipolygon,拆分后逐个判断能更精准定位:
# 拆分多面为单个多边形 poly_single <- st_cast(poly, "POLYGON") # 逐个检查每个子多边形是否包含点 contains_check <- sapply(poly_single, function(x) { st_within(ptCoord, x, sparse = FALSE)[1, 1] }) # 只要有一个子多边形包含点,结果即为TRUE any(contains_check)
5. 可视化验证
直观确认点和多边形的位置关系,排除坐标输入错误:
plot(poly, main = "Polygon and Point") plot(ptCoord, add = TRUE, col = "red", pch = 19, cex = 1.5)
内容的提问来源于stack exchange,提问作者leefyl
相关产品推荐
相关产品推荐

