r 空间连接多重标准

r spatial join-multiple criteria

我有两个 sf 数据集,我想找到 10 个最近的邻居,不仅基于距离,还基于对另一列的数学运算。 例如:

a = st_sf(a = 1:3, DD=c("d1","d2","d3"),
 geom = st_sfc(st_point(c(1,1)), st_point(c(2,2)), st_point(c(3,3))))
b = st_sf(a = 11:14,DD=c("d1","d2","d2"),
 geom = st_sfc(st_point(c(10,10)), st_point(c(2,2)), st_point(c(2,2)), st_point(c(3,3))))

我想在“b”中找到“a”的邻居具有相同的“DD”列值。 目前我正在使用这个 approach 基于 sfnngeo:

st_join(a, b, join = st_nn, k = 1, progress = FALSE)

但这仅基于几何连接点,我也不知道如何将 DD 考虑在内。

谢谢!

我也在 gis.spatexchange

上发布了这个问题

不确定是否完全理解,但我试一试!因此,请在下面找到一种仅使用 sf 库和一些 base R 函数的可能解决方案。

“策略”是根据DD列将dataframesab转换为dataframes的列表(参见base R 函数 split()) 然后,使用函数 sf::st_join() 及其参数 join = st_nearest_feature 为每个 DDdataframe 之间执行连接。最后,最后一个操作是使用base R函数rbind().

将不同连接的结果列表转换为dataframe

Reprex

  • 代码
library(sf)

a <- a[a$DD %in% b$DD,] # added following the OP's comment
b <- b[b$DD %in% a$DD,] # added following the OP's comment

a_list <- split(a, a$DD)
b_list <- split(b, b$DD)

result <- do.call(rbind,Map(st_join, a_list, b_list, MoreArgs = list(join = st_nearest_feature)))
  • 输出
result
#> Simple feature collection with 3 features and 4 fields
#> Geometry type: POINT
#> Dimension:     XY
#> Bounding box:  xmin: 1 ymin: 1 xmax: 3 ymax: 3
#> CRS:           NA
#>    a.x DD.x a.y DD.y        geom
#> d1   1   d1  11   d1 POINT (1 1)
#> d2   2   d2  12   d2 POINT (2 2)
#> d3   3   d3  14   d3 POINT (3 3)
  • 数据

    注意:我在 b

    中添加了 "d3"
a = st_sf(a = 1:3, DD=c("d1","d2","d3"),
          geom = st_sfc(st_point(c(1,1)), st_point(c(2,2)), st_point(c(3,3))))
b = st_sf(a = 11:14,
          DD=c("d1","d2","d2","d3"),geom = st_sfc(st_point(c(10,10)), st_point(c(2,2)), st_point(c(2,2)), st_point(c(3,3))))

reprex package (v2.0.1)

于 2022-02-17 创建