前言:本站為你精心整理了谷歌地圖在鐵路選線中的技術研究范文,希望能為你的創(chuàng)作提供參考價值,我們的客服老師可以幫助你提供個性化的參考范文,歡迎咨詢。
1引言
GoogleEarth(以下簡稱GE)是一款由Google公司開發(fā)的三維可視化地球軟件,它把衛(wèi)星影像、航空照片、三維地面模型等GIS信息布置在一個地球的三維模型上[1]。GE提供了豐富、免費的全球不同分辨率的遙感影像數(shù)據(jù);GE使用單圓柱投影,并使用WGS84基準面作為其平面基準,GE所采用的坐標系統(tǒng)是WGS-84坐標系;GE采用開放的數(shù)據(jù)標準和規(guī)范,并提供二次開發(fā)的API接口。GE所具備的這三個特點說明GE同傳統(tǒng)地圖一樣具備表達和傳遞地形、地物信息的功能;建立在嚴密的數(shù)學模型下;擁有二次開發(fā)的接口。GE具有這三個特點使它能夠作為鐵路選線設計的一個平臺,滿足鐵路選線設計一定階段內設計需求,并且具有實時三維顯示的巨大優(yōu)勢,這是傳統(tǒng)基于CAD選線設計平臺所不能比及的[2]。結合傳統(tǒng)的基于CAD平臺鐵路選線設計過程和特點,基于GE平臺進行鐵路選線設計的過程主要分為平面設計和縱斷面設計[3]。區(qū)別在于在如何實現(xiàn)在GE平臺中實現(xiàn)選取交點,獲取點位信息;完成平面設計工作,如何提取地面線,進行下一步的縱斷面設計,所有的設計元素都要以一定的形式展示出來,在GE中通過KML文件的格式將各種元素顯示,因此本文重點對基于GE平臺進行鐵路選線設計中,實現(xiàn)平面設計功能、提取地面線進行研究,KML技術進行研究。本文所論述的平臺系統(tǒng)是的開發(fā)是采用C#語言,采用的開發(fā)平臺是Micro-softVisualStudio2005,在開發(fā)過程中將GE客戶端放入到系統(tǒng)自定義的窗體中。
2平面設計
要實現(xiàn)在GoogleEarth上進行選線設計,通過鼠標點擊實現(xiàn)在GoogleEarth上進行選點,但是由于GoogleEarth軟件在開發(fā)過程對其操作的各種鼠標事件都進行了定義,我們無法完成自己的功能,這里就要利用WindowsAPIHOOK技術,獲取操作系統(tǒng)發(fā)送給GoogleEarth地圖窗口的某些消息(如在地圖窗口單擊,縮放滾輪等消息)。GoogleEarthCOMAPI類庫中提供了成員函數(shù)用來將客戶端坐標系中點的屏幕坐標轉換為改點的地理坐標(經緯度的形式),利用該函數(shù),最終實現(xiàn)對平面選取的交點地理位置信息的獲取。
2.1WindowsAPIHook技術微軟的Windows操作系統(tǒng)是建立在事件驅動的機制上的,鉤子(Hook),是Windows消息處理機制的一個平臺,應用程序可以在上面設置子程序以監(jiān)視指定窗口的某種消息,而且所監(jiān)視的窗口可以是其他進程所創(chuàng)建的。當消息到達后,在目標窗口處理函數(shù)之前處理它,鉤子機制允許應用程序截獲處理window消息或特定事件[4]。鉤子實際上是一個處理消息的程序段,通過系統(tǒng)調用,把它掛入系統(tǒng)。每當特定的消息發(fā)出,在沒有到達目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數(shù)先得到控制權。這時鉤子函數(shù)即可以加工處理(改變)該消息,也可以不作處理而繼續(xù)傳遞該消息,還可以強制結束消息的傳遞。HookAPI是指Windows開放給程序員的編程接口,使得在用戶級別下可以對操作系統(tǒng)進行控制。在本系統(tǒng)的開發(fā)中,通過鉤子鉤住了GoogleEarth軟件定義下的鼠標單擊MouseDown事件。在程序中實現(xiàn)的如下:mouseHook.MouseDown+=newMouseEventH-andler(mouseHook_MouseDown);通過Hook技術實現(xiàn)了獲取鼠標點擊目標點時,目標點所在位置的屏幕坐標,這是實現(xiàn)GE平臺平面選線最關鍵的技術之一。
2.2四種坐標系概述利用Hook技術,獲取到了目標點的屏幕坐標,我們最終目標是獲取目標點的在GE下的地理坐標。在整個系統(tǒng)的開發(fā)中,涉及到四種坐標系統(tǒng):屏幕坐標系、工作區(qū)坐標系、GoogleEarth客戶端坐標系,WGS84坐標系。屏幕坐標系是Windows窗體應用程序用屏幕坐標指定窗口在屏幕上的位置。對于屏幕坐標而言,原點是屏幕的左上角。窗口的完整位置通常用Rectangle結構來描述,該結構包含定義窗口的左上角和右下角的兩個點的屏幕坐標[1]。屏幕坐標系如圖1所示。Windows窗體應用程序使用工作區(qū)坐標指定窗體或控件中的點的位置。在C#中即Form窗體的坐標系,即系統(tǒng)的界面窗體,工作區(qū)坐標的原點是控件或窗體的工作區(qū)的左上角,它同Windows窗體坐標系是一致的。工作區(qū)坐標確保了無論窗體或控件在屏幕上的位置如何,應用程序在窗體或控件中繪制期間都可以使用一致的坐標值。GoogleEarth客戶端坐標系[5],是GE在當前視圖下,自定義的一種坐標系統(tǒng),GoogleEarth客戶端坐標系如圖2所示。
2.3屏幕坐標向工作區(qū)坐標的轉換在C#語言中,通過使用Control類中的Point-ToClient和PointToScreen方法就可以實現(xiàn)兩種坐標系下的坐標轉換,要用到的是PointToClient將指定屏幕點的位置計算成工作區(qū)坐標,該函數(shù)語法為:publicPointPointToClient(Pointp)參數(shù)p表示要轉換的屏幕坐標Point,該函數(shù)返回一個Point,它表示轉換后的Poin(t以工作區(qū)坐標表示)[6]。
2.4工作區(qū)坐標向GoogleEarth客戶端坐標的轉換通過對兩種坐標系的分析,總結出兩種坐標系三點區(qū)別。(1)坐標系原點不同。前者在整個坐標系左上角,后者居整個坐標系中心。(2)Y方向相反,坐標值有差異。前者坐標都為正值,后者坐標有正有負。(3)單位不同,前者是以整個工作區(qū)大小(寬度和高度),后者的范圍在正1至負1中間。基于以上三點,對兩種坐標系下的坐標做出轉換,首先利用C#提供的函數(shù),獲取當前工作區(qū)的寬度和高度,然后找出兩種坐標系的數(shù)學關系,具體如下。width=this.FindForm().Width;hight=this.FindForm().Height;x=(X-width/2)/width*2;y=(Y-hight/2)/hight*2;width:當前工作的寬度;hight當前工作區(qū)高度;x、y:GoogleEarth客戶端坐標;X、Y:工作區(qū)的坐標。2.5GoogleEarth客戶端坐標向WGS84坐標的轉換GECOMAPI的類庫中提供了成員函數(shù)[7]:Ge-tPointOnTerrainFromScreenCoords(),該成員函數(shù)用來將客戶端視圖中的點的屏幕坐標轉換為經緯度的形式。該函數(shù)語法為:IPointOnTerrainGEGetPointOnTerrainFromS-creenCoords(doublescreen_x,doublescreen_y)該函數(shù)接受兩個Double類型的參數(shù),表示視圖中心點在GoogleEarth客戶端坐標系中的坐標值,這兩個參數(shù)值均在-1和1之間,該函數(shù)的返回值為IPointOnTerrainGE型。至此,獲取到了目標點地理坐標,解決了在GE平臺中平面設計最關鍵的問題。
3地面線的提取
平面設計工作完成之后,就要進行縱斷面設計工作,而首先是獲取線位的地面線。GoogleEarthCOMAPI的類庫中提供了成員函數(shù)SetCameraPa-rams(),該成員函數(shù)實現(xiàn)將視圖中心移動到用戶指定位置。該函數(shù)語法為:voidSetCameraParams(doublelat,doublelon,doublealt,EARTHLib.AltitudeModeGEaltMode,doubleRange,doubleTilt,doubleAzimuth,doublespeed)。該函數(shù)接受八個輸入參數(shù),除了altMode,其余均為double型。函數(shù)返回值為void,其中l(wèi)at、lon和alt表示視圖中心的經緯度和高程;range表示視高;speed表示從當前視圖移動到設定點的速度;tilt表示用戶視線和垂直地平線方向的夾角。Azimuth即測繪學在中的方位角,表示用戶視線和正北方向的夾角,altMode表示高程的形式,為AltitudeM-odeGE型,該類型是一個枚舉變量,包括Absol-uteAltitudeGE和RelativeToGroundAltitudeGE兩個取值,當用戶在當前視圖設置地標時,RelativeTo-GroundAltitudeGE取值等于地標的高程值是相對于該位置地面的高度差異,即相對高程,Absol-uteAltitudeGE代表的高程值是相對于海平面得高度差異,即絕對高程。在平面設計完成之后,可以得到線路上任意一里程的坐標值,要想獲取該里程的地面高程,需要把該里程的坐標值作為參數(shù),傳遞給GoogleEarth的API函數(shù)SetCameraParam(s),實現(xiàn)將客戶端的視圖中心移動到該里程點的位置,此時該點在GoogleEarth客戶端坐標系下的坐標是(0,0),即坐標系的原點,然后就可以調用GoogleEarth的API函數(shù)GetPointOnTerrainFromScreenCoord(s),來獲取該點的地面高程,這樣就完成了線位上任一點地面高程的獲取,進而獲取整個線位的地面線。需要注意的一點是,獲取地面線的過程,要保證GoogleEarth客戶端處于打開狀態(tài),在讀取地面線的過程中,不要進行其他操作,以免影響客戶端的移動,為了保證獲取地面線的精度,利用SetCa-meraParams()函數(shù)時,在設定speed的值時,不要取的太大,一般取為2,在進行程序設計中,讀取點是做一個循環(huán),最好在每一個操作之間設置一個時間間隔,以保證讀取的精度,實現(xiàn)方法是讓主進程休眠一定得時間。
4KML技術
KML是一種基于XML語法的標記語言和數(shù)據(jù)擴展格式,通過生成KML文件,就能夠將點、線、多邊形、圖片等顯示在GE中,所以在系統(tǒng)開發(fā)中,要實現(xiàn)對KMl文件的編程控制[8]。C#中類FileStream,這個類提供了在文件中讀寫字節(jié)的方法,要創(chuàng)建FileStream對象。該類的構造函數(shù)具有許多不同的重載版本,在我們程序中要采用的是:FileStream(filePath,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.Read)因為在程序設計中,當創(chuàng)建完KML文件后,就要打開,這就要用到FileShare.Read,這種模式代表允許隨后打開文件讀取,其他的重載版本是無法實現(xiàn)這一功能的。KMl文件是類XmlTextWriter的對象,創(chuàng)建的對象包含XML數(shù)據(jù)(這些數(shù)據(jù)符合W3C可擴展標記語言(XML)1.0和“XML中的命名空間”建議)的流或文件[9]。該類的定義為:XmlTextWriter(stringfilename,Encodingenco-ding)第一個參數(shù)就是要寫入的文件名,第二個參數(shù),表示要生成的編碼方式。GoogleEarth定義的KML文件是UTF-8的形式,所以在程序設計中,創(chuàng)建該類的對象是,這里取的是UTF-8。對KML文件的打開是通過GoogleEarthCOMAPI提供的函數(shù)OpenKmlFile來實現(xiàn)的,該函數(shù)的定義為:voidOpenKmlFile(stringfileName,intsuppres-sMessages)該函數(shù)接受兩個輸入參數(shù),參數(shù)一“fileName”,是一個字符的類型,表示需要打開的文件名和包含文件路徑的,例如:@“E:\大論文\Line5.kml”。第二個參數(shù)取值為“0”或者“1”,表示當用戶要開的文件和GoogleEarth中已經存在的文件如果有沖突,是否處理這種異常情況,一般取為“1”[10]。
5結論
本文分析研究了基于GE平臺進行鐵路選線設計中遇到的關鍵問題,并提出了詳細的解決方法。基于GE平臺進行鐵路選線設計的系統(tǒng)研究,涉及大地測量學、圖形圖像處理、數(shù)據(jù)庫應用、軟件工程、鐵路選線設計等多個學科的知識體系,限于研究者知識水平所限,對平臺系統(tǒng)的研究才算剛剛起步。但隨著對GE的深入研究,GE在鐵路選線設計中將會發(fā)揮巨大的作用。