Python 编程语言在“工程测量实习”课程数据处理中的应用*

2023-07-25 05:18陈学永王泽诚杨水泉李冬涛
科技与创新 2023年11期
关键词:水准测量高差数据处理

张 波,陈学永,王泽诚,杨水泉,李冬涛

(广州华立学院,广东 广州 529100)

1 研究背景

在“工程测量实习”课程的教学过程中,数据处理是课程重点内容之一。工程测量实习完成以后,学生需要花费大量的时间进行测量数据的处理,教师在收到学生提交的测量实习报告后,也需要花费大量时间校核学生的测量数据的可靠性。

Python 语言是一个语法简洁、可跨平台、可扩展的开源通用脚本语言,Python 语言在数据分析、工程计算等方面优势突出[1-4]。

在“工程测量实习”课程中,一般会进行水准测量、角度测量、导线测量等实习内容,为了提高工程测量实习的效率,本文利用Python 编程语言开发了一套工程测量数据处理系统,通过使用该软件系统处理数据,极大地提高了“工程测量实习”课程测量数据的处理速度,提高了学生的学习效率,减轻了教师核查学生测量实习数据的工作量[5-6]。

2 数据处理软件主界面及数据输入流程设计

为了方便用户使用软件,需编写可视化界面,本文采用Python 程序的tkinter 库编写可视化界面[7],框架结构如图1 所示。

图1 “工程测量实习”数据处理程序主界面菜单

对于高程测量,程序需要从原始数据文件中提取相关信息,获取各站的高差、视距差、累计视距差和累计高差信息,形成高差文件。同时程序必需核查数据是否符合要求,如果数据符合要求,程序按设定格式生成包含控制点高差、水准路线长度等信息的表格文件,为下一步高程控制网平差做准备。

核查数据程序代码如下所示:

df1=df1[df1.apply(lambda x:x.str.contains("|".join(key word)),axis=1)]#遍历所有列搜索

df1=df1.dropna(how="all").dropna(axis=1,how="all")#清空全行或全列为NAN 的元素

df=df[df1.keys()]#选中所在列

df=df[df.index>df1.index[(df1.shape[0]-1)]].dropna(thresh=2)#筛选,并清空无关数据

df=df[df.applymap(lambdax:type(x)!=str)].dropna(how="all")

if df.shape[0]%2==1 and df.shape[0]>0:df=df[:-1]

dict_names=dict(zip(df.keys(),keyword))

df=df.rename(columns=dict_names)#重命名#搜索结束

if df.empty==True:#为空

state=-1

return(state,"")

n=int(df.shape[0]/2)

high=df['后视']-df['前视']#高差

high_half=high/2.0#高差中数

h_add=high_half.sum()#高差中数和

h_add=round(h_add,limit)#保留5 位小数

h_permit=round(idea(n),limit)

if abs(h_add*1000)<h_permit:

state=1

return (state,"高差中数:"+str(h_add)+"m,"+"容许值:"+str(h_permit)+"mm")

except(Exception)as e:

state=-2

return(state,"出错信息:"+str(e))对于角度测量,由于数据较多且比较烦琐,考虑采用先在Excel 软件中输入数据,再以文件的形式导入程序中进行数据处理[8],程序代码如下所示:self.root.title("「工程测量数据处理工具」")

self.root.geometry(str(w)+"x"+str(h))

self.frame=tk.Frame(master=self.root)

self.frame_1=tk.Frame(master=self.frame)

self.data_label = tk.Label(master=self.frame_1,text="待处理文件")

self.btn_choose=tk.Button(self.frame_1,text="选择文件(可多选)",command=self.choose_file)

self.btn_data_clear=tk.Button(self.frame_1,text="清空",command=self.data_Text_clear)

self.data_Text = tk.Text(master=self.frame_1)#文件输入框

利用Python 程序编程也可以准确地校核测量数据是否准确有效,程序代码如下所示:

def permit_error(df):#最大允许误差

state=0#判断情况

limit=5#精度,保留5 位小数

keyword=["后视","前视"]#关键词

idea=lambda n:pow(n,0.5)*10#最大允许误差计算公式

3 水准测量实习数据分析及相应代码

水准测量实习一般以闭合水准测量实习为主,本文以闭合水准测量数据处理展开讨论。水准测量是利用一条水平视线,并借助水准尺,来确定地面两点之间的高差,然后由已知点的高程推算出未知点位高程的测量方法。

闭合水准测量是由一已知水准点出发,沿环线待测高程点1、2、3、4 进行水准测量,最后回到原水准点的测量方法,其线路上各点之间高差的代数和理论值应等于零。由于误差的存在,实际测量值代数和只是接近于零,但不能超出设定的误差范围,否则测量数据就不符合要求,须进行重测,由此编写的Python程序核心代码如下:

def check_data(df,limit=(0,0)):

df,read,num=HoriAngle.read_data(df)

judge=HoriAngle.check_is_ok(read,num)

if not judge or not num:'''获取到数据'''

return(-1,"获取不到测回数")if not limit:

'''无误差判断条件'''

return(-1,'无误差判断条件')try:

num=int(num)

half=HoriAngle.calcu_half(read)

one=HoriAngle.calcu_one(half)

permit1=HoriAngle.calcu_perimit(half,int(limit[0]))

if num==1:

'''测回数为1 时'''

if len(permit1)>0:

'''数据不合理'''

return (0,"第"+",".join(permit1)+"行的数据误差过大")#误差过大

else:

'''数据合理'''

return(1,"半测回角值之差均<="+str(limit[0])+"″")

else:

'''测回数大于1 时'''

#aver=HoriAngle.calcu_aver(one,num)

permit2=HoriAngle.calcu_perimit(on e,int(limit[1]))

if len(permit1)>0 or len(permit2):

'''数据不合理'''

info=permit1|permit2

return(0,"第"+",".join(info)+"行的数据误差过大")#误差过大

else:

return (1," 半测回角值之差均<="+str(limit[0])+" ″ ,"+" 各 测 回 角 值 均<="+str(limit[1])+"″")#数据合理

return(-2,"未知")except(Exception)as e:

print(e)

return(-2,e)

4 角度测量实习数据分析及相应代码

角度测量是“工程测量实习”课程的基本内容,是确定地面点位的基本测量工作之一。角度测量分为水平角测量和竖直角测量,“工程测量实习”课程一般会要求学生用测回法测量水平角,本文以测回法测量水平角数据处理展开讨论。

测回法要求在测点A安置仪器,在盘左位置用照准部瞄准目标B,读取水平盘度数,再松开水平制动螺旋,顺时针方向转动照准部,瞄准目标C,读取水平盘度数,以上称为上半测回。

再纵转望远镜成盘右位置,瞄准目标C,读取水平盘度数,松开水平制动螺旋,逆时针方向转动照准部,瞄准目标B,读取水平盘度数,以上称为下半测回,即完成水平角测回法测量工作。

由此编写的Python 程序代码如下:

def calcu_half(ser):

'''计算半测回角值'''

sec=HoriAngle.to_second(ser)

ser1,ser2=HoriAngle.split_l_r(sec,2)

result=ser2-ser1

result=HoriAngle.to_recover(result)

return result def calcu_one(ser):

'''计算一测回角值'''

sec=HoriAngle.to_second(ser)

ser1,ser2=HoriAngle.split_l_r(sec,2)

result=ser1+(ser2-ser1)/2

result=result.round(0)

result=result.astype(int)

result=HoriAngle.to_recover(result)

return result

def calcu_aver(ser,n):

'''计算各测(平均)回角值'''

n=int(n)

if n==1:#如果n==1 直接返回

return ser

sec=HoriAngle.to_second(ser)

ser1,ser2=HoriAngle.split_l_r(sec,2)sec=(ser1+ser2)/n

result=sec.astype(int)

result=HoriAngle.to_recover(result)

return result def calcu_perimit(ser,limit):

'''计算是否超过允许值,返回判断结果'''

info=set()

sec=HoriAngle.to_second(ser)

ser1,ser2=HoriAngle.split_l_r(sec,2)

sec=ser2-ser1

sec=sec.abs()

#print(sec)

result=sec[sec.apply(lambda x:x>limit)]

#print(result)

lst_idx=result.index.to_list()

if not sec.empty and result.empty:

lst=result.to_list()

for i in lst_idx:

info.add(str(i))return info

5 结束语

使用Python 编程语言编写的工程测量数据软件,能够极大地提高工程测量数据处理速度,减轻教师和学生在“工程测量实习”课程中的数据计算负担。在广州华立学院的“工程测量实习”课程教学中证明,该软件不但能够帮助教师提升教学效果,也能帮助更多学生提升学习效率和学习成绩。

猜你喜欢
水准测量高差数据处理
认知诊断缺失数据处理方法的比较:零替换、多重插补与极大似然估计法*
高差影响下的城镇燃气管道水力计算简化公式
ILWT-EEMD数据处理的ELM滚动轴承故障诊断
框架结构梁板面钢筋叠合产生的高差问题探讨
同时对向间接高差精密测量技术应用研究
基于希尔伯特- 黄变换的去噪法在外测数据处理中的应用
地形高差较大的别墅区排水设计要点分析
水准测量在高层沉降观测中的应用思考
SDCORS高程代替等级水准测量的研究
全站仪进行水准测量的可行性分析