我正在尝试从纬度和经度计算一个位置与所有其他位置之间的距离。
我一直在使用argosfilter包中的distanceTrack计算结果位置之间的距离,这非常简单,因为这是我需要的代码才能使它工作:
lat<-lizard$Latitude
lon<-lizard$Longitude
distanceTrack(lat, lon)
但是现在我想要计算第一个位置和第二个位置之间的距离,然后计算所有位置的第一个和第三个位置之间的距离等。
我一直在寻找一种快速完成此操作的方法,因为我能够做到的唯一方法是手动将所需坐标复制并粘贴到不同的csv文件中,然后将其上传到R并运行上面的代码,这是艰苦的。我认为应用函数或类似的东西可能有用。那么应用函数是正确的前进方向吗?而且我不知道如何编写代码来指定行来计算它们之间的距离,所以任何帮助都会很好。
答案 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