两个点之间的方位角

5 投票
2 回答
15894 浏览
提问于 2025-04-16 12:10

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

我需要计算方向角,中心点是center_x和center_y。之后我会用geopy来反向计算GPS坐标:

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

有没有人能告诉我,我可能哪里做错了?

2 个回答

2

我不太明白你代码里想做什么,但我看到一些地方可能需要调整一下。

  1. 你先检查了 dy<=0,然后又检查 dy>=0。如果 dy==0dx==0 的时候,你的代码应该怎么处理呢?
  2. 你写的测试 ((dy>=0)and((dx>0)or(dx<0))) 实际上和 (dy>=0 and dx!=0) 是一样的,这样写是你想要的吗?
  3. 你在所有条件判断里基本上都在做同样的事情。那是不是可以用 return math.degrees(math.atan2(dy,dx))+360)%360 来处理所有情况?这样的话,你就不需要用那些 if 语句了。
10

有没有人能告诉我我可能做错了什么?

  1. 你没有展示出你所说的“结果不一致或者偏差较大”的例子,也没有给出你期望的结果;这样回答的人只能靠猜测来理解你的问题。

  2. 你没有说明输入的单位(比如x、y等是用什么单位),也没有解释你是怎么得到用于计算destinationdist的。我假设(在下面计算bearing2时)正的x是东向的距离(以英里为单位),正的y是北向的距离(也是以英里为单位)。如果你能修改你的问题来解决(1)和(2),那会大大帮助别人理解。

  3. 你的编码风格不太容易让人想看下去……可以看看这个链接

  4. 在学校的三角学中,角度是从X轴(东)逆时针测量的。而在导航中,方位角是从Y轴(北)顺时针测量的。请看下面的代码。想要了解方位角的使用例子,可以访问这个链接,向下滚动到“给定距离和起点方位的目的地”部分,注意例子中提到的方位角大约是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

撰写回答