山东科技大学数字地形测量实习水准测量与导线测量自动化计算脚本

注:本项目制作目的为辅助学习,请在熟练掌握计算方法后使用,切勿直接使用脚本通杀,否则后果自负

脚本经过大量实地数据测试皆无问题,如有误差较大情况,纯属测量错误

个人编写,欢迎指正


1.水准测量脚本

运行环境:python3.12,安装依赖库:openyxl

输入以后根据提示运行即可

需要将资源绑定包中的celiang.xlsx和本代码放到一个文件夹里运行,运行时需要把表格关掉,否则数据无法写入

from openpyxl import load_workbook


a = float(input("请输入黑后尺上丝: "))
e = float(input("请输入黑后尺下丝: "))
c = float(input("请输入黑后尺中丝: "))
d = float(input("请输入红后尺中丝: "))
b = float(input("请输入黑前尺上丝: "))
f = float(input("请输入黑前尺下丝: "))
g = float(input("请输入黑前尺中丝: "))
h = float(input("请输入红前尺中丝: "))
num = int(input("请输入测量次数: "))


file_path = 'celiang.xlsx'
wb = load_workbook(file_path)
ws = wb.active


start_row = (num*4)+1


def write_to_merged_cell(ws, cell_range, value):
    start_cell = cell_range.split(':')[0]
    ws[start_cell] = value


write_to_merged_cell(ws, f'B{start_row}:C{start_row}', a)
write_to_merged_cell(ws, f'D{start_row}:E{start_row}', b)
write_to_merged_cell(ws, f'G{start_row}:H{start_row}', c)
write_to_merged_cell(ws, f'I{start_row}:J{start_row}', d)
write_to_merged_cell(ws, f'B{start_row + 1}:C{start_row + 1}', e)
write_to_merged_cell(ws, f'D{start_row + 1}:E{start_row + 1}', f)
write_to_merged_cell(ws, f'G{start_row + 1}:H{start_row + 1}', g)
write_to_merged_cell(ws, f'I{start_row + 1}:J{start_row + 1}', h)

write_to_merged_cell(ws, f'B{start_row + 2}:C{start_row + 2}', (a - e) / 100)
write_to_merged_cell(ws, f'D{start_row + 2}:E{start_row + 2}', (b - f) / 100)
write_to_merged_cell(ws, f'G{start_row + 2}:H{start_row + 2}', c - g)
write_to_merged_cell(ws, f'I{start_row + 2}:J{start_row + 2}', d - h)

write_to_merged_cell(ws, f'K{start_row}', c + 4787 - d)
write_to_merged_cell(ws, f'K{start_row + 1}', g + 4687 - h)
write_to_merged_cell(ws, f'K{start_row + 2}', c - g + 100 - (d - h))

write_to_merged_cell(ws, f'B{start_row + 3}:C{start_row + 3}', (a - e) / 100 - (b - f) / 100)
write_to_merged_cell(ws, f'A{start_row}:A{start_row+4}', num)




wb.save(file_path)

 运行结果如下所示,皆为自动化计算

2.导线测量脚本 

运行环境:python3.12 安装依赖库:openyxl

输入以后根据提示运行即可

需要将资源绑定包中的daoxian.xlsx和本代码放到一个文件夹里运行,运行时需要把表格关掉,否则数据无法写入:


import openpyxl
def dms_to_decimal(degree, minute, second):
    return degree + minute / 60 + second / 3600


def decimal_to_dms(decimal):
    degree = int(decimal)
    minute = int((decimal - degree) * 60)
    second = round((decimal - degree - minute / 60) * 3600)
    return degree, minute, second


def add_angles(angle1, angle2):
    degree1, minute1, second1 = angle1
    degree2, minute2, second2 = angle2

    decimal1 = dms_to_decimal(degree1, minute1, second1)
    decimal2 = dms_to_decimal(degree2, minute2, second2)

    result_decimal = (decimal1 + decimal2) % 360
    return decimal_to_dms(result_decimal)

def add180_angles(angle1):
    degree1, minute1, second1 = angle1


    decimal1 = dms_to_decimal(degree1, minute1, second1)
    decimal2 = dms_to_decimal(180, 00, 00)

    result_decimal = (decimal1 + decimal2) % 360
    return decimal_to_dms(result_decimal)


def subtract_angles(angle1, angle2):
    degree1, minute1, second1 = angle1
    degree2, minute2, second2 = angle2

    decimal1 = dms_to_decimal(degree1, minute1, second1)
    decimal2 = dms_to_decimal(degree2, minute2, second2)

    result_decimal = (decimal1 - decimal2) % 360
    if result_decimal < 0:
        result_decimal += 360
    return decimal_to_dms(result_decimal)


def parse_input(input_str):
    parts = input_str.split()
    if len(parts) != 3:
        raise ValueError("输入格式错误。请使用 '度 分 秒' 格式。")
    degree, minute, second = map(float, parts)
    return int(degree), int(minute), int(round(second))


def get_larger_angle(angle1, angle2):
    decimal1 = dms_to_decimal(*angle1)
    decimal2 = dms_to_decimal(*angle2)

    if decimal1 > decimal2:
        return angle1
    return angle2


def get_smaller_angle(angle1, angle2):
    decimal1 = dms_to_decimal(*angle1)
    decimal2 = dms_to_decimal(*angle2)

    if decimal1 < decimal2:
        return angle1
    return angle2


def format_dms(angle):
    degree, minute, second = angle
    return f"{degree}° {minute}' {second}\""


def average_angle(angle1, angle2):
    degree1, minute1, second1 = angle1
    degree2, minute2, second2 = angle2

    decimal1 = dms_to_decimal(degree1, minute1, second1)
    decimal2 = dms_to_decimal(degree2, minute2, second2)

    average_decimal = (decimal1 + decimal2) / 2
    degree, minute, second = decimal_to_dms(average_decimal)

   
    if not second.is_integer():  
        second_int = int(second)  
        if second_int % 2 != 0:  
            second = second_int + 1
        else:
            second = second_int
    else:
        second = int(second) 

   
    if second >= 60:
        second = 0
        minute += 1
        if minute >= 60:
            minute = 0
            degree += 1

    return degree, minute, second



def main():
    print("请输入测站数:")
    a = int(input().strip())
    print("请输入测回数:")
    b = int(input().strip())

   
    print("请输入盘左3点号数值")
    angle1_str = input().strip()
    zuo3 = parse_input(angle1_str)

    print("请输入盘左1点号数值 ")
    angle2_str = input().strip()
    zuo1 = parse_input(angle2_str)

    print("请输入盘右1点号数值 ")
    angle3_str = input().strip()
    you1 = parse_input(angle3_str)

    print("请输入盘右3点号数值 ")
    angle4_str = input().strip()
    you3 = parse_input(angle4_str)

    zuobch = subtract_angles(zuo1, zuo3)
    youbch = subtract_angles(you1, you3)
    yich = average_angle(zuobch, youbch)
    c1 = subtract_angles(get_larger_angle(add180_angles(get_smaller_angle(zuo1, you1)), get_larger_angle(zuo1, you1)),
                         get_smaller_angle(add180_angles(get_smaller_angle(zuo1, you1)), get_larger_angle(zuo1, you1)))
    c3 = subtract_angles(get_larger_angle(add180_angles(get_smaller_angle(zuo3, you3)), get_larger_angle(zuo3, you3)),
                         get_smaller_angle(add180_angles(get_smaller_angle(zuo3, you3)), get_larger_angle(zuo3, you3)))
    hc = subtract_angles(get_larger_angle(zuobch, youbch), get_smaller_angle(zuobch, youbch))

    sczuo1 = format_dms(zuo1)
    sczuo3 = format_dms(zuo3)
    scyou1 = format_dms(you1)
    scyou3 = format_dms(you3)
    sczuobch = format_dms(zuobch)
    scyoubch = format_dms(youbch)
    scyich = format_dms(yich)
    scc1 = format_dms(c1)
    scc3 = format_dms(c3)
    schc = format_dms(hc)

    
    wb = openpyxl.load_workbook('daoxian.xlsx')
    ws = wb.active

    
    row1 = 6 * a + 2 * b - 2
    row2 = 6 * a + 2 * b - 1

   
    ws[f'C{row1}'] = sczuo1
    ws[f'C{row2}'] = sczuo3
    ws[f'D{row1}'] = scyou1
    ws[f'D{row2}'] = scyou3
    ws[f'F{row1}'] = sczuobch
    ws[f'F{row2}'] = scyoubch
    ws[f'E{row1}'] = scc1
    ws[f'E{row2}'] = scc3
    ws[f'G{row1}'] = schc
    ws[f'H{row1}'] = scyich
    ws[f'B{row1}'] = 1
    ws[f'B{row2}'] = 3
    ws[f'A{row1}'] = f'{a} {b}'

 
    wb.save('daoxian.xlsx')


if __name__ == '__main__':
    main()

 运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值