You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量检查各组点是否属于对应组的多边形?

问题:检查分组点是否在对应多边形内

数据说明

多边形数据框 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:05:38