如何为地理坐标匹配ADM2级区域?sf空间连接后数据无变化问题
坐标匹配ADM2级区域失败问题排查
我有一份包含非洲定位个体的面板数据集,想要为每个坐标匹配对应的ADM2级区域。导入贝宁的shapefile获取区域多边形后,尝试用以下sf代码判断坐标是否在多边形内以匹配区域,但执行后panel_sf和panel_with_regions没有差异:
panel_sf %<>% filter(cname=="Benin") regions <- st_read("G:/Mon Drive/Working paper/Trust/Script/Data/Data_Raw/gadm41_BEN_2.shp") regions_valid <- st_make_valid(regions) panel_sf <- st_as_sf(panel_sf, coords = c("longitude", "latitude"), crs = st_crs(regions_valid)) panel_with_regions <- st_join(panel_sf, regions_valid)
可能的解决方向
- 确认CRS完全一致:用
st_crs(panel_sf)和st_crs(regions_valid)分别输出查看坐标系代码,确保两者完全相同。如果不一致,执行panel_sf <- st_transform(panel_sf, st_crs(regions_valid))强制转换。 - 验证点与多边形的交集:抽取单个点执行
st_intersects(panel_sf[1,], regions_valid),如果返回空,检查是否坐标输入颠倒(纬度/经度搞反),或者原始坐标数据有误。 - 明确连接逻辑:修改
st_join时指定连接方式,比如panel_with_regions <- st_join(panel_sf, regions_valid, join = st_within),用更严格的“点在多边形内”判断替代默认逻辑。 - 检查多边形有效性:执行
table(st_is_valid(regions_valid))查看是否存在无效多边形,过滤后再尝试连接:regions_valid <- regions_valid[st_is_valid(regions_valid),]。 - 对比数据维度:用
dim(panel_sf)和dim(panel_with_regions)列数对比,如果列数增加,说明已匹配成功,只是需查看新增的区域字段;列数无变化则说明连接未生效,优先排查CRS或坐标问题。
内容的提问来源于stack exchange,提问作者redha
相关产品推荐
相关产品推荐

