与在线工具和谷歌地图相比,为啥我的 Python hasrsine 距离计算错误?

Posted

技术标签:

【中文标题】与在线工具和谷歌地图相比,为啥我的 Python hasrsine 距离计算错误?【英文标题】:Why is my Python haversine distance calculation wrong compared to online tools and Google Maps?与在线工具和谷歌地图相比,为什么我的 Python hasrsine 距离计算错误? 【发布时间】:2016-04-12 22:52:12 【问题描述】:

我正在用 Python 编写一个正弦距离和角度计算器,作为小型自动遥控汽车项目的一部分。我的两个测试地点是38.63594444444444,-90.231538.63594444444444,-90.23211111111111

大多数在线计算器(以及我自己的个人 TI-89)的距离约为 0.05308 公里。但是,我的 Python 函数的距离为 0.06795 公里。距离大约 15m,对于一辆小型遥控车来说是巨大的。

我的方位计算函数points2angle 失败了,直到我在toDegrees 函数中进行了一些浮点转换。整数除法把我搞砸了。

请注意,我的 points2anglepoints2distance 函数需要一个 (度、分、秒) 的元组。两个测试位置是(38, 38, 9.4), (-90, 13, 53.4)(38, 38, 9.4), (-90, 13, 55.6),采用这种格式。

编辑:感谢 MSeifert。我只是把我的纬度和经度弄混了。我在下面修复了我的points2angle 代码,但在我的points2distance 代码中留下了错误,所以我的错误代码和答案之间的区别仍然很清楚。

我的距离计算(返回错误的距离):

  def points2distance(start,  end):  
      start_long = math.radians(toDegrees(start[0]))  
      start_latt = math.radians(toDegrees(start[1]))  
      end_long = math.radians(toDegrees(end[0]))  
      end_latt = math.radians(toDegrees(end[1]))
      d_latt = float(end_latt - start_latt)
      d_long = float(end_long - start_long)  
      a = (math.sin(d_latt/2)**2) + math.cos(start_latt) * math.cos(end_latt)* (math.sin(d_long/2)**2)  
      c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
      return 6371 * c 

我的十进制度转换功能(工作):

def toDegrees(coord):
    degrees = float(math.fabs(coord[0])) + float(coord[1]/60) + float(coord[2]/3600)
    if coord[0] < 0:
        degrees = degrees*-1
    return degrees

我的方位角计算(工作):

def points2angle(start, end):
  start_long = math.radians(toDegrees(start[1]))  
  start_latt = math.radians(toDegrees(start[0]))  
  end_long = math.radians(toDegrees(end[1]))  
  end_latt = math.radians(toDegrees(end[0]))
  d_latt = end_latt - start_latt
  d_long = end_long - start_long
  y = math.sin(d_long)*math.sin(end_latt)
  x = (math.cos(start_latt)*math.sin(end_latt)) - (math.sin(start_latt)*math.cos(end_latt)*math.cos(d_long))
  brng = math.degrees(math.atan2(y,x))
  compBear = (brng+360) % 360;
  return compBear

【问题讨论】:

【参考方案1】:

您的经度和纬度混淆了,只需交换它们(或者如果它们在参数中交换然后在那里交换它们)并且它可以工作:

def points2distance(start,  end):  
    start_long = math.radians(toDegrees(start[1]))  
    start_latt = math.radians(toDegrees(start[0]))  
    end_long = math.radians(toDegrees(end[1]))  
    end_latt = math.radians(toDegrees(end[0]))
    d_latt = float(end_latt - start_latt)
    d_long = float(end_long - start_long)  
    a = (math.sin(d_latt/2)**2) + math.cos(start_latt) * math.cos(end_latt)* (math.sin(d_long/2)**2)  
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
    return 6371 * c 

points2distance([(38, 38, 9.4), (-90, 13, 53.4)], [(38, 38, 9.4), (-90, 13, 55.6)])
# returns: 0.053079628495340196

【讨论】:

完美答案。然而,我现在已经打破了我的points2angle 计算,因为我想确保我在任何地方都修复了这种混淆。当我修复它时会更新。谢谢! 更新:修复了我的问题中的points2angle 计算。 所以一切正常还是仍然存在差异?很高兴能帮到你这么远。 :) 是的,一切正常,我真的很感激。有时它需要那双额外的眼睛!我确保将我的points2angle 代码更新为初始帖子中的新工作代码。原来我也错误地切换了该代码中的所有变量。不过,现在一切都解决了。我希望我可以对你的帖子投票,但我没有足够的代表。

以上是关于与在线工具和谷歌地图相比,为啥我的 Python hasrsine 距离计算错误?的主要内容,如果未能解决你的问题,请参考以下文章

GPS 追踪器与 jQuery 移动、PhoneGap 和谷歌地图

Radius 搜索 PHP、MYSQL 和谷歌地图

我们可以用 gps 和谷歌地图提取信息的深度

谷歌地图和谷歌位置自动完成冲突

百度地图和谷歌地图的选择

即时运行和谷歌地图的问题