已知一点经纬度,和另一点的距离及方位角,利用python求另一点的经纬度

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值