计算两地点间距离
作者:互联网
背景:
我们想知道地图上面两个点之间的距离是多少,我们应该怎么计算呢?
首先:我们得知道两点简单经纬度
其次:我们需要选择精度比较好的距离算法
最后:我们需要怎么来实现
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)
标签:cos,lat1,lat0,地点,radians,距离,计算,sin,hav 来源: https://www.cnblogs.com/gentlemanhai/p/13946461.html