在R中判断坐标点是否位于Shapefile多边形内的方法求助
解决方法
要判断点是否在多边形Shapefile内,核心是先把普通数据框转成sf空间点对象,再确保坐标系和多边形一致,最后用空间包含判断函数实现。以下是完整步骤:
1. 加载所需包并转换为空间对象
先确保已安装并加载sf包,再将你的数据框转为sf点对象,直接复用多边形的坐标系(避免坐标系不匹配导致的操作失败,这是空间分析常见问题):
library(sf) # 将普通数据框转为sf点对象,复用多边形的坐标系 df_sf <- st_as_sf(df, coords = c("lon", "lat"), crs = st_crs(shape))
2. 判断点是否在多边形内并填充结果
使用st_within()函数判断点是否被多边形包含,将返回的列表结果转换为1/0的数值,填入目标列:
# 逐个判断点是否在多边形内,返回逻辑值 is_within <- sapply(st_within(df_sf, shape), function(x) length(x) > 0) # 将逻辑值转为1(内部)/0(外部)并赋值 df$judge_whether_within_shp <- as.integer(is_within)
如果你的Shapefile包含多个多边形,st_within()会自动判断点是否在任意一个多边形内,符合需求。
替代方案:用st_intersects实现
如果st_within效果不佳,也可以用st_intersects(),逻辑完全一致:
is_intersect <- sapply(st_intersects(df_sf, shape), function(x) length(x) > 0) df$judge_whether_within_shp <- as.integer(is_intersect)
关于st_join失败的说明
st_join()是空间连接工具,默认会把多边形属性合并到点数据中,点不在多边形内时对应属性为NA。你也可以用这个特性间接判断,但需要额外处理NA值,不如直接用st_within直观:
# 空间连接,保留所有点 joined <- st_join(df_sf, shape, left = TRUE) # 根据是否存在多边形属性判断,转为1/0 df$judge_whether_within_shp <- as.integer(!is.na(joined[[names(shape)[1]]]))
内容的提问来源于stack exchange,提问作者Study_R_and_Python
相关产品推荐
相关产品推荐

