張 波,陳學(xué)永,王澤誠(chéng),楊水泉,李冬濤
(廣州華立學(xué)院,廣東 廣州 529100)
在“工程測(cè)量實(shí)習(xí)”課程的教學(xué)過(guò)程中,數(shù)據(jù)處理是課程重點(diǎn)內(nèi)容之一。工程測(cè)量實(shí)習(xí)完成以后,學(xué)生需要花費(fèi)大量的時(shí)間進(jìn)行測(cè)量數(shù)據(jù)的處理,教師在收到學(xué)生提交的測(cè)量實(shí)習(xí)報(bào)告后,也需要花費(fèi)大量時(shí)間校核學(xué)生的測(cè)量數(shù)據(jù)的可靠性。
Python 語(yǔ)言是一個(gè)語(yǔ)法簡(jiǎn)潔、可跨平臺(tái)、可擴(kuò)展的開(kāi)源通用腳本語(yǔ)言,Python 語(yǔ)言在數(shù)據(jù)分析、工程計(jì)算等方面優(yōu)勢(shì)突出[1-4]。
在“工程測(cè)量實(shí)習(xí)”課程中,一般會(huì)進(jìn)行水準(zhǔn)測(cè)量、角度測(cè)量、導(dǎo)線測(cè)量等實(shí)習(xí)內(nèi)容,為了提高工程測(cè)量實(shí)習(xí)的效率,本文利用Python 編程語(yǔ)言開(kāi)發(fā)了一套工程測(cè)量數(shù)據(jù)處理系統(tǒng),通過(guò)使用該軟件系統(tǒng)處理數(shù)據(jù),極大地提高了“工程測(cè)量實(shí)習(xí)”課程測(cè)量數(shù)據(jù)的處理速度,提高了學(xué)生的學(xué)習(xí)效率,減輕了教師核查學(xué)生測(cè)量實(shí)習(xí)數(shù)據(jù)的工作量[5-6]。
為了方便用戶使用軟件,需編寫(xiě)可視化界面,本文采用Python 程序的tkinter 庫(kù)編寫(xiě)可視化界面[7],框架結(jié)構(gòu)如圖1 所示。
圖1 “工程測(cè)量實(shí)習(xí)”數(shù)據(jù)處理程序主界面菜單
對(duì)于高程測(cè)量,程序需要從原始數(shù)據(jù)文件中提取相關(guān)信息,獲取各站的高差、視距差、累計(jì)視距差和累計(jì)高差信息,形成高差文件。同時(shí)程序必需核查數(shù)據(jù)是否符合要求,如果數(shù)據(jù)符合要求,程序按設(shè)定格式生成包含控制點(diǎn)高差、水準(zhǔn)路線長(zhǎng)度等信息的表格文件,為下一步高程控制網(wǎng)平差做準(zhǔn)備。
核查數(shù)據(jù)程序代碼如下所示:
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)#篩選,并清空無(wú)關(guān)數(shù)據(jù)
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)#重命名#搜索結(jié)束
if df.empty==True:#為空
state=-1
return(state,"")
n=int(df.shape[0]/2)
high=df['后視']-df['前視']#高差
high_half=high/2.0#高差中數(shù)
h_add=high_half.sum()#高差中數(shù)和
h_add=round(h_add,limit)#保留5 位小數(shù)
h_permit=round(idea(n),limit)
if abs(h_add*1000)<h_permit:
state=1
return (state,"高差中數(shù):"+str(h_add)+"m,"+"容許值:"+str(h_permit)+"mm")
except(Exception)as e:
state=-2
return(state,"出錯(cuò)信息:"+str(e))對(duì)于角度測(cè)量,由于數(shù)據(jù)較多且比較煩瑣,考慮采用先在Excel 軟件中輸入數(shù)據(jù),再以文件的形式導(dǎo)入程序中進(jìn)行數(shù)據(jù)處理[8],程序代碼如下所示:self.root.title("「工程測(cè)量數(shù)據(jù)處理工具」")
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 程序編程也可以準(zhǔn)確地校核測(cè)量數(shù)據(jù)是否準(zhǔn)確有效,程序代碼如下所示:
def permit_error(df):#最大允許誤差
state=0#判斷情況
limit=5#精度,保留5 位小數(shù)
keyword=["后視","前視"]#關(guān)鍵詞
idea=lambda n:pow(n,0.5)*10#最大允許誤差計(jì)算公式
水準(zhǔn)測(cè)量實(shí)習(xí)一般以閉合水準(zhǔn)測(cè)量實(shí)習(xí)為主,本文以閉合水準(zhǔn)測(cè)量數(shù)據(jù)處理展開(kāi)討論。水準(zhǔn)測(cè)量是利用一條水平視線,并借助水準(zhǔn)尺,來(lái)確定地面兩點(diǎn)之間的高差,然后由已知點(diǎn)的高程推算出未知點(diǎn)位高程的測(cè)量方法。
閉合水準(zhǔn)測(cè)量是由一已知水準(zhǔn)點(diǎn)出發(fā),沿環(huán)線待測(cè)高程點(diǎn)1、2、3、4 進(jìn)行水準(zhǔn)測(cè)量,最后回到原水準(zhǔn)點(diǎn)的測(cè)量方法,其線路上各點(diǎn)之間高差的代數(shù)和理論值應(yīng)等于零。由于誤差的存在,實(shí)際測(cè)量值代數(shù)和只是接近于零,但不能超出設(shè)定的誤差范圍,否則測(cè)量數(shù)據(jù)就不符合要求,須進(jìn)行重測(cè),由此編寫(xiě)的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:'''獲取到數(shù)據(jù)'''
return(-1,"獲取不到測(cè)回?cái)?shù)")if not limit:
'''無(wú)誤差判斷條件'''
return(-1,'無(wú)誤差判斷條件')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:
'''測(cè)回?cái)?shù)為1 時(shí)'''
if len(permit1)>0:
'''數(shù)據(jù)不合理'''
return (0,"第"+",".join(permit1)+"行的數(shù)據(jù)誤差過(guò)大")#誤差過(guò)大
else:
'''數(shù)據(jù)合理'''
return(1,"半測(cè)回角值之差均<="+str(limit[0])+"″")
else:
'''測(cè)回?cái)?shù)大于1 時(shí)'''
#aver=HoriAngle.calcu_aver(one,num)
permit2=HoriAngle.calcu_perimit(on e,int(limit[1]))
if len(permit1)>0 or len(permit2):
'''數(shù)據(jù)不合理'''
info=permit1|permit2
return(0,"第"+",".join(info)+"行的數(shù)據(jù)誤差過(guò)大")#誤差過(guò)大
else:
return (1," 半測(cè)回角值之差均<="+str(limit[0])+" ″ ,"+" 各 測(cè) 回 角 值 均<="+str(limit[1])+"″")#數(shù)據(jù)合理
return(-2,"未知")except(Exception)as e:
print(e)
return(-2,e)
角度測(cè)量是“工程測(cè)量實(shí)習(xí)”課程的基本內(nèi)容,是確定地面點(diǎn)位的基本測(cè)量工作之一。角度測(cè)量分為水平角測(cè)量和豎直角測(cè)量,“工程測(cè)量實(shí)習(xí)”課程一般會(huì)要求學(xué)生用測(cè)回法測(cè)量水平角,本文以測(cè)回法測(cè)量水平角數(shù)據(jù)處理展開(kāi)討論。
測(cè)回法要求在測(cè)點(diǎn)A安置儀器,在盤(pán)左位置用照準(zhǔn)部瞄準(zhǔn)目標(biāo)B,讀取水平盤(pán)度數(shù),再松開(kāi)水平制動(dòng)螺旋,順時(shí)針?lè)较蜣D(zhuǎn)動(dòng)照準(zhǔn)部,瞄準(zhǔn)目標(biāo)C,讀取水平盤(pán)度數(shù),以上稱為上半測(cè)回。
再縱轉(zhuǎn)望遠(yuǎn)鏡成盤(pán)右位置,瞄準(zhǔn)目標(biāo)C,讀取水平盤(pán)度數(shù),松開(kāi)水平制動(dòng)螺旋,逆時(shí)針?lè)较蜣D(zhuǎn)動(dòng)照準(zhǔn)部,瞄準(zhǔn)目標(biāo)B,讀取水平盤(pán)度數(shù),以上稱為下半測(cè)回,即完成水平角測(cè)回法測(cè)量工作。
由此編寫(xiě)的Python 程序代碼如下:
def calcu_half(ser):
'''計(jì)算半測(cè)回角值'''
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):
'''計(jì)算一測(cè)回角值'''
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):
'''計(jì)算各測(cè)(平均)回角值'''
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):
'''計(jì)算是否超過(guò)允許值,返回判斷結(jié)果'''
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 編程語(yǔ)言編寫(xiě)的工程測(cè)量數(shù)據(jù)軟件,能夠極大地提高工程測(cè)量數(shù)據(jù)處理速度,減輕教師和學(xué)生在“工程測(cè)量實(shí)習(xí)”課程中的數(shù)據(jù)計(jì)算負(fù)擔(dān)。在廣州華立學(xué)院的“工程測(cè)量實(shí)習(xí)”課程教學(xué)中證明,該軟件不但能夠幫助教師提升教學(xué)效果,也能幫助更多學(xué)生提升學(xué)習(xí)效率和學(xué)習(xí)成績(jī)。