获取具有简单特征的距离内的字段值总和 (sf)

Get sum of field values within distance with simple features (sf)

我正在尝试从 sf 对象的字段中获取到每个点的给定距离内的所有点的值总和,不包括该点的值。

set.seed(123);m=matrix(runif(30,1,40),ncol=3)
loc<-m %>% 
  as.data.frame %>% 
  sf::st_as_sf(coords = c(1,2))
a<-st_is_within_distance(loc,dist=10)
> a
Sparse geometry binary predicate list of length 10, where the predicate was `is_within_distance'
 1: 1, 6, 10
 2: 2, 4
 3: 3
 4: 2, 4
 5: 5, 8
 6: 1, 6
 7: 7, 9
 8: 5, 8
 9: 7, 9
 10: 1, 10

我们怎样才能得到一个数据框,其中包含这 10 个点的列表以及 V3 的总和?

    point|sum
    1    | sum_of_v3_of(6,10)
    2    | sum_of_v3_of(4)
...

使用 postgis 很容易做到这一点,但所有其他代码都在 R 中,我想学习如何做。

我们可能会做以下事情:

data.frame(point = 1:length(a), sum = sapply(a, function(p) sum(loc$V3[p])) - loc$V3)
#    point      sum
# 1      1 35.37012
# 2      2 39.77652
# 3      3  0.00000
# 4      4 28.01933
# 5      5 24.17154
# 6      6 35.69203
# 7      7 12.27723
# 8      8 26.57253
# 9      9 22.21857
# 10    10 35.69203

一旦我们注意到 a 是一个列表(参见 str(a)),它的第一个元素是 1、6、10,a[[1]],这就变得容易了loc 也是一个包含元素 V3 的列表,可以通过 loc$V3 访问该元素。因此,然后使用 sapply 我们遍历 a 的元素,查看 loc$V3 的相应元素并将它们相加。结果 sapply returns 一个向量,我们剩下的就是为结果创建数据框或矩阵。