我正在看这里列出的公式:http://www.movable-type.co.uk/scripts/latlong.html
我似乎遇到了麻烦,因为结果坐标不是我所期望的那样。
鉴于以下信息:
开始年份:28.455556
开始lon:-80.527778
承重:317.662819(度)
距离:130.224835(海里)
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
该函数返回:
结束年份:-0.209110644042
结束时间:-80.5017472335
但这是我开始位置以东的坐标,它没有任何意义,因为317轴承指向我的起始位置的西北方向。
上面的图片是左上角的最终结束坐标应该是什么样子。
哪里出错了?
Doh我忘记转换为弧度然后在计算完成后转换回度数。这是最终的代码:
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
如果您想要高精度结果,请考虑使用geodesics。以下是GeographicLib的示例,它使用以度为单位的角度单位和以米为单位的距离单位。
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)
这应该距离确切位置不超过几纳米。
另请注意,您的纬度位于赤道以南。我怀疑你的问题是坐标系:三角函数一般用笛卡尔坐标:参考角度(方位0)是+ x轴,也称为“正东方”,向+ y方向(逆时针方向)前进。指南针标题从北方开始顺时针方向。
替换1:
brng = math.radians(90-bearing) #convert degrees to radians
你也错过了使用你的起始纬度。尝试:
lat2 = lat1 + math.asin(...
这给了我们最终的位置
(28.246445355975514, -80.50284677329569)