【问题标题】:Distance between two GPS points (Python)两个 GPS 点之间的距离(Python)
【发布时间】:2015-04-13 12:42:46
【问题描述】:

我不断收到以下代码错误:ValueError:数学域错误。我可以用其他公式得到两个 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)

【问题讨论】:

  • 能否给出完整的例外情况?
  • 不确定你的意思。额外的一对支架效果很好。谢谢

标签: python math gps


【解决方案1】:

公式不正确。 我相信公式是 acos(some_trig) * r 而不是 acos(some_trig * r ) 总结

distance = acos((sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lon1 - lon2))) * r

【讨论】:

【解决方案2】:

这个公式发布在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

【讨论】:

    【解决方案3】:

    cos 的结果不能超出[-1,1] 的实数范围,因此超出该范围的值的acos 是虚数。但是,您乘以 6373,导致值超出 [-1,1]。这就是错误的原因。

    如果您尝试将 acos 的值设为 [-1,1] 之外的值,则您的数学运算有误,或者您正在寻找一个虚构的结果,在这种情况下,您应该使用复数版本acos,即cmath.acos

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2021-07-09
      相关资源
      最近更新 更多