如何计算多个经纬度数据之间的距离?

问题描述 投票:0回答:1

我有1100个站点位置(纬度和经度)数据和10000个房屋位置(纬度和经度)数据。是否可以使用R代码计算每个房屋的车站与房屋之间的最小距离?我还希望每个房屋的距离最小的车站。有可能吗?

r distance latitude-longitude
1个回答
0
投票

[这是一个玩具示例,用于查找m点与n城市之间的质量距离。它应该直接转换为您的车站/房屋问题。

我抚养了大城市,旋转了地球(可以这么说),然后停在了四个城市。然后我再次旋转并停在两点。这里的两个数是无关紧要的:如果我们有4和2或1100和10000,那么关系不大。

worldcities <- read.csv(header = TRUE, stringsAsFactors = FALSE, text = "
lat,lon
39.7642548,-104.9951942
48.8588377,2.2770206
26.9840891,49.4080842
13.7245601,100.493026")

coords <- read.csv(header = TRUE, stringsAsFactors = FALSE, text = "
lat,lon
27.9519571,66.8681431
40.5351151,-108.4939948")

((快速提示...,至少在我的经验中,工具经常给我们提供“经度,纬度”坐标。但是geosphere函数假定为“经度,纬度”。因此,上面的坐标是从谷歌地图中的随机视图,并且我不想编辑它们;因此,我使用[,2:1]列索引反转了下面的列。如果您忘记了并给出了绝对不正确的坐标,则会出现错误Error in .pointsToMatrix(p1) : latitude < -90,这应该是您可能已经颠倒了坐标顺序的产物,这时您挠头想知道所有其他项目是否使用了错误的坐标,从而对您的结论提出了疑问,不是我,我从未去过那里。今年]

让我们找出每个coords(每行)与每个城市(每列)之间的距离,以米为单位:

dists <- outer(seq_len(nrow(coords)), seq_len(nrow(worldcities)),
               function(i, j) geosphere::distHaversine(coords[i,2:1], worldcities[j,2:1]))
dists
#            [,1]    [,2]     [,3]     [,4]
# [1,] 12452329.0 5895577  1726433  3822220
# [2,]   309802.8 7994185 12181477 13296825

直接找出哪个城市最接近每个坐标,>]

apply(dists, 1, which.min)
# [1] 3 1

即,第一点最靠近第三城市,第二点最靠近第一城市。

仅证明这是一个适用于大量对的可行的解决方案,这里的相同问题稍微扩大了一点。

worldcities_big <- do.call(rbind, replicate(250, worldcities, simplify = FALSE))
nrow(worldcities_big)
# [1] 1000
coords_big <- do.call(rbind, replicate(5000, coords, simplify = FALSE))
nrow(coords_big)
# [1] 10000
system.time(
  dists <- outer(seq_len(nrow(coords_big)), seq_len(nrow(worldcities_big)),
                 function(i, j) geosphere::distHaversine(coords_big[i,2:1], worldcities_big[j,2:1]))
)
#    user  system elapsed 
#   67.62    2.22   70.03 

所以

,它不是瞬时的,但是对于10,000,000距离计算而言,70秒并不可怕。你能使它更快吗?也许,不确定确切的方法,轻松地。我认为有些启发式方法可能会将其从O(m*log(n))时间减少到O(m*n),但我不知道这是否值得它引入的编码复杂性。
© www.soinside.com 2019 - 2024. All rights reserved.