注:本项目制作目的为辅助学习,请在熟练掌握计算方法后使用,切勿直接使用脚本通杀,否则后果自负
脚本经过大量实地数据测试皆无问题,如有误差较大情况,纯属测量错误
个人编写,欢迎指正
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()
运行结果: