我有一组lng / lat坐标。计算集合中任意两点之间最大距离的有效方法是什么(“最大直径”,如果你愿意的话)?
一种天真的方式是使用Haversine formula计算每个2点之间的距离并获得最大值,但这显然不能很好地扩展。
编辑:这些点位于一个足够小的区域,用于测量携带移动设备的人在一天内活动的区域。
答案 0 :(得分:11)
定理#1:沿着地球表面任意两个大圆距离的排序与您穿过地球的点之间的直线距离的排序相同。
因此,根据任意半径的球形地球或给定形状参数的椭球,将您的纬度转换为x,y,z。这是每点的几个正弦/余弦(不是每对点)。
现在您有一个标准的3-d问题,不依赖于计算Haversine距离。点之间的距离只是欧几里德(在3d中的毕达哥拉斯)。需要一个平方根和一些正方形,如果你只关心比较,你可以省略平方根。
可能有花哨的空间树数据结构来帮助解决这个问题。或者算法,例如http://www.tcs.fudan.edu.cn/rudolf/Courses/Algorithms/Alg_ss_07w/Webprojects/Qinbo_diameter/2d_alg.htm(对于3d方法,单击“下一步”)。或者C ++代码:http://valis.cs.uiuc.edu/~sariel/papers/00/diameter/diam_prog.html
一旦找到最大距离对,就可以使用Haversine公式来获得该对的表面距离。
答案 1 :(得分:3)
这是一个天真的例子,不能很好地扩展(如你所说),正如你所说,但可能有助于在R中构建解决方案。
## lonlat points
n <- 100
d <- cbind(runif(n, -180, 180), runif(n, -90, 90))
library(sp)
## distances on WGS84 ellipsoid
x <- spDists(d, longlat = TRUE)
## row, then column index of furthest points
ind <- c(row(x)[which.max(x)], col(x)[which.max(x)])
## maps
library(maptools)
data(wrld_simpl)
plot(as(wrld_simpl, "SpatialLines"), col = "grey")
points(d, pch = 16, cex = 0.5)
## draw the points and a line between on the page
points(d[ind, ], pch = 16)
lines(d[ind, ], lwd = 2)
## for extra credit, draw the great circle on which the furthest points lie
library(geosphere)
lines(greatCircle(d[ind[1], ], d[ind[2], ]), col = "firebrick")
如果需要,geosphere
包为距离计算提供了更多选项。有关此处使用的详细信息,请参阅?spDists
中的sp
。
答案 2 :(得分:3)
您没有告诉我们这些点是否位于地球上足够小的部分。对于真正的全局点集,我的第一个猜测是运行一个朴素的O(n ^ 2)算法,可能通过一些空间索引(R * - 树,八叉树等)获得性能提升。我们的想法是在距离矩阵中预先生成三角形的n *(n-1)列表,并将其以块的形式提供给快速距离库,以最大限度地减少I / O和处理流失。 Haversine很好,你也可以用Vincenty的方法来做(运行时间的最大贡献者是二次复杂度,而不是Vincenty公式中的(固定数量)迭代)。事实上,作为旁注,你不需要R来做这些事情。
编辑#2: Barequet-Har-Peled algorithm (正如Spacedman在回复中指出的那样)有O((n + 1 /(e ^ 3))日志(1 / e))e> 0的复杂性,值得探索。
对于准平面问题,这被称为“凸壳直径”,有三个部分:
伪代码和讨论的链接:http://fredfsh.com/2013/05/03/convex-hull-and-its-diameter/
另请参阅此处有关相关问题的讨论:https://gis.stackexchange.com/questions/17358/how-can-i-find-the-farthest-point-from-a-set-of-existing-points
编辑:Spacedman的解决方案向我指出了Malandain-Boissonnat算法(参见pdf here中的文章)。然而,这与粗暴的O(n ^ 2)算法更糟或相同。