python实现闭合导线平差与坐标计算(改进)

文章详细介绍了大比例尺地形图测绘的过程,包括外业测量中的控制点和碎部测量,采用闭合导线网进行数据获取。接着讲述了如何组织测量数据,并提供了内业计算的Python代码示例,涉及角度转换、坐标增量计算等步骤,以确保测量精度并计算各测站坐标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、外业测量获取数据

以下列草图为例进行大比例尺地形图测绘,若希望绘制该区域地形图,首先要进行控制点测量,得到控制点坐标,再依据控制点进行碎部测量,采集碎部点后成图。

在此使用闭合导线网,具体流程:

  1. 在起始点BM-49处架站,先盘左瞄准J7,水平度盘置零,读取水平度盘读数和水平距离;
  2. 之后瞄准J1,读取水平度盘读数和水平距离;
  3. 切换到盘右,再读J1处水平度盘读数和水平距离;
  4. 瞄准J7,读取水平度盘读数和水平距离。

 

BM-48,与BM-49为控制点,通过测量BM-48,BM-49,J1间角度与J7,BM-49,J1间角度相减得到起始坐标方位角。

 

 二、组织数据

创建记事本:

#第一行:初始点方位角的度,分,秒;
#第二行:初始点坐标;
#第三行:J1观测角的度,分,秒,J1与J2测站间距离;
#以此类推;

 

 三、内业计算

​​​​​​​闭合导线近似平差及坐标计算原理

运行之前要修改测站数,观测角为左角还是右角!

#数据准备
D_list=[] #测站距离
Obs_degree_list=[] #观测角的弧度


import math
def dms_to_radians(degree):
    #获取度分秒
    degrees_str=degree[0]
    minutes_str=degree[1]
    seconds_str=degree[2]
    #转化为数字
    degrees=float(degrees_str)
    minutes=float(minutes_str)
    seconds=float(seconds_str)
    #计算弧度
    radians=math.radians(degrees+(minutes/60)+(seconds/3600))
    return radians

'''
#第一行:初始点方位角的度,分,秒;
#第二行:初始点坐标;
#第三行:J1观测角的度,分,秒,J1与J2测站间距离;
#以此类推;
'''
filename = '/home/z/observation_01'
n=8#测站数
user_input="T" #确定观测角方向,输入T(左角)或F(右角)

with open(filename, 'r') as f:
    # 读取第一行数据
    first_line = f.readline().strip()
    # 读取第二行数据
    second_line = f.readline().strip()
    # 读取第三行以后的数据
    for line in f:
        items_list=[]#存储观测角
        v_degree=[]#存储竖直角
        # 按分隔符拆分每一行数据
        data =line.strip()
        data=data.split(',')
        print(data)
        # 读取前三个元素和第四个元素
        item1,item2,item3,item4=data[0],data[1],data[2],data[3]
        items_list.append(item1)
        items_list.append(item2)
        items_list.append(item3)
        Obs_degree_list.append(dms_to_radians(items_list))
        D_list.append(float(item4))

a12=[]
a12=first_line.split(',')
print("起始方位角:",a12)
a12=dms_to_radians(a12)

J_x_1,J_y_1=second_line.split(',')
J_x_1,J_y_1=float(J_x_1),float(J_y_1)
print("起始点测站坐标:",J_x_1,",",J_y_1)
print("测站距离:",D_list)
print("观测角弧度:",Obs_degree_list)
b_list=Obs_degree_list


#1.计算方位角闭合差
sum_b=sum(b_list)
f_b=sum_b-((n-2)*math.pi)
print("\n方位角闭合差为:",f_b)
f_b_limit=(40/3600)*(math.pi/180)*math.sqrt(n)
print("理论限差为:",f_b_limit)
f_b_abs=abs(f_b)
if(f_b_abs<f_b_limit):
    print("\n小于图根级限差,测的不错!")
else:
    print("\n测的依托答辩,爬去重测!!!")
    #sys.exit()

#2.计算改正数,分配内角和
V=-f_b/n
print("\n方位角改正数:",V)
b_list_new=list(map(lambda x:x+V,b_list))
print("\n改正后各观测角:",b_list_new)

#3.计算各边方位角
b_list_cal=b_list_new[1:]+b_list_new[:1]
a_list=[]
a_list.append(a12)
i=0
while i<=n-2:
    if user_input=="T":
        a_j=a_list[i]+b_list_cal[i]-math.pi #j=i+1
    elif user_input == "F":
        a_j=a_list[i]-b_list_cal[i]+math.pi  #j=i+1
    a_list.append(a_j)
    i+=1
print("各边方位角:",a_list)

#4.计算各边坐标增量
cos_a_list=list(map(lambda x:math.cos(x),a_list))
sin_a_list=list(map(lambda x:math.sin(x),a_list))
import numpy as np
array1=np.array(cos_a_list)
array2=np.array(sin_a_list)
array3=np.array(D_list)
diff_x=np.multiply(array1,array3)
diff_y=np.multiply(array2,array3)
print("\nx坐标增量:",diff_x)
print("y坐标增量",diff_y)

#5.计算导线闭合差
f_x=sum(diff_x)
f_y=sum(diff_y)
f=math.sqrt(f_x**2+f_y**2)
K=f/sum(D_list)
print("\n导线相对闭合差:\n",K)
if(K<(1/4000)):
    print("真棒!!!")
else:
    print("\n真他娘可惜!")
    #sys.exit()

#6.分配坐标增量闭合差
v_x_list=list(map(lambda x:(-f_x/sum(D_list))*x,D_list))
v_y_list=list(map(lambda x:(-f_y/sum(D_list))*x,D_list))
print("\nx轴坐标增量闭合差:",v_x_list)
print("\ny轴坐标增量闭合差:",v_y_list)
diff_x_new=[]
diff_y_new=[]
for x,y in zip(diff_x,v_x_list):
    diff_x_new.append(x+y)
for x,y in zip(diff_y,v_y_list):
    diff_y_new.append(x+y)
print("\nx轴坐标增量:",diff_x_new)
print("\ny轴坐标增量:",diff_y_new)

#7.计算各点坐标
J_x=[]
J_x.append(J_x_1)
i=0
while(i<=n-2):
    J_x_j=diff_x_new[i]+J_x[i] #j=i+1
    J_x.append(J_x_j)
    i+=1

J_y=[]
J_y.append(J_y_1)
i=0
while(i<=n-2):
    J_y_j=diff_y_new[i]+J_y[i] #j=i+1
    J_y.append(J_y_j)
    i+=1

#8.输出各点坐标
i=0
result=[[x,y] for x,y in zip(J_x,J_y)]
for item in result:
    print("\n测站%d坐标:"%(i+1),item)
    i+=1
result[-1][-1]+=diff_y_new[n-1]
result[-1][-2]+=diff_x_new[n-1]
print("\n检核测站1坐标:",result[n-1])

运行结果:

 

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值