计算R中纬度和经度坐标的距离

时间:2015-04-12 03:52:13

标签: r

我正在尝试从纬度和经度计算一个位置与所有其他位置之间的距离。

我一直在使用argosfilter包中的distanceTrack计算结果位置之间的距离,这非常简单,因为这是我需要的代码才能使它工作:

    lat<-lizard$Latitude
    lon<-lizard$Longitude
    distanceTrack(lat, lon)

但是现在我想要计算第一个位置和第二个位置之间的距离,然后计算所有位置的第一个和第三个位置之间的距离等。

我一直在寻找一种快速完成此操作的方法,因为我能够做到的唯一方法是手动将所需坐标复制并粘贴到不同的csv文件中,然后将其上传到R并运行上面的代码,这是艰苦的。我认为应用函数或类似的东西可能有用。那么应用函数是正确的前进方向吗?而且我不知道如何编写代码来指定行来计算它们之间的距离,所以任何帮助都会很好。

2 个答案:

答案 0 :(得分:2)

 earthDist <- function (lon1, lat1, lon2, lat2){
    rad <- pi/180
    a1 <- lat1 * rad
    a2 <- lon1 * rad
    b1 <- lat2 * rad
    b2 <- lon2 * rad
    dlon <- b2 - a2
    dlat <- b1 - a1
    a <- (sin(dlat/2))^2 + cos(a1) * cos(b1) * (sin(dlon/2))^2
    c <- 2 * atan2(sqrt(a), sqrt(1 - a))
    R <- 6378.145
    d <- R * c
    return(d)
}

earthDist(lon[1], lat[1], lon, lat)

答案 1 :(得分:-1)

示例输入数据我将使用:

p <- data.frame(lat=runif(6,-90,90), lon=runif(6,-180,180) );
p;
##         lat        lon
## 1 -27.85808  160.23800
## 2  31.14363  -45.22589
## 3 -50.01119   48.84754
## 4  68.11402   71.46464
## 5  45.58087 -104.46365
## 6  87.49930  -88.12699

如果您只想要第一个点与所有后续点之间的距离,您可以这样做:

d <- sapply(2:nrow(p), function(x) distance(p$lat[x],p$lat[1],p$lon[x],p$lon[1]) );
d;
## [1] 17517.58  9037.04 12806.45 12557.67 13196.02

如果你想要所有积分组合,那就更复杂了。在下面,我已经从一个简单的向量切换到data.frame的结果,所以两个点索引可以存储在每个距离值旁边:

d <- setNames(do.call(rbind.data.frame,combn(1:nrow(p),2,simplify=F)),c('p1','p2'));
d$dist <- sapply(1:nrow(d), function(r) distance(p$lat[d$p1[r]],p$lat[d$p2[r]],p$lon[d$p1[r]],p$lon[d$p2[r]]) );
d;
##    p1 p2      dist
## 1   1  2 17517.583
## 2   1  3  9037.040
## 3   1  4 12806.448
## 4   1  5 12557.672
## 5   1  6 13196.020
## 6   2  3 12868.340
## 7   2  4  7815.027
## 8   2  5  5276.540
## 9   2  6  6338.329
## 10  3  4 13259.829
## 11  3  5 17961.347
## 12  3  6 15757.656
## 13  4  5  7363.244
## 14  4  6  2694.062
## 15  5  6  4669.714