Find destination coordinates given starting coordinates, bearing, and distance

佐手、 提交于 2019-12-07 22:44:53

问题


I'm looking at the formula listed here: http://www.movable-type.co.uk/scripts/latlong.html

I seem to be having trouble as the resulting coordinates are not what I would expect them to be.

Given the following information:

Start lat: 28.455556

Start lon: -80.527778

Bearing: 317.662819(Degrees)

Distance: 130.224835(Nautical miles)

def getEndpoint(lat1,lon1,bearing,d):
        R = 6378.1                   #Radius of the Earth
        brng = math.radians(bearing) #convert degrees to radians
        d = d*1.852                  #convert nautical miles to km
        lat2 = math.asin( math.sin(lat1)*math.cos(d/R) + math.cos(lat1)*math.sin(d/R)*math.cos(brng))
        lon2 = lon1 + math.atan2(math.sin(brng)*math.sin(d/R)*math.cos(lat1),math.cos(d/R)-math.sin(lat1)*math.sin(lat2))
        return lat2,lon2

The function returns:

end lat: -0.209110644042

end lon: -80.5017472335

But this is a coordinate east of my beginning location, it doesn't make any sense because 317 bearing is pointing north-west of my starting location.

Above picture is what It should look like with the final ending coordinate on the upper left.

Where is it going wrong?


回答1:


According to this page

math.sin(x) ... Return the sine of x radians.

So, you need to convert lat1 and lon1 to radians before your equation and then later you can convert lat2 and lon2 back into degrees.




回答2:


Doh I had forgot to convert to radians then convert back to degrees when calculation was done. Here is the final code:

def getEndpoint(lat1,lon1,bearing,d):
    R = 6371                     #Radius of the Earth
    brng = math.radians(bearing) #convert degrees to radians
    d = d*1.852                  #convert nautical miles to km
    lat1 = math.radians(lat1)    #Current lat point converted to radians
    lon1 = math.radians(lon1)    #Current long point converted to radians
    lat2 = math.asin( math.sin(lat1)*math.cos(d/R) + math.cos(lat1)*math.sin(d/R)*math.cos(brng))
    lon2 = lon1 + math.atan2(math.sin(brng)*math.sin(d/R)*math.cos(lat1),math.cos(d/R)-math.sin(lat1)*math.sin(lat2))
    lat2 = math.degrees(lat2)
    lon2 = math.degrees(lon2)
    return lat2,lon2



回答3:


If you want a high precision result, consider using geodesics. Here is an example with GeographicLib, which uses angular units in degrees and distance units in metres.

from geographiclib.constants import Constants
from geographiclib.geodesic import Geodesic

def getEndpoint(lat1, lon1, bearing, d):
    geod = Geodesic(Constants.WGS84_a, Constants.WGS84_f)
    d = geod.Direct(lat1, lon1, bearing, d * 1852.0)
    return d['lat2'], d['lon2']

print(getEndpoint(28.455556, -80.527778, 317.662819, 130.224835))
# (30.05352669918092, -82.21197985232848)

This should be no more than a few nanometres from the exact position.




回答4:


Also note that your latitude is just south of the equator. I suspect that your problem is coordinate system: trig functions generally work in Cartesian: the reference angle (bearing 0) is the +x axis, also known as "due east", and progress toward +y (counter-clockwise). Compass headings start at north and go clockwise.

Replacement 1:

brng = math.radians(90-bearing) #convert degrees to radians

You've also missed using your starting latitutde. Try:

lat2 = lat1 + math.asin(...

This gives us the final location of

(28.246445355975514, -80.50284677329569)


来源:https://stackoverflow.com/questions/33001420/find-destination-coordinates-given-starting-coordinates-bearing-and-distance

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!