包括验证方式
def xyTodis(d1,d2):
#经纬度算距离
#d1[lng,lat]
start_lat=d1[1]
start_lng=d1[0]
end_lat = d2[1]
end_lng = d2[0]
lat1 = (math.pi / 180) * float(start_lat)
lat2 = (math.pi / 180) * float(end_lat)
lon1 = (math.pi / 180) * float(start_lng)
lon2 = (math.pi / 180) * float(end_lng)
R = 6371 #地球半径
dist = math.acos(math.sin(lat1) * math.sin(lat2) + math.cos(lat1)
* math.cos(lat2) * math.cos(abs(lon2 - lon1))) * R*1000
return dist
from math import cos,sin,asin,sqrt,pi
def latlngToDis(poiA,poiB):
#对于a,b的顺序不敏感
p_a=checkLatOrder(poiA)
p_b=checkLatOrder(poiB)
radpa=poiA[1]*pi/180
radpb=poiB[1]*pi/180
mlat=radpa-radpb
mlng=poiA[0]*pi/180-poiB[0]*pi/180
res=2*asin(sqrt(sin(mlat/2)**2+cos(radpa)*cos(radpb)*(sin(mlng/2)**2)))
return res*6378.137
def checkLatOrder(point):
#输入一个二元数组;返回经纬度顺序
if (point[1]>90 and point[0]>90):
return [0,0] #输入本身不合法
if (point[1]>90):
return [point[1],point[0]]
return point
有一个geodistance的包,用wgs84的椭球体参数算球面(准确说是椭球面)两点的距离
A2 = 40.13138224;
B2 = 116.6788595;
C2 = 39.71841979;
D2 = 115.9675254;
dis = 6371004.*acos(1-...
(power((sin((90-B2).*pi/180).*cos(A2.*pi/180)-sin((90-D2)*pi/180).*cos(C2.*pi/180)),2)+...
power((sin((90-B2).*pi/180).*sin(A2.*pi/180)-sin((90-D2)*pi/180).*sin(C2.*pi/180)),2)+...
power((cos((90-B2).*pi/180)-cos((90-D2).*pi/180)),2))/2);
给定一个经纬度,计算某个方向(简化为正北或正东方向)一定距离处的经纬度