我知道这是一条很长的路,但是在这个问题中,有一个公式可以自己计算距离。因此,如果我们将这些代码转换为 ,R
我们只需使用base R
.
功能 :
rad = function(x) {
return(x * pi / 180)
}
getDistance = function(p1, p2) {
R = 6378137 # Earth’s mean radius in meter
dLat = rad(p2[1] - p1[1])
dLong = rad(p2[2] - p1[2])
a = ( sin(dLat / 2) * sin(dLat / 2) +
cos(rad(p1[1])) * cos(rad(p2[1])) *
sin(dLong / 2) * sin(dLong / 2) )
c = 2 * atan2(sqrt(a),sqrt(1 - a))
d = R * c
return(d) # returns the distance in meter
}
例子 :
p1 <- c(55.32043 , -2.395500)
p3 <- c(55.15858 , -2.425284)
getDistance(p1,p3)
18115.96
因此,一旦我们可以调用这两个函数,我们就可以计算两个位置之间的任何距离。所以,
output <-lapply( 1:nrow(A), function(i)
lapply(1:nrow(B), function(j)
cbind(A[i,],B[j,],Distance=getDistance(as.numeric(A[i,-1]),as.numeric(B[j,-1])))
))
do.call(rbind,lapply(1:3,function(i) do.call(rbind,output[[i]])))
给,
reference latitude longitude reference latitude longitude Distance
1 C 55.32043 -2.395500 C 55.15858 -2.425284 18115.958
2 C 55.32043 -2.395500 D 55.60859 -2.065054 38260.562
3 C 55.32043 -2.395500 E 55.59062 -2.065024 36603.447
23 D 55.59062 -2.065024 C 55.15858 -2.425284 53219.597
21 D 55.59062 -2.065024 D 55.60859 -2.065054 2000.412
22 D 55.59062 -2.065024 E 55.59062 -2.065024 0.000
33 E 55.60859 -2.065054 C 55.15858 -2.425284 55031.092
31 E 55.60859 -2.065054 D 55.60859 -2.065054 0.000
32 E 55.60859 -2.065054 E 55.59062 -2.065024 2000.412