VBA开发电子表格在GPS网平差后各项成果精度统计中的应用

马永昌
(柳州市勘察测绘研究院)

【摘 要】 本文介绍基于南方GPS4.1软件的平差成果报告,如何利用VBA对电子表格进行开发,根据GPS规范,统计平差成果的各项精度,及时评价成果的质量。
【关键词】 VBA编程 电子表格 GPS精度统计

  1、引言
  Excel是目前非常流行的电子表格软件,它具有强大的数据整合汇总分析功能,但当使用者单纯依靠电子表格既有的功能,无法解决他面临的问题(例如:操作繁琐、计算式的表达太复杂、例行性的操作等)时,使用者只好求助自己了。使用Excel的程序开发工具VBA(Visual Basic for Application)来自行设计出解决方案将是使用者首先考虑的解决之道。由于一些软件缺陷,GPS网平差后,成果是否合格,不能立刻判断;必须及时根据GPS规范对成果各项精度进行统计,看是否满足规范要求。如果用电子表格中的公式直接统计,发现有些指标超限,必须根据问题所在重新对GPS网解算,这样将浪费很多时间和精力,有时甚至是一个反复的过程。如果用VBA开发出实用的电子表格程序,立刻统计出平差成果的各项精度,对成果质量作出及时的综合评价,如成果质量存在问题,直接指出超限项,动态的指导GPS网平差,对解算人员来说是一个很好工具。
  2、GPS控制网平差流程图

  3、GPS基线解算和网平差处理中的限差规定
  3.1 采用单基线处理模式时,对于采用同一种数学模型的基线解,其同步时段中任一三边同步环的坐标分量相对闭合差和全长相对闭合差不宜超过如下表的规定:

  对于采用不同数学模型的基线解,其同步时段中任一三边同步的坐标分量闭合差和全长相对闭合差按照独立独立环闭合差要求检核。同步时段中的多边形同步环,可不重复检核。
  3.2 无论采用单基线模式或多基线模式解算基线,都应在整个GPS网中选取一组完全的独立基线构成独立环,各独立环的坐标分量闭合差和全长闭合差应符合下式的规定:

  3.3 复测基线的长度较差,不宜超过下式的规定:

  3.4 无约束平差中,基线向量的改正数(Vx、Vy、Vz)绝对值应满足下式要求:

  当超限时,可认为该基线或其附近存在粗差,应采用软件提供的方法或人工方法剔除粗差基线,直至符合上式要求。
  3.5 约束平差中,基线向量的改正数与剔除粗差后的无约束平差结果的同名基线相应改正数的较差(dVx、dVy、dVz)应符合下式要求:

  当超差时,可认为作为约束的已知坐标、距离,已知方位与GPS网不兼容,应采用软件提供的或人为的方法剔除某些误差大的约束值,直至符合上式要求。
  4、南方GPS平差成果文本文件数据格式特点
  下面为部分南方GPS成果文件数据格式:
  …… ……
  重复基线报告
  基线名 质量 中误差 X Y Z 基线长相对误差
  重复基线 0.004 0.002 0.002 0.003 485.971 8.7ppm
  31793501-31753501 50.18 0.006 -437.684 -96.766 -187.715 485.971 1/83039
  …… ……
  剔除基线后重复基线
  重复基线 0.004 0.002 0.002 0.003 485.971 8.7ppm
  31793501-31753501 50.18 0.006 -437.684 -96.766 -187.715 485.971 1/83039
  31753531-31793531 83.94 0.005 437.688 96.762 187.709 485.972 1/99350
  重复基线 0.003 0.001 0.002 0.001 2625.644 1.0ppm
  BMAA3503-31913503 27.31 0.011 -2440.352 -958.172 143.475 2625.642 1/241063
  31913511-BMAA3511 52.47 0.006 2440.354 958.177 -143.474 2625.646 1/473181
  基线详细情况
  …… ……
  同步环情况:
  环号 环总长 相对误差 △Xmm △Ymm △Zmm △边长mm 环中的点
  1 1548.106 2.1Ppm 2.455 0.299 -1.995 3.177 317731763175
  …… ……
  2 1827.133 2.4Ppm -0.376 -4.038 -1.825 4.447 317831763175
  异步环情况:
  环号 环总长 相对误差 △Xmm △Ymm △Zmm △边长mm 环中的点
  4 1642.095 4.9Ppm -4.213 3.475 5.988 8.105 317931763175
  …… ……
  236 7268.303 0.6Ppm 1.344 3.817 2.176 4.595 EAAA3191BMAA
  WGS84-坐标系下经典自由网平差平差结果
  三维自由网平差单位权中误差:0.042474(米)
  基线及其改正
  基线名 △X △Y △Z △X改正mm △Y改正mm △Z改正mm 相对误差
  31753501--31763501 523.265 -79.028 538.200 -0.644 -0.078 0.1861:224574
  GXYY3531--AAAA3531 236.790 -392.953 999.621 2.563 4.688 1.7301:177476
  平差后Wgs84坐标和点位精度
  …… ……
  采用网配合法进行转换
  基线名 △X改正mm △Y改正mm 相对误差 距离
  3175--3176 -0.845 1.872 1:218469 754.753
  GXYY--AAAA -7.239 16.228 1:134851 1099.857
  单位权中误差0.005438(米)
  平差后坐标和点位精度
  从上面部分数据格式中看出,数据之间有空格间隔,每项成果数都有相应固定格式,例如重复基线数据开始为“剔除基线后重复基线”行,结束数据为“环闭合差报告”行,这些特点为编程创造了条件。
  5、在编程中如何分离数据及设置电子表格格式
  5.1 VB中处理字符串常用的几个字符串处理函数
  Trim(s) 去掉字符串S左右两边的空白字符
  Len(s) 返回字符串S的长度
  Left(s,n) 截取字符串S最左边的n个字符
  Right(s,n) 截取字符串S最右边的n个字符
  Mid(s,p,n) 在字符串S中,从第p个字符开始,向后截取n个字符
  Instr([start,] A,B) 返回A字符串在B字符串中最先出现的位置
  InstrRev([start,] A,B) 返回A字符串在B字符串中出现的位置,从字符串的末尾算起。
  例如字符串String1="PBC,KL,VQ",从它里面提取A和B,其中A="PBC",B="VQ",程序如下:
  DimString1$,A$,B$,I As Integer
  String1="PBC,KL,VQ"
  I=InStr(String1,",")
  A=Left(String1,I-1)
  I=InStrRev(String1,",")
  B=Right(String1,Len(String1)-I)
  5.2 用VB设置电子表格格式
  With对象
  .Borders(xlEdgeLeft).LineStyle=xlContinuous 设置对象左边线线型为实线
  .Borders(xlEdgeTop).LineStyle=xlContinuous 设置对象顶部线型为实线
  .Borders(xlEdgeBottom).LineStyle=xlContinuous 设置对象底部线型为实线
  .Borders(xlEdgeRight).LineStyle=xlContinuous 设置对象右边线线型为实线
  .Borders(xlInsideVertical).LineStyle=xlContinuous 设置对象垂直线线型为实线
  .Borders(xlInsideHorizontal).LineStyle=xlContinuous 设置对象水平线线型为实线
  .HorizontalAlignment=xlCenter 设置单元格文字水平居中
  .VerticalAlignment=xlCenter 设置单元格文字垂直居中
  .Font.FontStyle="宋体" 设置单元格字体
  .Font.Size=12 设置单元格字体大小
  .NumberFormat="##0.000" 设置单元格数字格式
  End With
  对象.Columns("A:L").AutoFit 设置单元格A至L列自动适应大小
  这里的对象是指单元格范围,其它一些用法请参阅有关开发Excel的书籍或VBA帮助,在这里只是简单介绍。
  6、GPS精度统计程序流程图
  本程序按模块化思路设计,每项精度统计程序为一个独立的子模块,互不影响,每个程序编写思路差不多,重复基线精度统计和同名基线改正数精度统计两个模块编写较复杂些,限于篇幅,只介绍重复基线精度统计模块程序,GPS精度统计程序流程图如下:

  重复基线精度统计程序流程图如下:

  程序段如下:
  Public Sub CFJS()  '重复基线计算子程序
  Dim File1$,STR1$,STR2$,N As Integer,I As Integer,J As Integer,IJ As Integer
  Dim D As Double,a As Double,ab As Double,MinD As Double,MaxD As Double
  Dim Ds As Double,b As Double,Str3$
  N0=2
  a=Val(TextBox1.Text):b=Val(TextBox2.Text)
  File1=TextBox3.Text
  Open File1 For Input As #1
  Str3="重复基线报告"
  Do While Not EOF (1)
  Line Input #1,STR1
  If Trim(STR1)="剔除基线后重复基线" Then
  Str3="剔除基线后重复基线"
  Exit Do
  End If
  Loop
  Seek (1),1
  Do While Not EOF (1)
  Line Input #1,STR1
  If Trim(STR1)=Str3 then
  Line Input #1,STR1
  Line Input #1,STR1
  If Str3="重复基线报告" Then
  Line Input #1,STR1
  End If
  N=0
  IJ=0
  Do While Not EOF (1)
  N=N+1
  N0=N0+1
  Call DivPartCF(N0,Trim(STR1))   '调用分离数据子程序
  Line Input #1,STR1
  STR1=Trim(STR1)
  I=InStr(STR1," ")
  If I>0 Then
  STR2=Left(STR1,I-1)
  Else
  STR2=STR1
  End If
  If STR2="重复基线" Or STR2="基线详细情况" Then   '处理一条重复基线
  IJ=IJ+1
  Sheet5.Range("A" & N0-N+1 & ":A" & N0) .Merge
  Sheet5.Range("D" & N0-N+1 & ":D" & N0) .Merge
  Sheet5.Range("E" & N0-N+1 & ":E" & N0) .Merge
  Sheet5.Range("F" & N0-N+1 & ":F" & N0) .Merge
  Sheet5.Range("G" & N0-N+1 & ":G" & N0) .Merge
  Sheet5.Range("H" & N0-N+1 & ":H" & N0) .Merge
  D=0
  MinD=Val(Sheet5.Cells(N0-N+1,3))
  MaxD=Val(Sheet5.Cells(N0-N+1,3))
  For J=1 To N
  D=D+Val(Sheet5.Cells(N0-N+J,3))
  If Val(Sheet5.Cells(N0-N+J,3)) > MaxD Then
  MaxD=Val(Sheet5.Cells(N0-N+J,3))
  End If
  Next J
  D=D/N
  ab=Sqr(a^2+(b*D/1000)^2)
  Sheet5.Cells(N0-N+1,1)=IJ
  Sheet5.Cells(N0-N+1,4)=D
  Sheet5.Cells(N0-N+1,5)=ab
  Sheet5.Cells(N0-N+1,6)=(MaxD=MinD)*1000
  Ds=(MaxD-MinD)*1000
  Sheet5.Cells(NO-N+1,7)=2*Sqr(2)*ab
  If Ds <= 2*Sqr(2)*ab Then
  Sheet5.Cells(N0-N+1,8) = "合格"
  Else
  Sheet5.Cells(N0-N+1,8) = "超限"
  Sheet.Range("A" & N0-N+1 & ":H" & N0).Font.Color=RGB(255,0,0)
  End If
  N=0
  If STR2="基线详细情况" Then Exit Do
  Line Input #1,STR1
  End If
  Loop
  Exit Do
  End If
  Loop
  Close
  Sheet5.Cells(N0+2,1)="注:a=" + TextBox1.Text + " " + "b=" + TextBox2.Text + "Ppm d 为平均边长"
  With Sheet5.Range("A3" & ":H" & N0)
  .Borders(xlEdgeLeft).LineStyle=xlContinuous
  .Borders(xlEdgeTop).LineStyle=xlContinuous
  .Borders(xlEdgeBottom).LineStyle=xlContinuous
  .Borders(xlEdgeRight).LineStyle=xlContinuous
  .Borders(xlInsideVertical).LineStyle=xlContinuous
  .Borders(xlInsideHorizontal).LineStyle=xlContinuous
  .HorizontalAlignment=xlCenter
  .Font.Fontstyle="宋体"
  .Font.Size=12
  End With
  With Sheet5.Range("A" & N0+2 & ":H" & N0+2)
  .Font.FontStyle="宋体"
  .Font.Size=12
  End With
  With Sheet5.Range("C3:" & "E" &N0)
  .NumberFormat="##0.000"
  End With
  With Sheet5.Range("G3:" & "G" &N0)
  .NumberFormat="##0.000"
  End With
  Sheet5.Range("A2" & ":H" & N0).Columns("A:H").AutoFit   '将单元格范围调至最适中行高和列宽
  End Sub
  Pulic Sub DivPartCF(N0 As Integer,STR1 As String)   '重复基线分离数据子程序
  Dim Ds As Double,NumSTR$(8),I As Integer,NJ As Integer
  For I=1 To 8
  NJ=InStr(STR1,"")
  If NJ>0 Then
  NumSTR(1)=Left(STR1,NJ-1)
  STR1=Trim(Right(STR1,Len(STR1)-NJ)
  Else
  NumSTR(I)=STR1
  End If
  Next I
  Sheet5.Cells(N0,2)=NumSTR(1)
  Sheet5.Cells(N0,3)=NumSTR(7)
  End Sub
  7、结束语
  VBA作为开发电子表格的强大工具,它简单易学,对有一定编程基础的人,很快就能够应用它。电子表格具有很强报表处理和打印功能,如果好好地利用它,很容易设计出优美的报表,解决我们工作中遇到的实际问题。作者通过设计GPS平差成果精度统计程序,把那些复杂统计问题,变得非常容易了,对此深感不疑。

参 考 文 献
[1] 全球定位系统城市测量技术规程.CJJ73-97.北京:《中国建筑工业出版社》.1997
[2] 李文瑞著,赵颖恪、范莹等改编.《VBA/Excel 2000让我把工作变轻松了》.人民邮电出版社.2000

地址:广西南宁市建政路5号  邮编:530023  Tel:0771-5606397  Email:webmaster@digitalgx.com
广西基础地理信息中心版权所有 2005-2010 广西基础地理信息中心制作