-
15-11-2019 - |
题
ive一直在使用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)
.
任何人都可以指出我可能做错了什么?
解决方案
Can anyone point me to what might i be doing wrong?
Not showing an example of your "inconsistant or come with a relatively large displacement" results nor your expected results; consequently answerers must rely on guesswork.
Not saying what units your input (x, y, etc) is measured in, and how you get the
dist
used in thedestination
calculation. I'm assuming (in calculatingbearing2
below) that positive x is easting in miles and positive y is northing in miles. It would help greatly if you were to edit your question to fix (1) and (2).A coding style that's not very conducive to making folk want to read it ... have a look through this.
In school trigonometry, angles are measured anticlockwise from the X axis (East). In navigation, bearings are measured clockwise from the Y axis (North). See code below. For an example of bearing in use, follow this link, scroll down to the "Destination point given distance and bearing from start point" section, notice that the example is talking about bearings of about 96 or 97 degrees, then click on "view map" and you will notice that the heading is slightly south of east (east being 90 degrees).
Code:
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)
Output:
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
其他提示
I'm not quite sure what you're trying to do in your code,but I do see some oddities that may need to be cleaned up.
- You test for
dy<=0
after you test fordy>=0
in the conditional before. What should your code do ifdy==0
anddx==0
. - Your test
((dy>=0)and((dx>0)or(dx<0)))
is equivalent to (dy>=0 and dx!=0), is this what you intended? - You are basically doing the same thing in all of your conditionals. Couldn't
return math.degrees(math.atan2(dy,dx))+360)%360
work in every scenario? In that case, you wouldn't need to use your if statements anyway.