浅谈全站仪数据提取
赵 卫
(中铁二十局集团第五工程公司兰州分公司 兰州 734100)
摘要:内外业一体化是测量工作的一个重要的内容,最关键的环节就是外业观测数据与内业数据处理软件之间的联系问题,即由测量仪器到处理软件的数据通信和格式转换问题。本文以索佳全站仪SET2110的坐标数据存储格式为例,讲述了全站仪数据提取的要点和过程,并给出了索佳全站仪SET2110的坐标数据提取的C++源码。
主题词:一体化 数据通信 数据提取
1 引言
现在全站仪的内存容量是越来越大,存储的数据也是越来越多。但它们都是以文件的形式进行组织的,用户在使用之前可以选取或创建一个文件作为当前工作文件。从测量数据的内容上讲,测量的数据主要以测角测距数据和碎部点的坐标为主。测角测距数据主要用于导线等形式的控制测量,而坐标形式的数据主要用于数字化成图。
下面是索佳全站仪SET2110仪器的坐标数据存储格式(□ 代表的是空格):
00NMSDR33□V04-04.02□□□□□01-Jan-02□00:00□113111
10NMJOB1□□□□□□□□□□□□121111
06NM1.0000000
01NM:SET2110□□□V41-01□□□021417SET210□□□V41-01□□□02141731□□□□□□□0.000
03MM1.300
08TP□□□□□□□□□□□□B0014205205.890□□□□□495732.686□□□□□□1024.991□□□□□□□□3
08TP□□□□□□□□□□□□B0024205239.848□□□□□495724.684□□□□□□1024.854□□□□□□□□3
08TP□□□□□□□□□□□□B0034205258.284□□□□□495707.995□□□□□□1024.709□□□□□□□□3
08TP□□□□□□□□□□□□B0044205299.872□□□□□495698.037□□□□□□1024.642□□□□□□□□3
2 全站仪数据的下载
全站仪内存储数据的下载方法目前是通过串口的形式进行的。这方面的软件很多,最常见的就是Windows操作系统中附带的超级终端。另外,各个全站仪厂商也基本上提供相应的数据下载软件和数据提取程序。
2.1 超级终端
Windows的超级终端是一个功能强大的串口通讯软件,利用超级终端可以输出全站仪内存中的存储数据。输出数据之前,应先连接好通信的电缆,设置好通讯端口、波特率、数据位数、停止位、奇偶检较等通讯参数。输出完毕后,还应该利用超级终端所提供的选取和复制功能将下载的数据粘贴到其它形式的文件中保存。但必须注意的是Windows操作系统所带的超级终端不是一商用软件,因此,缓冲区的大小被限制在500行。如果数据文件较大的话,应该分多次进行下载,以获得完整的数据,防止数据丢失。
2.2 厂商的下载软件
如徕卡等系列的全站仪,厂商均提供了如徕卡办公室等优秀的数据下载和提取软件。它们的功能很强大,也可将数据根据用户的需求转换为相应的格式。缺点是软件的适用范围为相应的特定的仪器。
2.3 成图软件
现在各种成图的软件也带有相应的数据下载和数据提取软件,如MapGIS、广州CASS等。它们的优点是能够针对很多种仪器、多种内存数据格式进行数据下载和提取,缺点是提取的数据一般只针对它们自己的软件。
3 数据的提取
全站仪的数据下载方法基本上是一样的,也较为简单。但由于全站仪的种类和型号很多,各个全站仪厂商的数据格式也大不一样,加之各个成图软件所要的数据格式也不一样。很难编写一个通用软件来满足各种要求。尽管如此,只要我们了解了全站仪的数据格式,要编写相应的提取程序并不是一件难事。我们以SET2110全站仪为例,看看数据提取的方法。
3.1 数据提取程序的编制
为了满足我们数据处理的需要,我们将研究怎样从全站仪的数据文件格式中提取我们所需要的数据。
3.1.1 索佳SDR33数据格式
索佳SET2110全站仪存储的数据格式为SDK33格式,主要内容包括仪器型号、通信端口、存储文件、仪器类型和测站信息等。对于坐标数据而言,包括各点的点号,X、Y、H等数据,根据需要还可能包括其编码和连接信息。
3.1.2 相关信息
索佳全站仪的数据有很多信息,包括数据输出方式、仪器型号版本号、觇标高等信息,一般有五类,即以00NM、01NM、03NM、06NM、10NM开头,其每行信息的个数分别为5、6、1、1、2。
3.1.3 坐标信息
坐标数据的信息一般包括类型码、来源码、X坐标、Y坐标、高程、编码和连接信息等内容。索佳SET2110全站仪坐标信息中,类型码一般为08或02,来源码一般为TP,它们是一个整体,可以舍去不用。一般的测图方法中,测点的编码和连接信息也可以舍去不用。
3.2 一般数字测图软件的格式
不同的数字测图软件的数据格式,可以考虑按照下列的方法设计
3.2.1 分隔符为空格
序号 X坐标 Y坐标 H高程
或 点名 X坐标 Y坐标 H高程
或 序号 点名 X坐标 Y坐标 H高程
3.2.2 分隔符为逗号或其它符号
序号,X坐标,Y坐标,H高程
或 点名,X坐标,Y坐标,H高程
或 序号,点名,X坐标,Y坐标,H高程
南方CASS软件的数据格式即为该格式。应该注意的是文件的第一行为总点数。
3.2.3 以行为单位
总点数
点名
代码
Y坐标
X坐标
H高程
广州CASS的成图软件格式即为该格式。
针对以上的全站仪的数据格式和成图软件所要求的数据格式,在我们的程序中,应该完成以下功能:
1 对坐标点进行计数;
2 忽略没有用的信息;
3 生成需要格式的文件。
4 程序编写的要点
针对索佳SDR33格式,编写程序应注意以下几点:
4.1 判断行的信息
每行信息的前四个字符是固定的字母和数字,如00NM、01NM或08TP、02TP等,在读操作的时候,可以先读前四个字符,和这些固定的字母或数字相比较,以判断此行是什么信息。
4.2 忽略空行
空行中没有字符,因此在判断行信息时所用的方法是不可行的,在读取行数据时要将其过滤掉。
4.3 正确的提取坐标数据
以08TP或02TP打头的信息行,其后是点名、X坐标、Y坐标和H高程它们各占16个字符的空间位置,其后是点的代码,占10个字符。对于这些信息行,我们要正确的提取这些数据。
附:坐标提取程序
#include
#include
Void substr(char*destination,const char*source,int startpos,int length)
{
Int i;
Int n =strlen (source);
For (i=0;(i
Destination[i]=source[i+startpos];
Destination[i]=’\0’;
}
Void SDR33ToCass(file *in ,file *out)
{
Char line [256];
Int n =0;
While(!feof(in))
{
Fgets(line,255,in);
Char type[5];
If (sscanf(line,”%4s”,type)==1)
{
If (strcmp(type,”02TP”) ==0
||strcmp(type,”08TP”)==0)
n++;
}
}
Fprint(out,”%d\n”,n);
Rewind(in);
While(!feof(in))
{
Fgets(line,255,in);
Char type[5],name[17],code[11],item[17];
Double x,y,z;
If (sscanf(line,”%4s”,type)==1)
{
if(strcmp(type,”02TP”)==0
||strcmp(type,”08TP”)==0)
{
Substr(item,line,4,16);
Sscanf(item,”%s”,name);
Substr(item,line,20,16);
Sscanf(item,”%lf”,&x);
Substr(item,line,36,16);
Sscanf(item,”%lf”,&y);
Sunstr(item,line,52,16);
Sscanf(item,”%lf”,&z);
Substr(item,line,68,10);
Sscanf(item,”%s”,code);
Fprint(out,”%s,”,name);
Fprint(out,”%lf,”,x);
Fprint(out,”%lf,”,y);
Fprint(out,”%lf,”,z);
Fprint(out,”%s”,code);
Fprint(out,”\n”);
}
}
}
}
Void SDR33ToScs(file*in,file*out)
{
Char line[256];
Int n=0;
While(!feof(in)){
Fgets(line,255,in);
Char type[5];
If (sscanf(line,”%4s”,type)==1)
{
If (strcmp(type,”02TP”)==0
||strcmp(type,”08TP”)==0)
n++;
}
}
Fprint(out,”%d\n”,n);
Rewind(in);
While(!feof(in))
{
Fgets(line,255,in);
Char type[5],name[17],code[11],item[17];
Double x,y,z;
If (sscanf(line,”%4s”,type)==1)
{
If (strcmp(type,”02TP”)==0
||strcmp(type,”08TP”)==0)
{
Substr(item,line,4,16);
Sscanf(item,”%s”,name);
Substr(item,line,20,16);
Sscanf(item,”%lf”,&x);
Substr(item,line,36,16);
Sscanf(item,”%lf”,&y);
Substr(item,line,52,16);
Sscanf(item,”%lf”,&z);
Substr(item,line,68,10);
Sscanf(item,”%s”,code);
Fprint(out,”%s\n”,name);
Fprint(out,”%s\n”,code);
Fprint(out,”%lf\n”,y);
Fprint(out,”%lf\n”,x);
Fprint(out,”%lf\n”,z);
}
}
}
}
Int main()
{
Char SDR33[12],CG[12];
Int format;
File*in;file*out;
Printf(“请输入SDR33格式文件名(不超过11个字符):\n”);
Scanf(“%s”,SDR33);
Printf(“请输入保存成果文件名(不超过11个字符):\n”);
Scanf(“%s”,CG);
Printf(“请输入成果文件的格式(0-广州CASS,1-南方CASS):\n”);
Scanf(“%d”,&format);
Printf(“\n 正在运行,请稍等!\n”);
If ((in=fopen(SDR33,”r”))==null)
{
Printf(“已知SDR33格式文件打不开!\n”);
Return -1;
}
If ((out=fopen(CG,”w”))==null){
Printf(“成果数据文件打不开!\n”);
Return -1;
}
If (format==0)
SDR33ToScs(in,out);
Else if (format==1)
SDR33ToCass(in,out);
Fcolse(in);fcolse(out);
printf(“ \n数据提取完毕!\n”);
return 0;
}
5 结束语
随着计算机技术的发展,我们需要把辛苦的测量外业积极的转换成内业工作,这样一方面既减轻我们的劳动量;另一方面也提高了我们工作的效率,这也是笔者写本文的初衷。当然,不同的仪器存储数据的格式不尽相同,但是主导的思想是一样的。只要我们清楚的认识到全站仪内部数据的存储的格式,那么提取出自身需要的数据文件就是件简单的事情了。
作者简介
赵 卫,男,毕业于西安科技大学,工学学士,助理工程师,现在在兰州分公司所辖项目兰州市南出口拆迁安置房项目经理部工作,联系电话:13659472540。
¥29.8
¥9.9
¥59.8