张 波,陈学永,王泽诚,杨水泉,李冬涛
(广州华立学院,广东 广州 529100)
在“工程测量实习”课程的教学过程中,数据处理是课程重点内容之一。工程测量实习完成以后,学生需要花费大量的时间进行测量数据的处理,教师在收到学生提交的测量实习报告后,也需要花费大量时间校核学生的测量数据的可靠性。
Python 语言是一个语法简洁、可跨平台、可扩展的开源通用脚本语言,Python 语言在数据分析、工程计算等方面优势突出[1-4]。
在“工程测量实习”课程中,一般会进行水准测量、角度测量、导线测量等实习内容,为了提高工程测量实习的效率,本文利用Python 编程语言开发了一套工程测量数据处理系统,通过使用该软件系统处理数据,极大地提高了“工程测量实习”课程测量数据的处理速度,提高了学生的学习效率,减轻了教师核查学生测量实习数据的工作量[5-6]。
为了方便用户使用软件,需编写可视化界面,本文采用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#最大允许误差计算公式
水准测量实习一般以闭合水准测量实习为主,本文以闭合水准测量数据处理展开讨论。水准测量是利用一条水平视线,并借助水准尺,来确定地面两点之间的高差,然后由已知点的高程推算出未知点位高程的测量方法。
闭合水准测量是由一已知水准点出发,沿环线待测高程点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)
角度测量是“工程测量实习”课程的基本内容,是确定地面点位的基本测量工作之一。角度测量分为水平角测量和竖直角测量,“工程测量实习”课程一般会要求学生用测回法测量水平角,本文以测回法测量水平角数据处理展开讨论。
测回法要求在测点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
使用Python 编程语言编写的工程测量数据软件,能够极大地提高工程测量数据处理速度,减轻教师和学生在“工程测量实习”课程中的数据计算负担。在广州华立学院的“工程测量实习”课程教学中证明,该软件不但能够帮助教师提升教学效果,也能帮助更多学生提升学习效率和学习成绩。