Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bearing between two points

Ive been using the geopy package , which does a great job, however some of the results i get are inconsistant or come with a relatively large displacement, i suspect that the problem resides with my bearing calculation:

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

I need to calculate the bearing, s.t. center_x and center_y are the pivot. afterwards i use geopy to reverse engineer the gps coordinate:

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

Can anyone point me to what might i be doing wrong?

like image 241
242Eld Avatar asked Feb 20 '11 17:02

242Eld


People also ask

How do you find the bearing between two points?

Mathematically the bearing between point a and point b is calculating by taking the inverse tan function of X and Y bearing = arctan (X,Y) where X and Y are defined as follows: X = cos θb * sin ∆L Y = cos θa * sin θb – sin θa * cos θb * cos ∆L

What is bearing and calculate angle between two points in GIS?

In geometry angles are measured regardless of direction or orientation as in trigonometry we measure angle by rotating anti clockwise. Here x-axis is (0) zero degree and y-axis is at 90 degree. So in this article we get familiar with What is bearing and calculate angle between two points. In GIS bearing angle is used for navigation or direction.

What is the angle of bearing angle at P?

Bearing angle at a point with respect to north at P if we measured clockwise then we see in gif is 065 degrees and at Q it is 300 degrees. A bearing is used to determine direction of one point relative to another point.

What is a bearing in math?

In mathematics, a bearing is defined as an angle measured clockwise from north. Bearings are usually written as a three-figure bearing. For example, the angle 50° from north is written as 050°. A bearing is always defined as an angle clockwise from north. Bearings are important for navigation in 2-dimensions such as when using maps.


2 Answers

Can anyone point me to what might i be doing wrong?

  1. 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.

  2. Not saying what units your input (x, y, etc) is measured in, and how you get the dist used in the destination calculation. I'm assuming (in calculating bearing2 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).

  3. A coding style that's not very conducive to making folk want to read it ... have a look through this.

  4. 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
like image 166
John Machin Avatar answered Oct 06 '22 15:10

John Machin


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.

  1. You test for dy<=0 after you test for dy>=0 in the conditional before. What should your code do if dy==0 and dx==0.
  2. Your test ((dy>=0)and((dx>0)or(dx<0))) is equivalent to (dy>=0 and dx!=0), is this what you intended?
  3. 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.
like image 22
amccormack Avatar answered Oct 06 '22 17:10

amccormack