两点之间的轴承

时间:2011-02-20 17:20:33

标签: python gps coordinates bearing geopy

我一直在使用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)

有人能指出我可能做错了吗?

2 个答案:

答案 0 :(得分:8)

  

有人能指出我可能做错了吗?

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

  2. 不说明您的输入(x,y等)的单位是什么,以及如何获得dist计算中使用的destination。我假设(在计算下面的bearing2)中,正x是以英里为东,而正y以英里为北。如果您要修改问题以修复(1)和(2),那将会非常有用。

  3. 一种不太有利于让民众阅读的编码风格......浏览this

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

  5. 代码:

    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
    

答案 1 :(得分:2)

我不太确定你在代码中尝试做什么,但我确实看到了一些可能需要清理的奇怪内容。

  1. 您在之前的条件中测试dy<=0后测试dy>=0。如果dy==0dx==0,您的代码应该怎么做。
  2. 您的测试((dy>=0)and((dx>0)or(dx<0)))相当于(dy&gt; = 0和dx!= 0),这是您的意图吗?
  3. 你基本上在所有条件中都做同样的事情。 return math.degrees(math.atan2(dy,dx))+360)%360无法在每种情况下都有效吗?在这种情况下,您无需使用if语句。