如何批量检查各组点是否属于对应组的多边形?
问题:检查分组点是否在对应多边形内
数据说明
多边形数据框 df_poly
x y point Group_Name 1 479 165 top_left G03 2 161 713 bottom_left G03 3 795 713 bottom_right G03 4 785 291 top_right G03 5 373 477 top_left G04 6 340 717 bottom_left G04 7 1075 653 bottom_right G04 8 823 274 top_right G04 9 508 300 top_left G06 10 208 712 bottom_left G06 11 862 709 bottom_right G06 12 874 456 top_right G06
待检查点数据框 df_point
Group_Name xcentre ycentre 1 G03 278.0 139.5 2 G03 216.0 139.5 4 G03 685.5 24.5 5 G03 680.5 25.5 6 G03 217.5 131.0 7 G03 670.5 22.0 8 G03 330.0 264.5 9 G03 552.5 72.5 10 G03 329.5 267.5 13 G03 391.5 682.0 14 G03 587.0 644.5 15 G04 483.5 562.0 16 G04 456.0 340.5 17 G06 619.0 651.0 18 G06 456.0 340.5 19 G06 455.5 338.5 20 G06 328.0 271.0
原代码问题分析
你用的代码错误在于:
- 直接引用全局的
df_poly$x和df_poly$y,没有按Group_Name筛选当前组对应的多边形坐标,导致每个组都在检查所有多边形的组合。 - 使用
summarise会尝试聚合结果,但pip2d返回的是每个点的逻辑值,最终导致行数异常。
正确解决方法
方法1:预存多边形列表 + 分组处理
先把每个组的多边形坐标整理成命名列表,再对df_point分组后匹配对应多边形进行检查:
library(dplyr) library(pracma) # 按组整理多边形坐标为命名列表 poly_list <- df_poly %>% group_by(Group_Name) %>% summarise(poly = list(cbind(x, y))) %>% tibble::deframe() # 检查每个点是否在对应组的多边形内 df_result <- df_point %>% group_by(Group_Name) %>% mutate(inside = pip2d(poly_list[[cur_group()$Group_Name]], cbind(xcentre, ycentre))) %>% ungroup()
方法2:使用group_map逐组处理
直接对df_point分组后,每个组单独筛选对应多边形并检查:
library(dplyr) library(pracma) df_result <- df_point %>% group_by(Group_Name) %>% group_map(function(.x, .y) { # 获取当前组的多边形坐标矩阵 current_poly <- df_poly %>% filter(Group_Name == .y$Group_Name) %>% select(x, y) %>% as.matrix() # 为当前组的每个点添加是否在多边形内的标记 .x %>% mutate(inside = pip2d(current_poly, cbind(xcentre, ycentre))) }) %>% bind_rows()
两种方法都会保留df_point的所有原始行,并新增inside列,值为TRUE(点在多边形内)或FALSE(点在多边形外)。
内容的提问来源于stack exchange,提问作者Giulia Ciminelli
相关产品推荐
相关产品推荐

