def loxodrome(latA, lonA, latB, lonB): # lossodromica
# Rhumb line navigation
# Takes two points on earth and returns:
# the distance and constant (true) bearing one would need to
# follow to reach it.
# Doesn't function near poles:
# but you shouldn't be sailing near the poles anyways!
# when latB = -90: math domain error log(0)
# when latA = -90 [zero divison error]
# when A==B returns (0.0,0.0)
# if latA == latB:
if math.copysign(latA-latB, 1) <= math.radians(0.1/3600.0):
q = math.cos(latA)
else:
Df = math.log(math.tan(latB/2+math.pi/4)
/ math.tan(latA/2+math.pi/4), math.e)
q = (latB-latA) * 1.0/Df
Distance = EARTH_RADIUS * ((latA-latB)**2+(q*(lonA-lonB))**2)**0.5
Heading = math.atan2(-q*(lonB-lonA), (latB-latA))
if Heading < 0:
Heading = Heading + 2.0 * math.pi # atan2:[-pi,pi]
return Distance, Heading
评论列表
文章目录