使用具有自定义功能的R中的Haversine公式查找两个城市之间的距离

时间:2019-06-04 20:21:23

标签: r function distance geocoding haversine

我正在尝试使用R查找两点之间的距离。尽管我看到了其他答案(Find nearest cities from the data frame to the specific location),但我想使用特定的公式来计算距离(以英里为单位)。在另一个网站(https://andrew.hedges.name/experiments/haversine/)上,我发现用Java编写的这段代码可在其GUI中提供正确的距离:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script>

<div class="typewriter" class="username">
    <h1 class="first typing">
     [Your Name] blah blah
    </h1>
    <h1 class="second" style="visibility: hidden">
    [My Name] blah blah
    </h1>
    
</div>

然后我将其转换为R中的函数:

dlon = lon2 - lon1 
dlat = lat2 - lat1 
a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2 
c = 2 * atan2( sqrt(a), sqrt(1-a) ) 
d = 3961 * c

但是,它在某些位置给出了错误的答案。例如,中国香港的经度和纬度是114.17和22.31,美国大峡谷的经度和纬度分别是-112.11和36.11,最后是泰国的曼谷,分别是100.50和13.75。

在网站上,它正确地表示香港和曼谷距离 1075 英里,香港和大峡谷距离 7399 英里。相比之下,我的代码说香港距离曼谷 8078 英里,而距离大峡谷仅 4886 英里!

我的代码有什么问题?

1 个答案:

答案 0 :(得分:2)

您需要将度数转换为弧度。

从香港到大峡谷的距离

geo_distance(114.17*pi/180, -112.11*pi/180, 22.31*pi/180, 36.11*pi/180)

#[1] 7399.113

还要检查geosphere软件包和功能distHaversine

HongKong <- c(114.17, 22.31)
GrandCanyon <- c(-112.11, 36.11)

distHaversine(HongKong, GrandCanyon, r=6378137)
#[1] 11914303 distance in metres

distHaversine(HongKong, GrandCanyon, r=3961)
#[1] 7399.113 distance in miles