我一直在使用GEPEP软件包,它做得很好,但是我得到的一些结果是不一致的,或者是有一个相对大的位移,我怀疑问题在于我的轴承计算:
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)
有人能告诉我我做错了什么吗?
最佳答案
有人能告诉我我做错了什么吗?
不显示你的“不一致或有相对大的位移”的结果,也不是你预期的结果;因此回答者必须依靠猜测。
不说你的输入(x,y,等等)是用什么单位测量的,以及如何得到dist
计算中使用的destination
。我假设(在计算下面的bearing2
时)正x是以英里为单位向东的,正y是以英里为单位向北的。如果你编辑你的问题来修正(1)和(2),这会有很大帮助。
一种不太有利于民间阅读的编码方式…查看this。
在学校三角学中,从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