利用python进行正球面的大圆航程与横向线航程计算


'''
Project:the difference of gcr and rlr
Author:wf Time:2021.11.30
'''

import math
#角度转化
def change_deg(degree):
    list = degree.split("度")
    if list[1] != '':
        list1 = list[1].split("分")
    else:
        list1 = [0]
    deg = float(list[0])
    min = float(list1[0])
    return (deg + (min / 60))
#经度转换,西经为负,东经为正
def con_lon(lon,lon_dir):
    if lon_dir =='W' or lon_dir=='w':
        lon_w = -1*lon
        return lon_w
    elif lon_dir =='E' or lon_dir=='e':
        lon_e = lon
        return lon_e
    else:
        print(lon_dir + '不是经度的方向')
        return 0
#纬度转换,南纬为负,北纬为正
def con_lat(lat,lat_dir):
    if lat_dir == 'S' or lat_dir == 's':
        lat_s = -1*lat
        return lat_s
    elif lat_dir == 'N' or lat_dir == 'n':
        lat_n = lat
        return lat_n
    else:
        print('不是维度的方向')
        return 0
#求经差
def diff_of_lon(lon_F,lon_T):
    diff_of_lon = abs(lon_T - lon_F)
    if diff_of_lon > 180:
        diff_of_lon = 360-diff_of_lon
    return diff_of_lon
#求纬差
def diff_of_lat(lat_F,lat_T):
    diff_of_lat = abs(lat_T - lat_F)
    return diff_of_lat
#求大圆航程
def dft(lat_F,lat_T,diff_of_lon):
    if (lat_F/abs(lat_F)) == (lat_T/abs(lat_T)):
        lat_F = abs(lat_F)
        lat_T = abs(lat_T)
    else:
        lat_F = abs(lat_F)
        lat_T = -1*abs(lat_T)
    DFT_cos = (math.sin(lat_F*(math.pi)/180) * math.sin(lat_T*(math.pi)/180)) + \
              (math.cos(lat_F*(math.pi)/180) * math.cos(lat_T*(math.pi)/180) *
               math.cos(diff_of_lon*(math.pi)/180))
    DFT = math.acos(DFT_cos)*180/(math.pi) * 60
    return DFT
#求大圆初始航向
def Great_cir_init_heading(lat_F,lat_T,diff_of_lon):
    if (lat_F/abs(lat_F)) == (lat_T/abs(lat_T)):
        lat_F = abs(lat_F)
        lat_T = abs(lat_T)
    else:
        lat_F = abs(lat_F)
        lat_T = -1*abs(lat_T)
    C_tan = math.sin(math.radians(diff_of_lon)) / \
            (math.tan(math.radians(lat_T))*math.cos(math.radians(lat_F)) -
             math.sin(math.radians(lat_F))*math.cos(math.radians(diff_of_lon)))
    C = math.degrees(math.atan(C_tan))
    return C
#横向线航向
def rlrc(lat_F,lat_T,lon_dif_FT):
    DMP = (10800/math.pi)*(math.log((math.tan(math.radians(45 + lat_T/2))
                                     /math.tan(math.radians(45 + lat_F/2)))))
    C = math.degrees(math.atan(60 * lon_dif_FT / DMP))
    return C
#横向线航程
def rlr(C,lat_F,diff_of_lat,diff_of_lon):
    if C != 90:
        d = 60 * diff_of_lat / math.cos(math.radians(C))
    else:
        d = 60 * diff_of_lon * math.cos(math.radians(lat_F))
    return d

if __name__ == "__main__":
    #变量输入
    print('以下坐标数值输入格式为:xx度xx分,方向为字母')
    place_F = input('起始地点名称:')
    lat_F = input('起始坐标的纬度:')
    lat_F_dir = input('起始坐标的纬度方向:')
    lon_F = input('起始坐标的经度:')
    lon_F_dir = input('起始坐标的经度方向:')
    place_T = input('终点地点名称:')
    lat_T = input('终点坐标的纬度:')
    lat_T_dir = input('终点坐标的纬度方向:')
    lon_T = input('终点坐标的经度:')
    lon_T_dir = input('终点坐标的经度方向:')
    #数值转化
    lat_T = change_deg(lat_T)
    lat_F = change_deg(lat_F)
    lon_T = change_deg(lon_T)
    lon_F = change_deg(lon_F)
    lat_F = con_lat(lat_F,lat_F_dir)
    lat_T = con_lat(lat_T,lat_T_dir)
    lon_F = con_lon(lon_F,lon_F_dir)
    lon_T = con_lon(lon_T,lon_T_dir)
    #求经差,纬差
    lon_dif_FT = diff_of_lon(lon_F,lon_T)
    lat_dif_FT = diff_of_lat(lat_F,lat_T)
    #求大圆航程
    Gcr = dft(lat_F,lat_T,lon_dif_FT)
    print('GCR:',Gcr)
    #求横向线航向及横向线航程
    C = rlrc(lat_F,lat_T,lon_dif_FT)
    Rlr = rlr(C,lat_F,lat_dif_FT,lon_dif_FT)
    print('RLR:',Rlr)
    #求两航线之差
    DIFF = Rlr - Gcr
    print(place_F + '与' + place_T +'航次的大圆航程与恒向线航程的差值:' , DIFF)


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值