白 雪,彭 晨
(云南省測(cè)繪工程院,云南 昆明 650033)
天寶公司的DINI系列數(shù)字水準(zhǔn)儀具有精度高、讀數(shù)快、效率高等特點(diǎn),深受廣大測(cè)繪作業(yè)人員的青睞。采用DiNi03水準(zhǔn)儀可以實(shí)現(xiàn)自動(dòng)記錄、檢核數(shù)據(jù),有效的減少人工報(bào)讀數(shù)據(jù)、聽記數(shù)據(jù)以及現(xiàn)場(chǎng)計(jì)算的作業(yè)流程,避免因人工記錄錯(cuò)誤造成的重測(cè)情況。在提高工作效率的同時(shí),也達(dá)到了“少紙化”辦公,綠色作業(yè)的目標(biāo)。
DiNi03電子水準(zhǔn)儀雖然有著諸多的優(yōu)點(diǎn),但是仍然存在和國家標(biāo)準(zhǔn)水準(zhǔn)測(cè)量通用格式不相同的地方,主要為隨機(jī)軟件下載的電子記錄水準(zhǔn)記錄數(shù)據(jù)和現(xiàn)行國家規(guī)范格式不同,并且沒有與Cosa(科傻)平差軟件對(duì)接的數(shù)據(jù)。綜上所述,筆者利用Python語言進(jìn)行程序設(shè)計(jì)[1],對(duì)天寶隨機(jī)數(shù)據(jù)軟件下載的數(shù)據(jù)進(jìn)行數(shù)據(jù)分離,轉(zhuǎn)換為武漢大學(xué)開發(fā)的Cosa(科傻)平差軟件通用數(shù)據(jù)格式并生成Excel標(biāo)準(zhǔn)水準(zhǔn)手簿格式。
在天寶DiNi03電子水準(zhǔn)儀的儀器內(nèi)置程序中,有4種測(cè)量模式可供選擇[2],分別為:BF(后前)、BBFF(后后前前)、BFFB(后前前后)、FBBF(前后后前),其中在二等及其以上的水準(zhǔn)測(cè)量作業(yè)中,根據(jù)相關(guān)國家規(guī)范的要求,往測(cè)為后前前后,返測(cè)為前后后前,并奇偶站交替[3]。以二等水準(zhǔn)測(cè)量往測(cè)為例,數(shù)據(jù)記錄格式見圖1。
由圖1可知:①框中所表示的為天寶電子水準(zhǔn)儀數(shù)據(jù)記錄的流水作業(yè)號(hào);②框中的信息反映了作業(yè)員在作業(yè)時(shí),所建立的工程文件信息;③框中所代表的信息為本條路線的起始;④框中為觀測(cè)的順序;⑤框中為點(diǎn)號(hào)信息;⑥框中為天寶電子水準(zhǔn)儀的編碼信息,該信息在作業(yè)中取決于作業(yè)員的作業(yè)習(xí)慣,為非必須;⑦框中記錄了作業(yè)時(shí)間(此時(shí)間為水準(zhǔn)儀中的系統(tǒng)時(shí)間);⑧框中為作業(yè)員在建立新的水準(zhǔn)路線時(shí),所取得的線路名稱;⑨框中的信息為當(dāng)前測(cè)站的記錄順序,可以從該信息中判斷出此測(cè)站為奇數(shù)站或是偶數(shù)站;⑩框中為尺子的讀數(shù);框中記錄的是水準(zhǔn)儀的視距信息。通過對(duì)原始數(shù)據(jù)的解析,進(jìn)一步實(shí)現(xiàn)程序相關(guān)功能。
圖1 天寶DiNi03電子水準(zhǔn)儀原始數(shù)據(jù)格式Fig.1 Original data format of Trimble DiNi03 electronic level
程序設(shè)計(jì)的基本思路,如圖2所示。
圖2 程序設(shè)計(jì)流程圖Fig.2 Program design flow
為達(dá)到行業(yè)規(guī)范,通過加載參數(shù)文件,將所測(cè)數(shù)據(jù)等級(jí)、測(cè)段信息、天氣、觀測(cè)者、觀測(cè)時(shí)間等信息展現(xiàn)在生成的標(biāo)準(zhǔn)電子手簿中,使用戶能夠在標(biāo)準(zhǔn)手簿中獲取所有測(cè)段相關(guān)信息。經(jīng)過實(shí)踐,發(fā)現(xiàn)生產(chǎn)中還需要對(duì)所測(cè)得的數(shù)據(jù)進(jìn)行嚴(yán)密平差處理。為了能夠?qū)y(cè)量數(shù)據(jù)進(jìn)行平差處理,本程序最終生成武漢大學(xué)研發(fā)的Cosa(科傻)平差系統(tǒng)能識(shí)別的“*.in1”平差文件。
用戶界面主要用于實(shí)現(xiàn)原始數(shù)據(jù)文件和參數(shù)文件的選擇,并確定生成記錄數(shù)據(jù)文件的保存位置。
原始數(shù)據(jù)文件以及參數(shù)文件的選擇通過讀取文件絕對(duì)路徑進(jìn)行,通過讀取用戶選擇的文件夾絕對(duì)路徑與程序自定義的文件名稱進(jìn)行字符串組合,得到生成記錄數(shù)據(jù)文件的保存位置。原始數(shù)據(jù)文件及參數(shù)文件選擇完成,并確定生成記錄數(shù)據(jù)文件的保存位置后,點(diǎn)擊“開始”按鈕,程序?qū)?duì)數(shù)據(jù)進(jìn)行解析轉(zhuǎn)存。
參數(shù)文件由用戶按照模板記錄于“*.txt”文件中,根據(jù)用戶所選擇的參數(shù)文件所在的絕對(duì)位置,打開參數(shù)文件,以“,”為分隔符,對(duì)所記錄的參數(shù)字符串進(jìn)行分割,按照等級(jí),方向,儀器型號(hào),儀器編號(hào),天氣,風(fēng)向,風(fēng)力,土質(zhì),呈像,觀測(cè)者,測(cè)量單位的順序,讀取參數(shù)信息,并存儲(chǔ)于列表中,以便后續(xù)寫入相應(yīng)記錄文件中。實(shí)現(xiàn)代碼如下:
pf=open(parafile)
uline=pf.readlines()[1]
para=list(uline.split(′,′))
pf.close()
3.3.1 原始數(shù)據(jù)讀取
原始數(shù)據(jù)保存于“*.dat”文件中,通過用戶所選擇的原始數(shù)據(jù)文件絕對(duì)位置,打開原始數(shù)據(jù)文件,并按行讀取原始數(shù)據(jù),存儲(chǔ)于列表中,以便后續(xù)解析處理。實(shí)現(xiàn)代碼如下:
of=open(odfile)
datas=of.readlines()
of.close()
3.3.2 原始數(shù)據(jù)解析
天寶電子水準(zhǔn)儀所記錄的數(shù)據(jù)中,根據(jù)不同數(shù)據(jù)特征可區(qū)分該行數(shù)據(jù)所記錄信息。主要的數(shù)據(jù)特征包括以下幾類:
1)字符串含有“Start-Line”:開始一條水準(zhǔn)路線;
2)字符串含有“End-Line”:結(jié)束一條水準(zhǔn)路線;
3)字符串含有“Rb”:后視數(shù)據(jù);
4)字符串含有“Rf”:前視數(shù)據(jù);
5)字符串含有“#####”:重測(cè)記錄數(shù)據(jù);
6)字符串含有點(diǎn)號(hào)信息,并且不具有以上5種特殊標(biāo)識(shí)符:移動(dòng)至新測(cè)站。
讀取原始數(shù)據(jù)列表數(shù)據(jù)項(xiàng),根據(jù)以上特征判斷原始數(shù)據(jù)項(xiàng)含義,并獲取相應(yīng)記錄信息存儲(chǔ)于列表中。原始數(shù)據(jù)項(xiàng)含義對(duì)應(yīng)記錄信息,如表1所示。
表1 原始數(shù)據(jù)項(xiàng)含義對(duì)應(yīng)記錄信息表
其中,當(dāng)數(shù)據(jù)項(xiàng)表示為結(jié)束一條水準(zhǔn)路線時(shí),時(shí)間信息為使用程序的日期。實(shí)現(xiàn)代碼如下:
dt=datetime.datetime.now()
time=str(dt.year)+′年′+str(dt.month)+′月′+str(dt.day)+′日′
原始數(shù)據(jù)結(jié)束一條水準(zhǔn)路線時(shí),程序?qū)⒂涗浽摋l水準(zhǔn)路線的列表傳入信息寫入模塊,將數(shù)據(jù)寫入相應(yīng)的記錄手簿文件及平差文件。
3.4.1 記錄手簿格式寫入
記錄手簿包括用于測(cè)量信息的表頭,用于記錄測(cè)量數(shù)據(jù)的表格,以及用于記錄測(cè)段計(jì)算數(shù)據(jù)的結(jié)尾。為方便用戶閱覽且輸出美觀,設(shè)置打印紙張大小為A4紙,每一頁均輸出表頭,至多輸出13個(gè)測(cè)站數(shù)據(jù),測(cè)量數(shù)據(jù)輸出完成后,輸出結(jié)尾。由于測(cè)站數(shù)量不固定,表格與測(cè)站數(shù)據(jù)進(jìn)行同步輸出。
為便于輸出,將記錄手簿格式分為表頭,表格以及結(jié)尾分別存儲(chǔ)于3張模板表格中,寫入時(shí)按需求分別調(diào)用。根據(jù)模板,設(shè)置輸出記錄手簿的Excel文件單元格格式。實(shí)現(xiàn)代碼如下:
for i in range(1,nrows+1):
for j in range(97,97+ncols+1):
n=chr(j).upper()
a='%s%d’ % (n,(i+number))
b='%s%d’ % (n,i)
ws[a].border=copy(rs[b].border)
ws[a].alignment=copy(rs[b].alignment)
ws[a].font=copy(rs[b].font)
ws[a].value=copy(rs[b].value)
3.4.2 記錄手簿數(shù)據(jù)寫入
表頭信息由參數(shù)文件及部分原始數(shù)據(jù)得到,根據(jù)記錄手簿格式,將相應(yīng)信息填入對(duì)應(yīng)單元格中。表格中觀測(cè)數(shù)據(jù)由原始數(shù)據(jù)列表中輸出,視距差、累計(jì)差、高差、讀數(shù)差由原始數(shù)據(jù)計(jì)算得到,并填入對(duì)應(yīng)單元格中。測(cè)站數(shù)據(jù)輸出完成后,對(duì)測(cè)段的累計(jì)前距、累計(jì)后距、累計(jì)視距差、累計(jì)高差、測(cè)段距離進(jìn)行計(jì)算,并輸出結(jié)尾。實(shí)現(xiàn)代碼如下:
sjc=((float(datas[i][4])-float(datas[i][8]))+(float(datas[i][5])-float(datas[i][9])))/2
sjc=round(sjc,5)
sjc=round(sjc,4)
acc_s=acc_s+sjc
acc_s=round(acc_s,4)
gc1=float(datas[i][6])-float(datas[i][10])
gc1=round(gc1,5)
gc2=float(datas[i][7])-float(datas[i][11])
gc2=round(gc2,5)
dsc_h=(float(datas[i][6])-float(datas[i][7]))*1000
dsc_h=round(dsc_h,2)
dsc_q=(float(datas[i][10])-float(datas[i][11]))*1000
dsc_q=round(dsc_q,2)
dsc=dsc_h-dsc_q
dsc=round(dsc,2)
gc=(gc1+gc2)/2
gc=round(gc,6)
gc=round(gc,5)
acc_gc=acc_gc+gc
distance=distance+float(datas[i][5])+float(datas[i][9])
dis_h=dis_h+float(datas[i][5])
dis_q=dis_q+float(datas[i][9])
distance=distance/1000
dis_h=dis_h/1000
dis_q=dis_q/1000
3.4.3 平差文件寫入
平差文件記錄每一條水準(zhǔn)路線由起始點(diǎn)到終止點(diǎn)的高差和距離。實(shí)現(xiàn)代碼如下:
gc=str(′%.5f′ % gc)
distance=str('%.3f’ % distance)
f=open(file,′a′)
f.write(spoint.ljust(8)+′,′+epoint.ljust(8)+′,′+gc.rjust(11)+′,′+distance.rjust(6)+′ ′)
f.close()
程序運(yùn)行完成,由原始數(shù)據(jù)文件*.dat輸出相應(yīng)記錄手簿文件*.xlsx以及平差文件*.in1。
DiNi03電子水準(zhǔn)儀能夠?qū)崿F(xiàn)自動(dòng)記錄、核檢測(cè)量數(shù)據(jù)的功能,提高了測(cè)繪作業(yè)效率,但其隨機(jī)軟件下載的電子記錄水準(zhǔn)記錄數(shù)據(jù)和現(xiàn)行國家規(guī)范格式不同,也無法與Cosa(科傻)平差軟件對(duì)接。結(jié)合Python語言在數(shù)據(jù)處理方面的優(yōu)勢(shì),本文編寫了一個(gè)電子水準(zhǔn)記錄數(shù)據(jù)處理程序,將DiNi03電子水準(zhǔn)儀數(shù)據(jù)轉(zhuǎn)換為國家標(biāo)準(zhǔn)格式,并得到相應(yīng)平差文件,使其所得到的測(cè)量數(shù)據(jù)在后續(xù)的使用中更加方便,大大的優(yōu)化了幾何水準(zhǔn)測(cè)量的作業(yè)效率,具有更強(qiáng)的實(shí)用性。