我使用下面的代码不断收到以下错误:ValueError:math domain error。我可以使用其他公式获得两个GPS点之间的距离,但不能使用下面的公式。任何帮助将不胜感激,
谢谢,
加文
from math import radians, cos, sin, acos
#Formula below does not work :(
#JFK
lat1 = 40.639751
lon1 = -73.778925
#DUB
lat2 = 53.421333
lon2 = -6.270075
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
r = 6373
distance = acos((sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lon1 - lon2)) * r)
print(distance)
答案 0 :(得分:1)
公式不正确。
我相信这个公式是
acos(some_trig) * r
而非acos(some_trig * r )
总之
distance = acos((sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lon1 - lon2))) * r
答案 1 :(得分:0)
此公式发布于Calculating shortest path between 2 points on a flat map of the Earth 并查看https://en.wikipedia.org/wiki/Great-circle_distance
您将值乘以r
,告诉acos
将4435.6解析为荒谬的角度。余弦可能从未产生过这样的数字,大于1。
也许您应该使用acos
给出的角度放入另一个圆周公式。
from math import radians, cos, sin, acos, pi
#JFK
lat1 = 40.639751
lon1 = -73.778925
#DUB
lat2 = 53.421333
lon2 = -6.270075
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
r = 6373
d = acos((sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lon1 - lon2)))
length = d * r
print(length)
5104.62871371
答案 2 :(得分:-1)
cos
的结果不能超出[-1,1]
范围的实数,因此该范围之外的值的acos
是虚数。但是,您将乘以6373
,从而导致值超出[-1,1]
。这就是错误的原因。
如果你试图取acos
之外的值[-1,1]
,你或者你的数学运算出错,或者你正在寻找一个想象的结果,在这种情况下你应该使用acos
的复杂版本,即cmath.acos
。