计算两地点间距离

背景:

  我们想知道地图上面两个点之间的距离是多少,我们应该怎么计算呢?

 

首先:我们得知道两点简单经纬度

其次:我们需要选择精度比较好的距离算法

最后:我们需要怎么来实现

 

1、我们先来看看有哪些距离算法?

球面距离计算可直接通过球面几何推导。较常用的计算公式有大圆(Great-circle)公式、Haversine公式等。另外还有Vincenty公式被应用到Astropy等代码库中

他们的计算公式如下:

#大圆公式

d=arccos[sinδ1sinδ2+cosδ1cosδ2cos(α1−α2)]

 

haversine公式:

vincentry公式:

d=arctan [cosδ2sin(α1−α2)]^2+[cosδ1sinδ2−sinδ1cosδ2cos(α1−α2)]^2 √sinδ1sinδ2+cosδ1cosδ2cos(α1−α2) 

 

 

 

从学术文档:http://html.rhhz.net/Jwk_twyjyjs/html/20190109.htm中可以看出其中效率、准确度综合来看,haversine会比较好点

 

2、距离计算例子

from math import sin, asin, cos, radians, fabs, sqrt
 
EARTH_RADIUS=6371           # 地球平均半径,6371km
 
def hav(theta):
    s = sin(theta / 2)
    return s * s
 
def get_distance_hav(lat0, lng0, lat1, lng1):
    "用haversine公式计算球面两点间的距离。"
    # 经纬度转换成弧度
    lat0 = radians(lat0)
    lat1 = radians(lat1)
    lng0 = radians(lng0)
    lng1 = radians(lng1)
 
    dlng = fabs(lng0 - lng1)
    dlat = fabs(lat0 - lat1)
    h = hav(dlat) + cos(lat0) * cos(lat1) * hav(dlng)
    distance = 2 * EARTH_RADIUS * asin(sqrt(h)) #sqrt是平方根
 
    return distance
#这里的例子:
#上海市徐汇区桂箐路靠近华鑫天地的经纬度: 121.407124,31.169677
#上海市浦东新区张江高科技园的经纬度: 121.593357,31.214343
#lon1 = 121.407124
#lat1 = 31.169677
#lon2 = 121.593357
#lat2 =31.214343
print get_distance_hav(121.407124,31.169677,121.593357,31.214343)

 

posted on 2020-11-08 23:27  gentleman_hai  阅读(704)  评论(0编辑  收藏  举报

导航