【发布时间】:2020-10-22 22:14:29
【问题描述】:
我有一个数据框,其坐标已转换为 R 中的 sf 对象,如下所示:
> head(df1)
Cell_ID Spot_ID X Y
1 0 600000000 193.722 175.733
2 0 600000001 192.895 176.727
3 0 600000002 193.828 177.462
4 8 600000003 178.173 178.220
5 7 600000004 187.065 178.285
6 0 600000005 190.754 178.186
> df1_sf <- st_as_sf(df1,
coords = c('X', 'Y')) %>%
group_by(Cell_ID) %>%
summarise() %>%
ungroup() %>%
st_convex_hull()
>plot(st_geometry(df1_sf), border = "red")
现在我想获取每个多边形的邻居的 ID。为此,我正在这样做
n = st_set_geometry(st_intersection(df1_sf,df1_sf), NULL)
head(n)
# A tibble: 6 x 2
Cell_ID Cell_ID.1
<int> <int>
1 0 0
2 7 0
3 51 0
4 1 1
5 4 1
6 5 1
但这是一项平庸的工作,因为它需要一个交叉点,而如果它们是最近的交叉点,我也对它们感兴趣(虽然没有像下图中那样接触,但 Cell_ID 1 将具有相邻单元格 3-6 但还将检测到单元格 7,因为它位于给定的半径内)。 谁能帮我解决这个问题?
【问题讨论】:
-
您能澄清一下您所说的“邻居”是什么意思吗?在您的示例图片中,多边形 2 是否也应算作邻居?你想包括 7,还是排除 7?介于 6 和 7 之间的多边形呢?
-
抱歉,多边形 1 的邻居是:2,3,4,5,6,因为 st_intersect 会选择,但我还想添加 7,因为虽然不相交,但它已经接近了半径。
-
您可以
sf::st_buffer()每个多边形将边界扩展到您所需的“半径”,然后找到所有接触的边界? -
这是个好主意。我也想过,但不知道怎么做。现在试试,看起来很有希望!