R中如何提取data frame中落在手绘多边形内的空间数据子集
R语言提取手绘多边形内点位数据的实现方案
方案1:使用已加载的splancs包(无需额外安装依赖)
你已经加载了splancs包,直接用包内自带的inpip函数即可完成筛选,该函数专门用于判断点是否落在多边形内部:
# 1. 提取数据框中的坐标列,将下方的"x"、"y"替换为你实际的坐标列名 points_xy <- as.matrix(df[, c("x", "y")]) # 2. 获取所有落在多边形内部的点的行索引 inside_idx <- inpip(points_xy, polygon_xy) # 3. 子集化得到仅包含多边形内点位的结果 df_inside <- df[inside_idx, ]
如果需要包含多边形边界上的点位,可以替换为splancs包的inout函数实现:
inside_idx <- which(inout(points_xy, polygon_xy, bound = TRUE)) df_inside <- df[inside_idx, ]
你可以通过绘图快速验证筛选结果是否正确:
# 绘制所有点位(灰色) plot(df$x, df$y, col = "gray", pch = 16) # 绘制手绘研究区域(红色边框) polygon(polygon_xy, border = "red", lwd = 2) # 绘制筛选后的内部点位(蓝色) points(df_inside$x, df_inside$y, col = "blue", pch = 16)
方案2:使用sf包做规范空间操作
如果你后续还要做更多空间分析,推荐用空间数据专用的sf包实现,逻辑更清晰也兼容更多空间操作:
library(sf) # 1. 将普通数据框转为空间点位对象,crs参数填写你数据对应的坐标系,无投影可填NA df_sf <- st_as_sf(df, coords = c("x", "y"), crs = NA) # 2. 将手绘多边形坐标转为空间多边形对象 poly_sf <- st_polygon(list(rbind(polygon_xy, polygon_xy[1,]))) %>% st_sfc(crs = NA) # 3. 筛选与多边形相交的点位 df_inside_sf <- df_sf[st_intersects(df_sf, poly_sf, sparse = FALSE), ] # 可选:去除空间列,转回普通数据框 df_inside <- st_drop_geometry(df_inside_sf)
注意事项
- 需保证数据框中的坐标列、之前绘图用的坐标、
getpoly拾取的坐标三者的范围、坐标系完全一致,否则会出现筛选错误 - 若手绘多边形存在自相交的情况,建议重新绘制规整的多边形,避免筛选结果异常
内容的提问来源于stack exchange,提问作者lostnewbiecoder
相关产品推荐
相关产品推荐

