【问题标题】:For each point in one data set, calculate distance to nearest point in second data set对于一个数据集中的每个点,计算到第二个数据集中最近点的距离
【发布时间】:2016-05-19 20:48:56
【问题描述】:

试图为SpatialPointsDataFrame 中的每个点找到一秒钟SpatialPointsDataFrame 到最近点的距离(相当于ArcGIS 中两个SpatialPointDataFrames 的“最近”工具)。

我可以通过使用gDistance 计算所有成对距离并采用min (like answer 1 here) 来进行简单的实现,但我有一些庞大的数据集,并且正在寻找更有效的方法。

例如,这里是trick with knearneigh for points in same dataset

r-sig-geo上交叉发布

【问题讨论】:

  • 看起来sp 包中的spDists 可能适用于您想要的。前两个参数似乎是不同的矩阵,可用于表示您的示例中的两组点。无论如何都值得一看。
  • @Imo 谢谢!看起来它仍在计算每一对,所以可能有同样的性能问题。将检查 gDistance,但似乎他们在做大致相同的事情。
  • 请不要交叉发帖。
  • @JoshO'Brien 为什么不呢?如果我在一个页面上得到答案,我总是把它带回另一个页面,但列表服务于不同的人群——这样知识就会扩散!
  • 主要是因为它最终成为支持社区的额外负担。例如,如果我知道 Michael Sumner 已经在 R-sig-geo 上给了你一个答案,我就不会花时间整理这个答案。 (当然,我很遗憾没有通读您的问题以查看交叉发布。)也就是说,至少感谢您留下您交叉发布的便条。

标签: r gis geospatial sp geos


【解决方案1】:

SearchTrees 包提供了一种解决方案。引用其文档,它“提供了 QuadTree 数据结构的实现 [它] 用于在二维中实现快速 k-最近邻 [...] 查找。”

您可以使用它来快速查找SpatialPoints 对象b 中的每个点,第二个SpatialPoints 对象B 中最近的两个点

library(sp)
library(SearchTrees)

## Example data
set.seed(1)
A <- SpatialPoints(cbind(x=rnorm(100), y=rnorm(100)))
B <- SpatialPoints(cbind(x=c(-1, 0, 1), y=c(1, 0, -1)))

## Find indices of the two nearest points in A to each of the points in B
tree <- createTree(coordinates(A))
inds <- knnLookup(tree, newdat=coordinates(B), k=2)

## Show that it worked
plot(A, pch=1, cex=1.2)
points(B, col=c("blue", "red", "green"), pch=17, cex=1.5)
## Plot two nearest neigbors
points(A[inds[1,],], pch=16, col=adjustcolor("blue", alpha=0.7))
points(A[inds[2,],], pch=16, col=adjustcolor("red", alpha=0.7))
points(A[inds[3,],], pch=16, col=adjustcolor("green", alpha=0.7))

【讨论】:

  • 嗨乔希,我有同样的问题,但你的回答实际上并没有回答完整的问题。这提供了 A 中最近点的坐标,但不提供从 B 中的点到 A 中的点的 距离。您能否添加额外的代码来提供一个向量(或 2 个向量) 的最小距离?一个向量,然后可以作为 shapefile A 中的数据列添加回来?
  • @LeahBevis 这应该可以为您提供到inds:t(sapply(seq_len(nrow(inds)), function(i) spDists(B[i, ], A[inds[i, ],]))) 中索引的每个点的距离。 HTH。
  • 非常感谢!这太棒了。对于未来的用户,我不了解 inds: bit,也不需要 t(),但是当我这样应用它时它起作用了:distkm &lt;- sapply(seq_len(nrow(inds)), function(i) spDists(tzprice.shp[i, ], market.shp[inds[i, ],]))
  • 另外,我认为答案在 KM 中,即使我没有在 spDists 中指定 longlat = FALSE。无论我是否指定该选项,输出都是相同的。另外,请随时查看此相关帖子 :) 仍然想知道以米/公里为单位获取到最近线路距离的最快方法。 *.com/questions/62335329/…
【解决方案2】:

R-Sig-Geo 的另一个建议是 nabor 库中的 knn 函数。

【讨论】:

  • 嗨尼克,我找到了你的交叉发布(总是很高兴实际提供链接;我找到了这个stat.ethz.ch/pipermail/r-sig-geo/2016-May/024452.html),但它似乎没有提供以公里或米为单位的距离。似乎是基于坐标的某种欧几里得距离?你真的使用这个 knn 函数(或上面 Josh 的技巧)来计算物理距离吗?如果是这样,你能分享一下吗?谢谢!!
最近更新 更多