【问题标题】:Bearing between two points两点之间的轴承
【发布时间】:2011-06-30 19:49:15
【问题描述】:

我一直在使用 geopy 包,它做得很好,但是我得到的一些结果不一致或带有相对较大的位移,我怀疑问题出在我的方位计算上:

def gb(x,y,center_x,center_y):
dx=x-center_x
dy=y-center_y
if ((dy>=0)and((dx>0)or(dx<0))):
    return math.degrees(math.atan2(dy,dx))
elif (dy<=0)and((dx>0)or (dx<0)):
    return (math.degrees(math.atan2(dy,dx))+360)
else:
    return (math.degrees(math.atan2(dy,dx))+360)%360

我需要计算方位角,s.t. center_x 和 center_y 是枢轴。之后我使用 geopy 对 gps 坐标进行逆向工程:

latlon = VincentyDistance(miles=dist).destination(Point(lat1, lon1), bearing)

谁能指出我做错了什么?

【问题讨论】:

  • 如果您的问题已通过答案解决,您应该通过单击答案旁边的大“勾号”来接受答案。否则,请提供反馈,以便我们进一步帮助您。

标签: python gps coordinates bearing geopy


【解决方案1】:

谁能指出我做错了什么?

  1. 没有显示您的“不一致或具有相对较大位移”结果的示例,也没有显示您的预期结果;因此,回答者必须依靠猜测。

  2. 没有说明您的输入(x、y 等)以什么单位进行测量,以及您如何获得在 destination 计算中使用的 dist。我假设(在下面计算bearing2 时)正x 以英里为单位向东,而正y 以英里为单位向北。如果您要编辑问题以修复 (1) 和 (2),这将有很大帮助。

  3. 一种不太利于人们阅读的编码风格……看看this

  4. 在学校三角学中,角度是从 X 轴(东)逆时针测量的。在导航中,从 Y 轴(北)顺时针测量方位。请参阅下面的代码。有关使用中的方位的示例,请关注this link,向下滚动到“目标点给定距离和距起点的方位”部分,注意该示例正在谈论大约 96 或 97 度的方位,然后单击“查看地图”,您会注意到航向略偏东偏南(东为 90 度)。

代码:

from math import degrees, atan2
    def gb(x, y, center_x, center_y):
        angle = degrees(atan2(y - center_y, x - center_x))
        bearing1 = (angle + 360) % 360
        bearing2 = (90 - angle) % 360
        print "gb: x=%2d y=%2d angle=%6.1f bearing1=%5.1f bearing2=%5.1f" % (x, y, angle, bearing1, bearing2)

    for pt in ((0, 1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1),(-1, 0),(-1,1)):
        gb(pt[0], pt[1], 0, 0)

输出:

gb: x= 0 y= 1 angle=  90.0 bearing1= 90.0 bearing2=  0.0
gb: x= 1 y= 1 angle=  45.0 bearing1= 45.0 bearing2= 45.0
gb: x= 1 y= 0 angle=   0.0 bearing1=  0.0 bearing2= 90.0
gb: x= 1 y=-1 angle= -45.0 bearing1=315.0 bearing2=135.0
gb: x= 0 y=-1 angle= -90.0 bearing1=270.0 bearing2=180.0
gb: x=-1 y=-1 angle=-135.0 bearing1=225.0 bearing2=225.0
gb: x=-1 y= 0 angle= 180.0 bearing1=180.0 bearing2=270.0
gb: x=-1 y= 1 angle= 135.0 bearing1=135.0 bearing2=315.0

【讨论】:

  • 你好约翰,你对我的编码风格是正确的,感谢你引起我的注意。至于代码我相信你提供的实现效果更好,我的代码只是简单地采用了形成维基百科,我将再次运行我的脚本并测试结果,谢谢!
  • @242Eld:请提供您提到的维基百科文章的 URL。此外,您还没有解决我回答的第 (1) 和 (2) 点。
  • 维基百科文章是希伯来语的。由于我在进行反向地理编码,因此无法用代码描述示例。但是问题域是,在从 bing 地图解析 html 页面后,我需要反转地理编码过程 s.t.我可以检索到所需的多边形。结果很好但并不令人满意,因为从多边形的原始位置有 200-1500 米的位移。我使用以像素为单位的 x y 坐标,我使用给定的比例将其转换为英里。使用 geopy 包的 VincentyDistance 进行反向地理编码
  • 这没有回答最初的问题,但john-machin 询问了 wiki 站点的数学,this site 提到了与 242Eld 使用相同的数学。如果有人要找这个。
【解决方案2】:

我不太确定您要在代码中做什么,但我确实看到了一些可能需要清理的奇怪之处。

  1. 您在之前的条件中测试dy&gt;=0 之后测试dy&lt;=0。如果dy==0dx==0,你的代码应该怎么做。
  2. 您的测试((dy&gt;=0)and((dx&gt;0)or(dx&lt;0))) 等价于 (dy>=0 and dx!=0),这是您想要的吗?
  3. 您在所有条件句中基本上都在做同样的事情。 return math.degrees(math.atan2(dy,dx))+360)%360 不能在每种情况下都工作吗?在这种情况下,您无论如何都不需要使用 if 语句。

【讨论】:

  • +1 特别是对于 3,但它可能无法回答问题。你知道吗? math.atan2 可能会在 dx==0 附近给出相对不准确的结果(它是否包含一些逻辑来避免被近零除的问题)?如果需要一个 if 语句,它可能是在 45 度线附近反射,以获得更好的数值精度 - 但我原以为库会处理这个问题。
  • @Steve314,好点子。我查看了 Python2.7 文档,它没有给出任何关于输入 0 的警告。此外,我尝试了 math.atan2(0,30) 和 math.atan2(30,0) 并且都没有返回错误,如果您给它无效的输入,我希望内置库能够做到这一点。
猜你喜欢
  • 2018-11-10
  • 2013-04-17
  • 2012-11-03
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多