田繼成
(大同市勘察測繪院,山西大同 037000)
基于VB的坐標轉換程序的開發(fā)
田繼成?
(大同市勘察測繪院,山西大同 037000)
網(wǎng)上免費的坐標轉換軟件很多,功能各異,其中COORD功能強大、使用廣泛,是坐標轉換軟件中的杰出代表。盡管如此,COORD在有些情況下仍不能實現(xiàn)一步轉換。因此,有必要開發(fā)一種能夠實現(xiàn)一步轉換的坐標轉換程序。本文以VB 6.0為開發(fā)環(huán)境,重點闡述了開發(fā)坐標轉換程序的思路和算法。程序投入運行以來,極大地提高了坐標轉換工作的效率,也有利于坐標轉換成果的標準化。
坐標轉換;程序設計;模塊化;VB 6.0
坐標轉換問題在測量中經(jīng)常遇到,計算過程較復雜,一般使用軟件計算。網(wǎng)上免費的坐標轉換軟件很多,功能各異,其中COORD功能強大、使用廣泛,是坐標轉換軟件中的杰出代表。
盡管如此,COORD在有些情況下仍不能實現(xiàn)一步轉換,如:轉換過程中需要進行兩次不同自定義的高斯正算和反算時。由于大同市獨立坐標系采用非國家標準3°帶中央子午線投影,故大同獨立坐標系轉西安80坐標系即屬于這種情況。因此,有必要開發(fā)一種能夠實現(xiàn)一步轉換的坐標轉換程序。
為了使開發(fā)的程序精確可靠、功能強大、易于使用,并縮短程序開發(fā)周期,開發(fā)過程中筆者閱讀了大量坐標轉換文獻,對比和借鑒了大量坐標轉換軟件,測試分析了大量坐標轉換源代碼,并在此基礎上對源代碼進行了改進和利用。
本文以VB 6.0為開發(fā)環(huán)境,重點闡述了開發(fā)坐標轉換程序的思路和算法。程序投入運行以來,極大地提高了大同市勘察測繪院坐標轉換工作的效率,也有利于坐標轉換成果的標準化。
程序應實現(xiàn):
(1)一步坐標轉換
程序實行模塊化,通過對坐標轉換子模塊的任意組合,實現(xiàn)一步坐標轉換。
(2)實時坐標轉換
當輸入或改變源坐標時,實時計算當前行目標坐標。改變源坐標系或目標坐標系時,實時全部重新計算目標坐標。改變保留小數(shù)位數(shù)或角度格式后,實時刷新數(shù)據(jù)。
(3)轉換參數(shù)的安全
轉換參數(shù)加密內(nèi)置在程序中,既方便使用和防止誤操作,又避免了使用明碼參數(shù)帶來的易泄露和傳播等不安全問題。
為防止對程序進行逆向工程,程序采用P碼編譯并加殼處理。通過第三方軟件實現(xiàn)程序的防拷貝。通過設定登錄密碼、綁定微機硬件、使用次數(shù)限制、時間炸彈等措施,實現(xiàn)程序非授權禁用并自毀。
程序界面如圖1所示:
圖1 坐標轉換
3.1 模塊化坐標轉換
本程序坐標轉換分為專用坐標轉換和通用坐標轉換兩部分。專用坐標轉換中預置了大同市常用的坐標轉換參數(shù),通用坐標轉換需用戶定制后才可使用。
將坐標轉換模塊劃分4大類:四參數(shù)轉換、七參數(shù)轉換、大地坐標系與空間直角坐標系互轉、高斯正反算。
(1)專用坐標轉換:支持6種坐標(大同地方坐標系、大同獨立坐標系、北京54坐標系、西安80坐標系、WGS84坐標系、CGCS2000坐標系)互轉。將6種坐標互轉過程按4大類劃分為28個模塊,編程時指定每兩種坐標轉換時對應的模塊組合,即可實現(xiàn)專用坐標轉換。
以大同獨立坐標系轉西安80坐標系為例,需要6步:
①四參數(shù)轉換:大同獨立坐標轉WGS84橢球的高斯投影平面坐標;
②高斯反算:WGS84橢球的高斯投影平面坐標轉WGS84大地坐標;
③大地轉空間:WGS84大地坐標轉WGS84空間直角坐標;
④七參數(shù)轉換:WGS84空間直角坐標轉西安80空間直角坐標;
⑤空間轉大地:西安80空間直角坐標轉西安80大地坐標;
⑥高斯正算:西安80大地坐標轉西安80平面坐標。
(注:WGS84橢球的高斯投影平面坐標,具體為高斯投影3°帶,中央子午線???°??′,投影面高程????m。)
(2)通用坐標轉換:按4大類劃分為6個模塊:四參數(shù)轉換、七參數(shù)轉換、大地轉空間、空間轉大地、高斯正算、高斯反算。使用時用戶自定義模塊組合,即可實現(xiàn)通用坐標轉換。添加模塊后,需設置模塊對應參數(shù),如:四參數(shù)轉換需輸入四參數(shù)、高斯正算需輸入投影參數(shù)等。全部設置好后,可保存為坐標轉換配置文件,下次使用時選擇即可。坐標轉換配置文件為加密格式。
圖2 定制轉換方案
3.2 高斯投影代碼的改進
網(wǎng)上收集了很多高斯投影源代碼,經(jīng)測試或多或少存在不足,如:代碼存在漏錯、代碼格式混亂、支持橢球較少、不支持自定義高斯投影、不支持橢球變換、轉換精度不夠等。
經(jīng)比較,選定一款較好的高斯投影源代碼,在此基礎上進行改進,實現(xiàn)了:
(1)增加支持的橢球
源代碼只支持北京54坐標系的參考和西安80坐標系的參考橢球,在此基礎上,增加了對WGS84和CGCS 2000橢球的支持。
(2)提高轉換精度
經(jīng)對比發(fā)現(xiàn),源代碼中用于計算X(B)的高階項系數(shù)只有A1、A2、A3、A4,通過增加A5、A6,提高了轉換精度。
(3)支持橢球變換
橢球變換主要有橢球平移法、橢球膨脹法、橢球變形法等,其中橢球膨脹法最為簡潔,為工程應用之首選??紤]到坐標轉換軟件COORD采用橢球膨脹法,為了使用COORD求解的坐標轉換參數(shù),故本程序橢球變換也采用橢球膨脹法。
橢球膨脹法公式:
式中:Hm—該地區(qū)平均大地高;Bm—該地區(qū)的平均緯度。
改進后的高斯投影代碼如下(限于篇幅,部分省略):
'設置橢球參數(shù)
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
'設置坐標系統(tǒng)參數(shù)
Public Sub SetCoordPara(ByVal CoordID%,ByVal Hm#,By-Val Bm#)
Dim TA#,TB#,TC#,TD#,TE#,TF#
Dim Rm#,Rn#
'設置橢球參數(shù)
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的橢球參數(shù)
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 角度轉度分秒函數(shù)的改進
度轉度分秒的難點在于容易出現(xiàn)60″。出現(xiàn)60″的原因:VB雙精度變量最多存儲16位(不包括正負號),秒單獨存儲時保留小數(shù)較多,此時的秒小于60″。秒和度分組合后,由于雙精度最大存儲限制導致秒四舍五入,此時的秒有可能等于60″。
避免出現(xiàn)60″的方法:在秒和度分組合前,對秒進行四舍五入,并判斷其是否為60″。實現(xiàn)保留最多小數(shù)位數(shù)的計算公式:小數(shù)位數(shù)=16-度的位數(shù)-分秒的位數(shù)4-小數(shù)點位數(shù)1。
通過對源代碼的修改,實現(xiàn)了避免出現(xiàn)60″、保留最多小數(shù)位數(shù)、支持負角度。
修改后的角度轉度分秒代碼如下:
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格式的坐標轉換報表,表格的列寬和字號隨坐標系名稱、坐標系類型、小數(shù)位數(shù)、角度格式等智能調整。
3.6 生成經(jīng)緯網(wǎng)格
經(jīng)緯網(wǎng)格可用于專題圖的制作、柵格圖的糾正拼接等。較復雜的經(jīng)緯網(wǎng)格一般使用ArcGIS生成,為了能夠直接生成符合要求的、DWG格式的經(jīng)緯網(wǎng)格,專門開發(fā)了生成經(jīng)緯網(wǎng)格功能。
本功能支持多種橢球、支持自定義高斯投影、支持注記網(wǎng)格經(jīng)緯度,可自定義網(wǎng)格范圍、經(jīng)線緯線間隔、設置網(wǎng)格線樣式等。
圖3 繪制經(jīng)緯風格
筆者對程序的各個模塊進行了大量獨立測試和聯(lián)合測試,并用大同市C級GPS網(wǎng)多套坐標成果對程序進行了全面驗證。大同市C級GPS網(wǎng)覆蓋面積約1 500 km2,東西跨度57 km,南北跨度36 km。用該成果驗證轉換精度,具有很好的代表性。
作者編制了較完整程序測試報告,并制作了轉換精度分布圖。測試結果表明,程序穩(wěn)定可靠、轉換精度較高。由于報告內(nèi)容較多,限于篇幅,僅以大同獨立坐標系轉西安80坐標系為例簡要介紹。
測試方法如下:
(1)轉換精度:輸入源坐標,轉換得到目標坐標,將目標坐標與控制點坐標進行比較。
(2)逆轉相符性:輸入源坐標,轉換得到目標坐標,再將目標坐標轉換為源坐標,將轉換得到的源坐標與輸入的源坐標進行比較。
(3)源坐標高程對平面精度的影響:輸入源坐標時,高程分別輸入0、1 000、大地高,將3種不同高程時得到的目標坐標進行比較。
(4)COORD轉換精度:在COORD中輸入與本程序一樣的坐標轉換參數(shù),將COORD得到目標坐標與控制點坐標進行比較。
(5)本程序與COORD比較:在COORD中輸入與本程序一樣的坐標轉換參數(shù),將COORD得到目標坐標與本程序得到目標坐標進行比較,如表1所示。
坐標轉換測試項目及精度 表1
投入使用以來,程序在不斷地改進和完善,目前仍有諸多不足之處,如不支持坐標轉換參數(shù)的求解,不支持高程的轉換等。今后筆者會適時增加這方面的功能。
通過此次開發(fā),筆者掌握了全套源代碼,通過定制可服務不同需要,對于提高工作效率具有重要意義。此外,通過實踐加深了對坐標轉換原理和方法的認識。
[1] 王順興,顏美代.精解Word 2000 VBA與范例解析[M].北京:北京大學出版社,2001.
[2] 張晉西.Visual Basic與AutoCAD二次開發(fā)[M].北京:清華大學出版社,2002.
[3] 何光渝.Visual Basic常用數(shù)值算法集[M].北京:科學出版社,2002.
[4] 許謖.Visual Basic應用與開發(fā)案例教程[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—),男,高級工程師,注冊規(guī)劃師,主要從事生產(chǎn)管理和技術研究工作。