APP下载

基于VB的坐标转换程序的开发

2013-03-06田继成

城市勘测 2013年4期
关键词:椭球源代码高斯

田继成

(大同市勘察测绘院,山西大同 037000)

基于VB的坐标转换程序的开发

田继成∗

(大同市勘察测绘院,山西大同 037000)

网上免费的坐标转换软件很多,功能各异,其中COORD功能强大、使用广泛,是坐标转换软件中的杰出代表。尽管如此,COORD在有些情况下仍不能实现一步转换。因此,有必要开发一种能够实现一步转换的坐标转换程序。本文以VB 6.0为开发环境,重点阐述了开发坐标转换程序的思路和算法。程序投入运行以来,极大地提高了坐标转换工作的效率,也有利于坐标转换成果的标准化。

坐标转换;程序设计;模块化;VB 6.0

1 引 言

坐标转换问题在测量中经常遇到,计算过程较复杂,一般使用软件计算。网上免费的坐标转换软件很多,功能各异,其中COORD功能强大、使用广泛,是坐标转换软件中的杰出代表。

尽管如此,COORD在有些情况下仍不能实现一步转换,如:转换过程中需要进行两次不同自定义的高斯正算和反算时。由于大同市独立坐标系采用非国家标准3°带中央子午线投影,故大同独立坐标系转西安80坐标系即属于这种情况。因此,有必要开发一种能够实现一步转换的坐标转换程序。

为了使开发的程序精确可靠、功能强大、易于使用,并缩短程序开发周期,开发过程中笔者阅读了大量坐标转换文献,对比和借鉴了大量坐标转换软件,测试分析了大量坐标转换源代码,并在此基础上对源代码进行了改进和利用。

本文以VB 6.0为开发环境,重点阐述了开发坐标转换程序的思路和算法。程序投入运行以来,极大地提高了大同市勘察测绘院坐标转换工作的效率,也有利于坐标转换成果的标准化。

2 功能及界面设计

程序应实现:

(1)一步坐标转换

程序实行模块化,通过对坐标转换子模块的任意组合,实现一步坐标转换。

(2)实时坐标转换

当输入或改变源坐标时,实时计算当前行目标坐标。改变源坐标系或目标坐标系时,实时全部重新计算目标坐标。改变保留小数位数或角度格式后,实时刷新数据。

(3)转换参数的安全

转换参数加密内置在程序中,既方便使用和防止误操作,又避免了使用明码参数带来的易泄露和传播等不安全问题。

为防止对程序进行逆向工程,程序采用P码编译并加壳处理。通过第三方软件实现程序的防拷贝。通过设定登录密码、绑定微机硬件、使用次数限制、时间炸弹等措施,实现程序非授权禁用并自毁。

程序界面如图1所示:

图1 坐标转换

3 关键技术及实现

3.1 模块化坐标转换

本程序坐标转换分为专用坐标转换和通用坐标转换两部分。专用坐标转换中预置了大同市常用的坐标转换参数,通用坐标转换需用户定制后才可使用。

将坐标转换模块划分4大类:四参数转换、七参数转换、大地坐标系与空间直角坐标系互转、高斯正反算。

(1)专用坐标转换:支持6种坐标(大同地方坐标系、大同独立坐标系、北京54坐标系、西安80坐标系、WGS84坐标系、CGCS2000坐标系)互转。将6种坐标互转过程按4大类划分为28个模块,编程时指定每两种坐标转换时对应的模块组合,即可实现专用坐标转换。

以大同独立坐标系转西安80坐标系为例,需要6步:

①四参数转换:大同独立坐标转WGS84椭球的高斯投影平面坐标;

②高斯反算:WGS84椭球的高斯投影平面坐标转WGS84大地坐标;

③大地转空间:WGS84大地坐标转WGS84空间直角坐标;

④七参数转换:WGS84空间直角坐标转西安80空间直角坐标;

⑤空间转大地:西安80空间直角坐标转西安80大地坐标;

⑥高斯正算:西安80大地坐标转西安80平面坐标。

(注:WGS84椭球的高斯投影平面坐标,具体为高斯投影3°带,中央子午线∗∗∗°∗∗′,投影面高程∗∗∗∗m。)

(2)通用坐标转换:按4大类划分为6个模块:四参数转换、七参数转换、大地转空间、空间转大地、高斯正算、高斯反算。使用时用户自定义模块组合,即可实现通用坐标转换。添加模块后,需设置模块对应参数,如:四参数转换需输入四参数、高斯正算需输入投影参数等。全部设置好后,可保存为坐标转换配置文件,下次使用时选择即可。坐标转换配置文件为加密格式。

图2 定制转换方案

3.2 高斯投影代码的改进

网上收集了很多高斯投影源代码,经测试或多或少存在不足,如:代码存在漏错、代码格式混乱、支持椭球较少、不支持自定义高斯投影、不支持椭球变换、转换精度不够等。

经比较,选定一款较好的高斯投影源代码,在此基础上进行改进,实现了:

(1)增加支持的椭球

源代码只支持北京54坐标系的参考和西安80坐标系的参考椭球,在此基础上,增加了对WGS84和CGCS 2000椭球的支持。

(2)提高转换精度

经对比发现,源代码中用于计算X(B)的高阶项系数只有A1、A2、A3、A4,通过增加A5、A6,提高了转换精度。

(3)支持椭球变换

椭球变换主要有椭球平移法、椭球膨胀法、椭球变形法等,其中椭球膨胀法最为简洁,为工程应用之首选。考虑到坐标转换软件COORD采用椭球膨胀法,为了使用COORD求解的坐标转换参数,故本程序椭球变换也采用椭球膨胀法。

椭球膨胀法公式:

式中:Hm—该地区平均大地高;Bm—该地区的平均纬度。

改进后的高斯投影代码如下(限于篇幅,部分省略):

'设置椭球参数

Public Sub SetEllipsoidPara(ByVal CoordID%)

Select Case CoordID

Case 1 '北京54 a=6378245# f=298.3

Case 2 '西安80 a=6378140# f=298.257

Case 3 'WGS84 a=6378137# f=298.257223563

Case 4 'CGCS2000 a=6378137# f=298.257222101

End Select

End Sub

'设置坐标系统参数

Public Sub SetCoordPara(ByVal CoordID%,ByVal Hm#,By-Val Bm#)

Dim TA#,TB#,TC#,TD#,TE#,TF#

Dim Rm#,Rn#

'设置椭球参数

Call SetEllipsoidPara(CoordID) '椭球变换(椭球膨胀法)

e2=1-((f-1)/f)∗((f-1)/f)

Rm=a∗Sqr(1-e2)/(1-e2∗Sin(Bm)^2)

Rn=Rm+Hm

a=Rn∗(1-e2∗Sin(Bm)^2)/Sqr(1-e2)

'计算用于计算X的椭球参数

e2=1-((f-1)/f)∗((f-1)/f)

e12=(f/(f-1))∗(f/(f-1))-1

TA=a∗(1-e2)∗(1+3∗e2/4+45∗e2^2/64+175∗e2^3/256+11025∗e2^4/16384)

TB=a∗(1-e2)∗(3∗e2/4+15∗e2^2/16+525∗e2^3/ 512+2205∗e2^4/2048)

TC=a∗(1-e2)∗(15∗e2^2/64+105∗e2^3/256+2205∗e2^4/4096+10395∗e2^5/16384)

TD=a∗(1-e2)∗(35∗e2^3/512+315∗e2^4/2048+ 31185∗e2^5/131072)

TE=a∗(1-e2)∗(315∗e2^4/16384+3465∗e2^5/ 65536)

TF=a∗(1-e2)∗(693∗e2^5/131072)

A1=TA

A2=-TB/2

A3=TC/4

A4=-TD/6

A5=TE/8

A6=-TF/10

End Sub

'高斯正算

Public Sub BL2XY(ByRef B#,ByRef L#,ByVal L0#,ByVal Y0#,ByVal Hm#,ByVal Bm#,ByVal Coord ID%)

………………

x=A1∗B+A2∗Sin(2∗B)+A3∗Sin(4∗B)+A4∗Sin (6∗B)+A5∗Sin(8∗B)+A6∗Sin(10∗B)

………………End Sub

'高斯反算

Public Sub XY2BL(ByRef x#,ByRef y#,ByVal L0#,ByVal Y0#,ByVal Hm#,ByVal Bm#,ByVal CoordID%)

………………

DoWhile True

preB0=B0

B0=B0∗pi/180

B0=(x-(A2∗Sin(2∗B0)+A3∗Sin(4∗B0)+A4∗Sin(6∗B0)+A5∗Sin(8∗B0)+A6∗Sin(10∗B0)))/A1∗180/pi

eta=Abs(B0-preB0)

If eta<1E-16 Then Exit Do

Loop

………………

End Sub

3.3 角度转度分秒函数的改进

度转度分秒的难点在于容易出现60″。出现60″的原因:VB双精度变量最多存储16位(不包括正负号),秒单独存储时保留小数较多,此时的秒小于60″。秒和度分组合后,由于双精度最大存储限制导致秒四舍五入,此时的秒有可能等于60″。

避免出现60″的方法:在秒和度分组合前,对秒进行四舍五入,并判断其是否为60″。实现保留最多小数位数的计算公式:小数位数=16-度的位数-分秒的位数4-小数点位数1。

通过对源代码的修改,实现了避免出现60″、保留最多小数位数、支持负角度。

修改后的角度转度分秒代码如下:

Public Function Deg2Dms(ByVal Deg As Double)As Double

………………

Deg=Abs(Deg) DD=Int(Deg)

MM=Int((Deg-DD)∗60#)

SS=((Deg-DD)∗60#-MM)∗60#

SecDec=16-Len(CStr(DD))-5

If Round(SS,SecDec)=60 Then

SS=0:MM=MM+1

End If

If MM=60 Then MM=0:DD=DD+1

End If

Deg2Dms=Sign∗(DD+MM/100+SS/10000)

End Function

3.4 支持“一转多”和“多转一”

支持源坐标同时转换多种目标坐标,简称“一转多”。支持源坐标按多种源坐标系转换一种目标坐标,简称“多转一”。

“一转多”用于同时转换两种或两种以上坐标,避免了多次转换的麻烦,而且成果可生成在一张报表中。

“多转一”用于源坐标系的辅助确定,有时无法确定源坐标系,但知道具体位置时,可按不同坐标系转换后,与地形图匹配确定源坐标系,再进行坐标的转换。

3.5 文件的导入导出

程序除支持常用的导入导出格式外,还支持对用户键入格式的解析,用户键入的格式要求以逗号分隔。

用户键入的导入格式,可以是6种关键字(序号、点名、代码、X、Y、H)的自由组合。

用户键入的导出格式,可以是9种关键字(序号、点名、代码、前X、前Y、前H、后X、后Y、后H)的自由组合。其中,“前”代表转换前的坐标,“后”代表转换后的坐标。

此外还支持输出Word格式的坐标转换报表,表格的列宽和字号随坐标系名称、坐标系类型、小数位数、角度格式等智能调整。

3.6 生成经纬网格

经纬网格可用于专题图的制作、栅格图的纠正拼接等。较复杂的经纬网格一般使用ArcGIS生成,为了能够直接生成符合要求的、DWG格式的经纬网格,专门开发了生成经纬网格功能。

本功能支持多种椭球、支持自定义高斯投影、支持注记网格经纬度,可自定义网格范围、经线纬线间隔、设置网格线样式等。

图3 绘制经纬风格

4 程序测试

笔者对程序的各个模块进行了大量独立测试和联合测试,并用大同市C级GPS网多套坐标成果对程序进行了全面验证。大同市C级GPS网覆盖面积约1 500 km2,东西跨度57 km,南北跨度36 km。用该成果验证转换精度,具有很好的代表性。

作者编制了较完整程序测试报告,并制作了转换精度分布图。测试结果表明,程序稳定可靠、转换精度较高。由于报告内容较多,限于篇幅,仅以大同独立坐标系转西安80坐标系为例简要介绍。

测试方法如下:

(1)转换精度:输入源坐标,转换得到目标坐标,将目标坐标与控制点坐标进行比较。

(2)逆转相符性:输入源坐标,转换得到目标坐标,再将目标坐标转换为源坐标,将转换得到的源坐标与输入的源坐标进行比较。

(3)源坐标高程对平面精度的影响:输入源坐标时,高程分别输入0、1 000、大地高,将3种不同高程时得到的目标坐标进行比较。

(4)COORD转换精度:在COORD中输入与本程序一样的坐标转换参数,将COORD得到目标坐标与控制点坐标进行比较。

(5)本程序与COORD比较:在COORD中输入与本程序一样的坐标转换参数,将COORD得到目标坐标与本程序得到目标坐标进行比较,如表1所示。

坐标转换测试项目及精度 表1

5 结 语

投入使用以来,程序在不断地改进和完善,目前仍有诸多不足之处,如不支持坐标转换参数的求解,不支持高程的转换等。今后笔者会适时增加这方面的功能。

通过此次开发,笔者掌握了全套源代码,通过定制可服务不同需要,对于提高工作效率具有重要意义。此外,通过实践加深了对坐标转换原理和方法的认识。

[1] 王顺兴,颜美代.精解Word 2000 VBA与范例解析[M].北京:北京大学出版社,2001.

[2] 张晋西.Visual Basic与AutoCAD二次开发[M].北京:清华大学出版社,2002.

[3] 何光渝.Visual Basic常用数值算法集[M].北京:科学出版社,2002.

[4] 许谡.Visual Basic应用与开发案例教程[M].北京:清华大学出版社,2005.

[5] 李怀明,骆原,王育新.Visual Basic 6.0中文版参考详解[M].北京:清华大学出版社,1999.

[6] 陈涌泉.Visual Basic第三方控件大全[M].北京:中国电力出版社,200.

The Program Development of Coordinate Transformation Based on VB

Tian Jicheng
(Datong Institute of Prospecting and Mapping,Datong 037000,China)

There's lots of free coordinate transformation software with different functions.As an outstanding representative of the software,COORD is powerful and widely used.But,in some cases,COORD still can not achieve one-step conversion.Therefore,it is necessary to develop a coordinate transformation program to achieve one-step conversion. Based on VB 6.0,this paper focusing on the thoughtand algorithms of development coordinate transformation programs.It greatly improves thework efficiency of the coordinate transformation since put into operation,and conducive to the standardization of coordinate transformation results.

coordinate transformation;program development;modularization;VB 6.0

1672-8262(2013)04-71-04

P226+.3

B

2013—03—09

田继成(1965—),男,高级工程师,注册规划师,主要从事生产管理和技术研究工作。

猜你喜欢

椭球源代码高斯
独立坐标系椭球变换与坐标换算
椭球槽宏程序编制及其Vericut仿真
基于TXL的源代码插桩技术研究
数学王子高斯
天才数学家——高斯
软件源代码非公知性司法鉴定方法探析
基于语法和语义结合的源代码精确搜索方法
椭球精加工轨迹及程序设计
基于外定界椭球集员估计的纯方位目标跟踪
揭秘龙湖产品“源代码”