-
-
Save jeromer/2005586 to your computer and use it in GitHub Desktop.
# LICENSE: public domain | |
def calculate_initial_compass_bearing(pointA, pointB): | |
""" | |
Calculates the bearing between two points. | |
The formulae used is the following: | |
θ = atan2(sin(Δlong).cos(lat2), | |
cos(lat1).sin(lat2) − sin(lat1).cos(lat2).cos(Δlong)) | |
:Parameters: | |
- `pointA: The tuple representing the latitude/longitude for the | |
first point. Latitude and longitude must be in decimal degrees | |
- `pointB: The tuple representing the latitude/longitude for the | |
second point. Latitude and longitude must be in decimal degrees | |
:Returns: | |
The bearing in degrees | |
:Returns Type: | |
float | |
""" | |
if (type(pointA) != tuple) or (type(pointB) != tuple): | |
raise TypeError("Only tuples are supported as arguments") | |
lat1 = math.radians(pointA[0]) | |
lat2 = math.radians(pointB[0]) | |
diffLong = math.radians(pointB[1] - pointA[1]) | |
x = math.sin(diffLong) * math.cos(lat2) | |
y = math.cos(lat1) * math.sin(lat2) - (math.sin(lat1) | |
* math.cos(lat2) * math.cos(diffLong)) | |
initial_bearing = math.atan2(x, y) | |
# Now we have the initial bearing but math.atan2 return values | |
# from -180° to + 180° which is not what we want for a compass bearing | |
# The solution is to normalize the initial bearing as shown below | |
initial_bearing = math.degrees(initial_bearing) | |
compass_bearing = (initial_bearing + 360) % 360 | |
return compass_bearing |
What is the license for this code, @jeromer?
up !
Very nice, especially all the explanation. Thank you!
thank you
Thank you for sharing!
great
Great!!
awesome work man
Thanks!
Thank you for sharing!
I have an issue with that, the output is different then expected: A = (-73.933781942,40.7062912231)
B = (-73.93390547,40.7062643692)
bearing is 183.44288775507985 but it should be nearly 270
when BA: bearing is 3.4429135601084795 but it should be almost 90
could it be that there is a wired 90 degree changing required somewhere?
Update yes @schicks you are right, i messed up the x and y and i wasn't aware that i can use the wgs84 coordinates without transforming to a 2D
Now it gives back 253.99863197083152 what is expected
@blackgis, I think you may have the arguments a little messed up. They should be (lat, lon), not (lon, lat).
thank you!
Thanks!
import math
lat1 = math.radians(float(input("Lattitude1:")))
lat2 = math.radians(float(input("Lattitude2:")))
long1 = math.radians(float(input("Longitude1:")))
long2 = math.radians(float(input("Longitude2:")))
longdifference = math.radians(float(long2-long1))
x = math.sin(longdifference) * math.cos(lat2)
y = math.cos(lat1) * math.sin(lat2) - (math.sin(lat1)* math.cos(lat2) * math.cos(longdifference))
initial_bearing = math.atan2(x, y)
initial_bearing = math.degrees(initial_bearing)
compass_bearing = (initial_bearing + 360) % 360
print(initial_bearing, "°")
Output:
Lattitude1:47.5606
Lattitude2:47.594719
Longitude1:-52.743099
Longitude2:-52.685001
Result: 1.1481674985452277 ° this should be 49°, why i am getting wrong value ?
Great work! It's what I looking for. Thank you
Good job!
Thanks for this method, really helped me in a project
Thank you!
Thanks for providing a good option. It is a really helpful for us.
Dude, I want to have kids from you <3. Excellent work!!!
Much faster than importing obspy.geodetics.gps2dist_azimuth
Thanks a lot
Great work! Thanks very much 👍
This is good enough for me, though I think the algorithm is a bit simplified. It will probably give inaccurate results when used over long distances or when one is close to the poles. I find it strange that there isn't anything easily available through the geopy library.
Excellent work
Thanks. Fixed my problem with this one.
Thank you this worked 👯
I like this. I'll combine this with Vincenty's formula to return bearing and distance.
Javascript version: https://gist.github.com/av01d/f7f97cf1217945fc4628c6c97e916122
Thank you very much 🥇