白 雪,彭 晨
(云南省测绘工程院,云南 昆明 650033)
天宝公司的DINI系列数字水准仪具有精度高、读数快、效率高等特点,深受广大测绘作业人员的青睐。采用DiNi03水准仪可以实现自动记录、检核数据,有效的减少人工报读数据、听记数据以及现场计算的作业流程,避免因人工记录错误造成的重测情况。在提高工作效率的同时,也达到了“少纸化”办公,绿色作业的目标。
DiNi03电子水准仪虽然有着诸多的优点,但是仍然存在和国家标准水准测量通用格式不相同的地方,主要为随机软件下载的电子记录水准记录数据和现行国家规范格式不同,并且没有与Cosa(科傻)平差软件对接的数据。综上所述,笔者利用Python语言进行程序设计[1],对天宝随机数据软件下载的数据进行数据分离,转换为武汉大学开发的Cosa(科傻)平差软件通用数据格式并生成Excel标准水准手簿格式。
在天宝DiNi03电子水准仪的仪器内置程序中,有4种测量模式可供选择[2],分别为:BF(后前)、BBFF(后后前前)、BFFB(后前前后)、FBBF(前后后前),其中在二等及其以上的水准测量作业中,根据相关国家规范的要求,往测为后前前后,返测为前后后前,并奇偶站交替[3]。以二等水准测量往测为例,数据记录格式见图1。
由图1可知:①框中所表示的为天宝电子水准仪数据记录的流水作业号;②框中的信息反映了作业员在作业时,所建立的工程文件信息;③框中所代表的信息为本条路线的起始;④框中为观测的顺序;⑤框中为点号信息;⑥框中为天宝电子水准仪的编码信息,该信息在作业中取决于作业员的作业习惯,为非必须;⑦框中记录了作业时间(此时间为水准仪中的系统时间);⑧框中为作业员在建立新的水准路线时,所取得的线路名称;⑨框中的信息为当前测站的记录顺序,可以从该信息中判断出此测站为奇数站或是偶数站;⑩框中为尺子的读数;框中记录的是水准仪的视距信息。通过对原始数据的解析,进一步实现程序相关功能。
图1 天宝DiNi03电子水准仪原始数据格式Fig.1 Original data format of Trimble DiNi03 electronic level
程序设计的基本思路,如图2所示。
图2 程序设计流程图Fig.2 Program design flow
为达到行业规范,通过加载参数文件,将所测数据等级、测段信息、天气、观测者、观测时间等信息展现在生成的标准电子手簿中,使用户能够在标准手簿中获取所有测段相关信息。经过实践,发现生产中还需要对所测得的数据进行严密平差处理。为了能够对测量数据进行平差处理,本程序最终生成武汉大学研发的Cosa(科傻)平差系统能识别的“*.in1”平差文件。
用户界面主要用于实现原始数据文件和参数文件的选择,并确定生成记录数据文件的保存位置。
原始数据文件以及参数文件的选择通过读取文件绝对路径进行,通过读取用户选择的文件夹绝对路径与程序自定义的文件名称进行字符串组合,得到生成记录数据文件的保存位置。原始数据文件及参数文件选择完成,并确定生成记录数据文件的保存位置后,点击“开始”按钮,程序将对数据进行解析转存。
参数文件由用户按照模板记录于“*.txt”文件中,根据用户所选择的参数文件所在的绝对位置,打开参数文件,以“,”为分隔符,对所记录的参数字符串进行分割,按照等级,方向,仪器型号,仪器编号,天气,风向,风力,土质,呈像,观测者,测量单位的顺序,读取参数信息,并存储于列表中,以便后续写入相应记录文件中。实现代码如下:
pf=open(parafile)
uline=pf.readlines()[1]
para=list(uline.split(′,′))
pf.close()
3.3.1 原始数据读取
原始数据保存于“*.dat”文件中,通过用户所选择的原始数据文件绝对位置,打开原始数据文件,并按行读取原始数据,存储于列表中,以便后续解析处理。实现代码如下:
of=open(odfile)
datas=of.readlines()
of.close()
3.3.2 原始数据解析
天宝电子水准仪所记录的数据中,根据不同数据特征可区分该行数据所记录信息。主要的数据特征包括以下几类:
1)字符串含有“Start-Line”:开始一条水准路线;
2)字符串含有“End-Line”:结束一条水准路线;
3)字符串含有“Rb”:后视数据;
4)字符串含有“Rf”:前视数据;
5)字符串含有“#####”:重测记录数据;
6)字符串含有点号信息,并且不具有以上5种特殊标识符:移动至新测站。
读取原始数据列表数据项,根据以上特征判断原始数据项含义,并获取相应记录信息存储于列表中。原始数据项含义对应记录信息,如表1所示。
表1 原始数据项含义对应记录信息表
其中,当数据项表示为结束一条水准路线时,时间信息为使用程序的日期。实现代码如下:
dt=datetime.datetime.now()
time=str(dt.year)+′年′+str(dt.month)+′月′+str(dt.day)+′日′
原始数据结束一条水准路线时,程序将记录该条水准路线的列表传入信息写入模块,将数据写入相应的记录手簿文件及平差文件。
3.4.1 记录手簿格式写入
记录手簿包括用于测量信息的表头,用于记录测量数据的表格,以及用于记录测段计算数据的结尾。为方便用户阅览且输出美观,设置打印纸张大小为A4纸,每一页均输出表头,至多输出13个测站数据,测量数据输出完成后,输出结尾。由于测站数量不固定,表格与测站数据进行同步输出。
为便于输出,将记录手簿格式分为表头,表格以及结尾分别存储于3张模板表格中,写入时按需求分别调用。根据模板,设置输出记录手簿的Excel文件单元格格式。实现代码如下:
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 记录手簿数据写入
表头信息由参数文件及部分原始数据得到,根据记录手簿格式,将相应信息填入对应单元格中。表格中观测数据由原始数据列表中输出,视距差、累计差、高差、读数差由原始数据计算得到,并填入对应单元格中。测站数据输出完成后,对测段的累计前距、累计后距、累计视距差、累计高差、测段距离进行计算,并输出结尾。实现代码如下:
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 平差文件写入
平差文件记录每一条水准路线由起始点到终止点的高差和距离。实现代码如下:
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()
程序运行完成,由原始数据文件*.dat输出相应记录手簿文件*.xlsx以及平差文件*.in1。
DiNi03电子水准仪能够实现自动记录、核检测量数据的功能,提高了测绘作业效率,但其随机软件下载的电子记录水准记录数据和现行国家规范格式不同,也无法与Cosa(科傻)平差软件对接。结合Python语言在数据处理方面的优势,本文编写了一个电子水准记录数据处理程序,将DiNi03电子水准仪数据转换为国家标准格式,并得到相应平差文件,使其所得到的测量数据在后续的使用中更加方便,大大的优化了几何水准测量的作业效率,具有更强的实用性。