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