1. 在网上找到了一个JavaScript的计算程序,对其进行了简单的修改,直接定义了一个函数,其中函数中brng为角度,dist单位为米。
math.radians 角度转弧度的函数
math.degrees 弧度转角度的函数
参考程序链接:JS根据一个经纬度及距离角度,算出另外一个经纬度 - object360 - 博客园
def computerOffsetPosition(lon, lat, brng, dist):
#大地坐标系资料WGS-84,距离单位为:m,°
flat = 298.257223563 # 扁率
a = 6378137.0 # 地球 半长轴
b = 6356752.314245 # 地球 半短轴
f = 1 / flat
sin_brg = math.sin(math.radians(brng))
cos_brg = math.cos(math.radians(brng))
tan_U1 = (1 - f) * math.tan(math.radians(lat))
cos_U1 = 1 / (math.sqrt(1 + tan_U1 * tan_U1))
sin_U1 = tan_U1 * cos_U1
sigma_1 = math.atan2(tan_U1,cos_brg)
sin_alpha = cos_U1 * sin_brg
cos_sq_alpha = 1 - sin_alpha * sin_alpha
u_sq = cos_sq_alpha * (a * a - b * b) / (b * b)
A = 1 + u_sq / 16384 * (4096 + u_sq * (-768 + u_sq * (320 - 175 * u_sq)))
B = u_sq / 1024 * (256 + u_sq * (-128 + u_sq * (74 - 47 * u_sq)))
sigma = dist / (b * A)
sigma_P = 2 * math.pi
while(abs(sigma - sigma_P) > 1e-12):
cos_2_sigma_M = math.cos(2 * sigma_1 + sigma)
sin_sigma = math.sin(sigma)
cos_sigma = math.cos(sigma)
delta_sigma = B * sin_sigma * (cos_2_sigma_M + B / 4 * (cos_sigma * \
(-1 + 2 * cos_2_sigma_M * cos_2_sigma_M))) - \
B / 6 * cos_2_sigma_M * (-3 + 4 * sin_sigma * sin_sigma) \
*(-3 + 4 * cos_2_sigma_M * cos_2_sigma_M)
sigma_P = sigma
sigma = dist / (b * A) + delta_sigma
tmp = sin_U1 * sin_sigma - cos_U1 * cos_sigma * cos_brg
lat_2 = math.atan2((sin_U1 * cos_sigma + cos_U1 * sin_sigma * cos_brg) , \
((1 - f) * math.sqrt(sin_alpha * sin_alpha + tmp * tmp)))
lambda_1 = math.atan2(sin_sigma * sin_brg , \
cos_U1 * cos_sigma - sin_U1 * sin_sigma * cos_brg)
C = f / 16 * cos_sq_alpha * (4 + f * (4 - 3 * cos_sq_alpha))
L = lambda_1 - (1 - C) * f * sin_alpha * (sigma + C * sin_sigma *
(cos_2_sigma_M + C * cos_sigma * (-1 + 2 * cos_2_sigma_M * cos_2_sigma_M)))
revAz = math.atan2(sin_alpha, -tmp)
final_lon = lon + L * (180 / math.pi)
final_lat = lat_2 * (180 / math.pi)
return final_lon, final_lat
2. 在计算经纬度、距离、方位角_liu_yulong的专栏-CSDN博客_计算方位角 中找的第三种方法,比较简洁。
在这篇文章中还给出了一个方法,但是注释上说计算结果有误,所以就没有对程序进行修改,如有兴趣可以自行去调整。
def computerOffsetPosition(lon1, lat1, brng, dist): #dist单位:米
earth_arc = 111.199 #地球每度的弧长,单位:千米
dist = dist / 1000
brng = math.radians(brng)
lon2 = lon1 + (dist * math.sin(brng)) / (earth_arc * math.cos(math.radians(lat1)))
lat2 = lat1 + (dist * math.cos(brng)) / earth_arc
return lon2 , lat2