测绘程序设计——试题八:对流层改正计算

发布于:2024-05-22 ⋅ 阅读:(146) ⋅ 点赞:(0)

测绘程序设计试题集——基础篇(编写内容仅作参考)
参考教材——李英冰老师的《测绘程序设计试题集》(2017版)

一、 原文

仅展示试题1的原文,如需了解其余内容,请自行购买图书
李老师著作主页-http://ybli.users.sgg.whu.edu.cn/book/

二、数据集

测站名,时间(YYYYMMDD),经度(°),纬度(°),大地高(m),高度角(°)
P01,20170728,116.407143,39.913607,45.234,20
Р02,20170728,125.460913,43.850217,102.432,30
РОЗ,20170728,82.650403,63.604725,251.672,40
Р04,20170728,107.37637,26.043428,35.277,45
POS,20170728,112.674792,1.514577,24.556,50
Р06,20170728,138.283829,-30.160507,176.889,55
P07,20170728,102.961019,-77.21885,435.279,60

三、代码

# 读取数据
import math

with open('坐标信息.txt','r',encoding='utf-8') as file:
    data = file.read()
data = data.split('\n')
new_data = []
for i in data:
    ii = i.split(',')
    new_data.append(ii)
new_data1 = new_data[1:]

# 湿分量投影函数计算

aw15 = 0.00058021897
bw15 = 0.0014275268
cw15 = 0.043472961
aw30 = 0.0056794847
bw30 = 0.0015138625
cw30 = 0.046729510
aw45 = 0.0058118019
bw45 = 0.0014572752
cw45 = 0.043908931
aw60 = 0.0059727542
bw60 = 0.0015007428
cw60 = 0.044626982
aw75 = 0.0061641693
bw75 = 0.0017599082
cw75 = 0.54736038

MWE_list = []
for i in range(len(new_data1)):
    weidu = float(new_data1[i][3])
    E = float(new_data1[i][5])
    E1 = math.radians(E)
    if weidu < 15:
        a = aw15
        b = bw15
        c = cw15
    elif 15 <= weidu < 30:
        a = aw15 + (weidu - 15) * (aw30 - aw15) / (30 - 15)
        b = bw15 + (weidu - 15) * (bw30 - bw15) / (30 - 15)
        c = cw15 + (weidu - 15) * (cw30 - cw15) / (30 - 15)
    elif 30 <= weidu < 45:
        a = aw30 + (weidu - 30) * (aw45 - aw30) / (45 - 30)
        b = bw30 + (weidu - 30) * (bw45 - bw30) / (45 - 30)
        c = cw30 + (weidu - 30) * (cw45 - cw30) / (45 - 30)
    elif 45 <= weidu < 60:
        a = aw45 + (weidu - 45) * (aw60 - aw45) / (60 - 45)
        b = bw45 + (weidu - 45) * (bw60 - bw45) / (60 - 45)
        c = cw45 + (weidu - 45) * (cw60 - cw45) / (60 - 45)
    elif 60 <= weidu < 75:
        a = aw60 + (weidu - 60) * (aw75 - aw60) / (75 - 60)
        b = bw60 + (weidu - 60) * (bw75 - bw60) / (75 - 60)
        c = cw60 + (weidu - 60) * (cw75 - cw60) / (75 - 60)
    else:
        a = aw75
        b = bw75
        c = cw75
    MWE = (1 / (1 + a / (1 + b / (1 + c)))) / (1 / (math.sin(E1) + a / (math.sin(E1) + b / (math.sin(E1) + c))))
    MWE_list.append(MWE)

# 干分量投影函数计算
ahg15 = 0.0012769934
bhg15 = 0.0029153695
chg15 = 0.062610505
ahg30 = 0.0012683230
bhg30 = 0.0029152299
chg30 = 0.062837393
ahg45 = 0.0012465397
bhg45 = 0.0029288445
chg45 = 0.063721774
ahg60 = 0.0012196049
bhg60 = 0.0029022565
chg60 = 0.063824265
ahg75 = 0.0012045996
bhg75 = 0.0029024912
chg75 = 0.064258455

ahp15 = 0.0
bhp15 = 0.0
chp15 = 0.0
ahp30 = 0.000012709626
bhp30 = 0.000021414979
chp30 = 0.000090128400
ahp45 = 0.000026523662
bhp45 = 0.000030160779
chp45 = 0.000043497037
ahp60 = 0.000034000452
bhp60 = 0.000072562722
chp60 = 0.0084795348
ahp75 = 0.000041202191
bhp75 = 0.00011723375
chp75 = 0.0017037206

MDE_list = []
for i in range(len(new_data1)):
    weidu = float(new_data1[i][3])
    E = float(new_data1[i][5])
    E1 = math.radians(E)
    aht = 2.53e-5
    bht = 5.49e-3
    cht = 1.14e-3
    H = float(new_data1[i][4])
    t0 = 28
    tt = [31,28,31,30,31,30,31,31,30,31,30,31]
    year = int(new_data1[i][1][0:4])
    month = int(new_data1[i][1][4:6])
    day = int(new_data1[i][1][6:8])
    # 闰年判断
    if (year % 4 ==0 and year % 100 != 0) or (year % 400 == 0):
        tt[1] = 29
        nianjiri = sum(tt[0:month-1]) + day
    else:
        nianjiri = sum(tt[0:month-1]) + day

    if weidu < 15:
        a = ahg15 + ahg15 * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)
        b = bhg15 + bhg15 * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)
        c = chg15 + chg15 * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)
    elif 15 <= weidu < 30:
        a = ahg15 + (weidu - 15) * (ahg30 - ahg15) / (30 - 15) \
            + ahg15 + (weidu - 15) * (ahg30 - ahg15) / (30 - 15) * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)
        b = bhg15 + (weidu - 15) * (bhg30 - bhg15) / (30 - 15) \
            + bhg15 + (weidu - 15) * (bhg30 - bhg15) / (30 - 15) * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)
        c = chg15 + (weidu - 15) * (chg30 - chg15) / (30 - 15) \
            + chg15 + (weidu - 15) * (chg30 - chg15) / (30 - 15) * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)
    elif 30 <= weidu < 45:
        a = ahg30 + (weidu - 30) * (ahg45 - ahg30) / (45 - 30) \
            + ahg30 + (weidu - 30) * (ahg45 - ahg30) / (45 - 30) * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)
        b = bhg30 + (weidu - 30) * (bhg45 - bhg30) / (45 - 30) \
            + bhg30 + (weidu - 30) * (bhg45 - bhg30) / (45 - 30) * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)
        c = chg30 + (weidu - 30) * (chg45 - chg30) / (45 - 30) \
            + chg30 + (weidu - 30) * (chg45 - chg30) / (45 - 30) * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)

    elif 45 <= weidu < 60:
        a = ahg45 + (weidu - 45) * (ahg30 - ahg45) / (60 - 45) \
            + ahg45 + (weidu - 45) * (ahg30 - ahg45) / (60 - 45) * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)
        b = bhg45 + (weidu - 45) * (bhg30 - bhg45) / (60 - 45) \
            + bhg45 + (weidu - 45) * (bhg30 - bhg45) / (60 - 45) * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)
        c = chg45 + (weidu - 45) * (chg30 - chg45) / (60 - 45) \
            + chg45 + (weidu - 45) * (chg30 - chg45) / (60 - 45) * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)

    elif 60 <= weidu < 75:
        a = ahg60 + (weidu - 60) * (ahg75 - ahg60) / (75 - 60) \
            + ahg60 + (weidu - 60) * (ahg75 - ahg60) / (75 - 60) * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)
        b = bhg60 + (weidu - 60) * (bhg75 - bhg60) / (75 - 60) \
            + bhg60 + (weidu - 60) * (bhg75 - bhg60) / (75 - 60) * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)
        c = chg60 + (weidu - 60) * (chg75 - chg60) / (75 - 60) \
            + chg60 + (weidu - 60) * (chg75 - chg60) / (75 - 60) * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)
    else:
        a = ahg75 + ahg75 * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)
        b = bhg75 + bhg75 * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)
        c = chg75 + chg75 * math.cos(2 * math.pi * (nianjiri - t0) / 365.25)

    ss = (1 / (1 + a / (1 + b / (1 + c)))) / (1 / (math.sin(E1) + a / (math.sin(E1) + b / (math.sin(E1) + c))))
    MDE = ss + (1 / math.sin(E1) - (1 / (1 + aht / (1 + bht / (1 + cht)))) / (1 / (math.sin(E1) + aht /
                (math.sin(E1) + bht / (math.sin(E1) + cht))))) * (H / 1000)
    MDE_list.append(MDE)

# 延迟改正计算
ZHD_list = []
for i in range(len(new_data1)):
    H = float(new_data1[i][4])
    ZHD = 2.29951 * math.e ** (-0.000116 * H)
    ZHD_list.append(round(ZHD,3))
ZWD = 0.1
SS_list = []
for i in range(len(new_data1)):
    SS = ZHD_list[i] * MDE_list[i] + ZWD * MDE_list[i]
    SS_list.append(round(SS, 3))

# 输出
print('测站名   高度角    ZHD     MDE    ZWD   MWE    SS')
for i in range(len(new_data1)):
    print(new_data1[i][0], new_data1[i][-1], ZHD_list[i], MDE_list[i], ZWD, MWE_list[i],SS_list[i])

# 保存文件
with open('8.txt', 'w', encoding='utf-8') as file1:
    file1.write('测站名   高度角    ZHD     MDE    ZWD   MWE    SS')
    file1.write('\n')
    for i in range(len(new_data1)):
        file1.write(str(new_data1[i][0]) + ' ' + str(new_data1[i][-1]) + ' ' +
                    str(ZHD_list[i]) + ' ' + str(MDE_list[i]) + ' ' +
                    str(ZWD) + ' ' + str(MWE_list[i])+' ' + str(SS_list[i]))
        file1.write('\n')

四、代码问题

  1. 因作者水平有限,且时间冲突等原因,以上部分代码中未使用方便阅读的变量名,还请读者包含,自行理解;
  2. 第二问以后计算结果存在问题;
  3. 作者研究方向不涉及电离层和对流层,因此对其算法不理解,以上代码仅可参考。

网站公告

今日签到

点亮在社区的每一天
去签到