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