测量坐标的纬度和经度对之间的距离

时间:2016-06-10 08:07:53

标签: r gis distance

有43000对坐标,你可以想象这使得这个使用下面的嵌套循环运行的过程非常漫长,我只是不知道如何更快地完成这项工作并排除循环。

下面是我的代码,基于我在网上找到的内容以及我对使用R的Basic的非常古老和有限的了解。请教我如何在一个更有效和更优雅的代码块中完成此任务。在所有可能的。

for (i in 1:length(FixedAssets$Lat)) {
    for (p  in 1:length(FixedAssets$Lat)) {
        dist <- distCosine(as.vector(c(FixedAssets$Longitude[i],FixedAssets$Latitude[i]), mode = "any"), as.vector(c(FixedAssets$Longitude[p],FixedAssets$Latitude[p]), mode = "any"), r = 6378137)
    if (dist < 200) { FixedAssets$prox200[i] = FixedAssets$prox200[i] + 1 }
    if (dist < 500) { FixedAssets$prox500[i] = FixedAssets$prox500[i] + 1 }
    if (dist < 1000) { FixedAssets$prox1000[i] = FixedAssets$prox1000[i] + 1 }
    if (dist < 2000) { FixedAssets$prox2000[i] = FixedAssets$prox2000[i] + 1 }
    if (dist < 3000) { FixedAssets$prox3000[i] = FixedAssets$prox3000[i] + 1 }
    if (dist < 5000) { FixedAssets$prox5000[i] = FixedAssets$prox5000[i] + 1 }
    if (dist < 10000) { FixedAssets$prox10000[i] = FixedAssets$prox10000[i] + 1 }
    if (dist < 20000) { FixedAssets$prox20000[i] = FixedAssets$prox20000[i] + 1 }    
    }
print(i)

}

3 个答案:

答案 0 :(得分:3)

您可以使用sp-package中的spDists有效地执行此操作。实际的距离计算是用C语言完成的,而不是R语言.R语言等解释语言中的循环非常慢。

答案 1 :(得分:1)

来自spDist包的distm替代geoshere。但是,它需要更多时间来计算距离:

library(maps)
library(geosphere)
library(sp)

data(world.cities)
system.time(d <- distm(world.cities[1:10000, c("long", "lat")]))
#  User      System verstrichen 
# 69.72        0.59       70.77 

system.time(d2 <- spDists(as.matrix(world.cities[1:10000, c("long", "lat")]), longlat = T))
# User      System verstrichen 
# 66.11        0.48       66.89 

as.dist(round(d[1:5, 1:5]/1000, 1))
#        1      2      3      4
# 2    1.5                     
# 3 3589.8 3588.7              
# 4 1327.5 1326.6 2326.7       
# 5  105.9  104.4 3510.2 1270.1
as.dist(round(d2[1:5, 1:5],1))
#        1      2      3      4
# 2    1.5                     
# 3 3592.9 3591.8              
# 4 1328.4 1327.5 2328.6       
# 5  105.6  104.1 3513.3 1270.8

答案 2 :(得分:1)

这是一个非常快速的解决方案,使用header("refresh:5; url=otherpage.php"); data.table来计算椭圆体上的距离。

distGeo{geosphere}

可重复示例的数据

library(geosphere)
library(data.table)

setDT(dt)[ , dist_km := distGeo(matrix(c(long, lat), ncol = 2), 
                                  matrix(c(long_dest, lat_dest), ncol = 2))/1000]