'''
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)