计算给定两个经纬度点(x1,y1)与(x2,y2)的距离,有很多种,但是由于投影方式使用的不同,以及地球是一个椭球体,导致计算经纬度点之间距离的误差也不一样,下面代码中给出了两种方式:
from math import radians,cos,sin,asin,sqrt,pi,atan,tan,atan2
BLANK = ""
ZERO = "0"
EARTH_RADIUS = 6378.137
vincentyConstantA = 6378137
vincentyConstantB = 6356752.314245
vincentyConstantF = 1 / 298.257223563
def haversine(lon1,lat1,lon2,lat2):
lon1,lat1,lon2,lat2=map(radians,[lon1,lat1,lon2,lat2])
dlon=lon2-lon1
dlat=lat2-lat1
a=sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c=2*asin(sqrt(a))
r=6378.137
#r=6378.137
return c*r*1000
print(haversine(121.409999,31.233487,121.411014,31.232634))
def degtoRad(val):
return val*pi/180
#精度更高的椭球计算
def distVincenty(y1,x1,y2,x2):
a=vincentyConstantA
b=vincentyConstantB
f=vincentyConstantF
L = degtoRad(x2 - x1)
U1 = atan((1 - f