999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Google Earth的導航電子地圖設計

2014-01-15 10:00:18姚冰冰袁志敏
電子設計工程 2014年19期

姚冰冰,袁志敏,吳 梅

(1.西北工業大學 陜西 西安 710129;2.陜西飛機工業(集團)有限公司設計研究院 陜西 漢中 723213)

隨著現代無人機的發展,為了能更好地監視無人機的飛行狀況并對無人機進行控制,人們使用了各種地面設備,包括人工水平儀、慣性測量單元指示器、3D視景[1]、電子地圖等,來輔助操作員對無人機的飛行數據和任務設備進行實時地監控。其中電子地圖是伴隨著計算機技術的發展而出現的地圖新形式,Google Earth是其中的典型代表。

傳統的紙質地圖在人類歷史上扮演了重要角色,隨著計算機技術的發展,人們發明了更加精確、靈活的電子地圖。從20世紀80年代起,歐美很多國家就開始了相關研究,到現在電子地圖技術已得到了很大發展,廣泛的應用到了交通和導航領域[2]。

Google Earth是Google公司開發的一款虛擬地球軟件,它把航拍照片、衛星圖像和GIS數據整合在一起,形成一個地球的三維模型[3]。Google Earth的數據大都來源于美國國家航空航天局(NASA)的衛星圖像,用戶可以通過它來足不出戶的瀏覽世界。Google Earth還可以進行二次開發,來實現一些復雜的應用需求。

1 Google Earth及其二次開發

目前針對Google Earth的開發主要有兩種方式,第一種是基于Google Earth的API;第二種是基于KML文件[4]。編寫程序時,為了實現特定功能,需要結合使用這兩種開發方式。

1.1 Google Earth API介紹

Google公司提供了Google Earth API類庫,基于此用戶可以在外部程序中調用Google Earth的功能。Google Earth API類庫包含十一個類,主要用到的有:

1)IApplicationGE類,該類是Google Earth API的入口類,通過該類可以控制Google Earth客戶端的開啟、關閉,獲取視圖窗口句柄、主窗口句柄,還可以進行獲取地圖視場照相機對象、Google Earth版本號、轉換坐標等復雜操作[3];

2)ICameraInfoGE類,該類表示Google Earth地圖上某一點的視場照相機,通過該類可以獲取并設置視場照相機的焦點位置、轉角、仰角、方位角等參數;

3)IPointOnTerrainGE類,該類是IApplicationGE類的成員函數 GetPointOnTerrainFromScreenCorrds()的返回類型,通過該類可以將Google Earth坐標系內一點轉化為經緯度信息。

其 他 的 類 還 有 :IFeatureGE、IFeatureCollectionGE、IView ExtentsGE、ISearchControllerGE、ITourControllerGE、IAnimation ControllerGE、ITimeGE、ITimeIntervalGE,分別用來實現不同的功能。

1.2 KML文件介紹

KML是一種基于XML語法與格式的、用于描述和保存地理信息(如點、線、圖像、多邊形、模型等)的編碼規范,KML文件可以被Google Earth識別并顯示。

像XML一樣,KML使用基于 tag的表達方式,tag以結尾。Google Earth定義了種類繁多的tag,包括地標、說明、地面疊加層、路徑和多邊形等。本文主要用到的 tag有:Placemark,地標元素,包含了其它元素;LookAt,視場照相機所處位置元素,包含longitude、latitude、altitude、heading、tilt、range 元素;visibility 元素, 可見性;LineString,路徑元素,包含 altitudeMode、coordinates元素;coordinates元素,坐標元組,每個包括經度、緯度和海拔的浮點值;altitudeMode元素,用來指定如何解釋與之對應的coordinates元素中的海拔分量;Style元素,設定一個樣式;Point元素,點元素,包含altitudeMode、coordinates 元素[5]。

KML文件的tag使用了包含關系,這樣就可以修改單個Placemark元素的LookAt屬性,或是對單個LineString元素或Point元素的altitudeMode屬性進行設置。

2 導航電子地圖設計

作為監控無人機飛行狀態的地面設備的一部分,導航電子地圖應該實現地圖顯示、地圖定位、規劃航跡、顯示實時航跡、重現航跡等功能,本文由于篇幅所限,僅重點實現一些功能。

這里在Microsoft Visual Studio 2008開發環境中基于MFC編寫程序實現所需功能,主要包括視圖嵌入、繪制航跡、查看航跡等功能。

2.1 嵌入Google Earth視圖窗口

1)將所用到的類導入到所建項目中。所用到的類型庫為“Google Earth 1.0 Type Library<1.0>”,在項目中添加即可。

2)啟動Google Earth客戶端。先調用IsInitialized()判斷客戶端是否初始化成功,否則調用CreateDispatch()來啟動Google Earth客戶端,其中 CreateDispatch()接受一個 CLSID類型的參數,在Google Earth COM API官方文檔可查到Google Earth的CLSID值。

3)將Google Earth視圖窗口嵌入到主程序界面中。分別調用 GetMainHwnd()和 GetRenderHwnd()得到 Google Earth主窗口句柄和Google Earth視圖窗口句柄,然后調用Windows API函數 SetWindowPos()函數將 Google Earth的界面隱藏掉,再調用Windows API函數SetParent()函數將Google Earth視圖窗口嵌入到主程序界面中。

程序執行效果圖1所示:

圖1 Google Earth視圖嵌入效果Fig.1 Embedded effect of the Google Earth view window

2.2 在Google Earth視圖中規劃航跡

規劃航跡要將一些地點加入到航跡中,這里用兩種方式實現添加航跡點:1,在Google Earth視圖中添加;2,輸入經緯度來添加。第一種方式需要使用鉤子技術,彈出右鍵菜單功能,轉換坐標方法等,兩種方式都要用到KML文件。

2.2.1 鉤子技術

瀏覽Google Earth視圖是了解某一地區地形和相對位置最直觀的方式,有時需要將某個地點加入到航跡中,這里實現右鍵彈出菜單的功能,在菜單中決定是否將選中地點加入航跡。

Google Earth沒有提供和鼠標按鍵有關的接口函數[6],需要通過響應鼠標右鍵消息來進行相應動作,但鼠標在Google Earth視圖窗口中點擊產生的消息會被Google Earth攔截,導致響應不了自定義的右擊消息的響應。要實現上述功能需要使用鉤子(Hook)技術。

Windows系統是建立在以消息為基礎的事件驅動機制上的,操作系統將硬件產生的消息(如鼠標移動或鍵盤按下)、操作系統產生的消息和其他Windows程序傳送過來的消息放在消息隊列中,等待應用程序調用[7]。而鉤子可以截獲并處理這些消息,以實現自己期望的功能。鉤子分為線程鉤子和系統鉤子,線程鉤子只能攔截當前線程的消息,而系統鉤子則能攔截系統中所有線程的事件消息。因為系統鉤子會影響系統中所有的應用程序,其鉤子函數需要放在動態鏈接庫(dll)中。系統鉤子原理如圖2所示。

對本文的程序來說,Google Earth視圖窗口嵌入到主程序的界面后,Google Earth在后臺運行,當前線程所屬進程是主程序,綜上考慮需要采用系統鉤子。

在MFC下實現右鍵彈出菜單,可以選擇響應WM_RBUTTONDOWN、WM_RBUTTONUP或 WM_CONTEXTMENU消息,這里選擇響應WM_CONTEXTMENU消息。

在動態鏈接庫中編寫鉤子處理函數,攔截到WM_RBUTTONUP消息后,向主窗口發送WM_CONTEXTMENU消息;主程序中在WM_CONTEXTMENU消息的處理函數中進行彈出菜單的動作。程序執行效果如圖3所示。

圖2 系統鉤子原理Fig.2 Principle of system hook

圖3 Google Earth視圖窗口右鍵效果Fig.3 Effect of right button clicked on Google Earth view window

2.2.2 Google Earth坐標系與屏幕坐標系

在Google Earth視圖中將選中地點添加到航跡時,還需要取得選中地點的屏幕坐標,傳遞給主程序,一方面WM_CONTEXTMENU消息的處理函數需要這個數值,以在鼠標右鍵點擊的地點彈出菜單;另一方面,需要將該所選地點的屏幕坐標轉換為經緯度信息寫入KML文件,以進一步使用。

Google Earth沒有提供獲取屏幕坐標的函數,也沒有提供從屏幕坐標系向地理坐標系轉換的函數,只提供了從Google Earth坐標系向地理坐標系轉換的Get Point On Terrain From ScreenCoords()[6]函數,該函數在 IApplicationGE類中定義,接受兩個參數,分別是選中地點在Google Earth坐標系中的橫坐標和縱坐標,因此需要先得到這兩個參數的值。

Google Earth坐標系和屏幕坐標系對應關系如圖4所示。

圖中xoy為Google Earth坐標系,橫坐標與縱坐標范圍都為-1到1;XOY為屏幕坐標系,虛線部分為Google Earth視圖窗口,(L,T)為其左上角頂點在屏幕坐標系坐標,(R,B)為其右下角頂點在屏幕坐標系坐標,(Ox,Oy)為視圖中心在屏幕坐標系坐標。

通過圖4所示對應關系,可以得到屏幕坐標系中一點(x,y)與 Google Earth 坐標系中對應點(GEx,GEy)的關系:

(x-Ox)/(R-L)=(GEx-0)/(1-(-1)),

圖4 Google Earth坐標系和屏幕坐標系對應關系Fig.4 Correspondence of google earth coordinate and screen coordinate

(Oy-y)/(B-T)=(GEy-0)/(1-(-1))。

其中,屏幕坐標(x,y)由鉤子程序取得,傳給主程序;頂點坐標 (L,T)、(R,B) 可調用 Windows API函數 Get Window Rect()得到;視圖中心坐標(Ox,Oy)可由(L,T)、(R,B)計算得到,由此可計算出 Google Earth坐標(GEx,GEy)。然后用上面提到的函數Get Point On Terrain From ScreenCoords()將之轉化為地理坐標,寫入KML文件中。

2.2.3 讀寫KML文件

KML文件本質上還是XML文件,讀寫XML文件的方法有很多,這里使用CMarkUp類來修改KML文件內容。

添加航線和航跡點時,可以事先在KML文件中預先寫好一定數量的LineString元素和Point元素,在添加時按次序修改。但由于每次要添加的航線數和航跡點數是不同的,上述方法并不合適,這里根據KML語法特征構建一個線模版KML文件和一個點模版KML文件[8],添加航線或航跡點時,復制該模版文件,然后修改所復制的文件的相應元素。

對于所添加航跡點,要設置標記來突出顯示,這可以通過使用Style元素來實現。

添加航線流程圖如圖5所示。

圖5 添加航線流程圖Fig.5 Flow chart of adding track routes

流程圖中,l用來計數當前添加的是第幾條航線;p用來計數當前添加的是第幾個航跡點,以給復制的文件命名及之后調用。

添加新航線之前,應隱藏上一條添加的航線和航跡點,這可以通過修改KML文件的visibility元素的值做到,其值為1表示可見,為0表示不可見。

讀KML文件時,使用IApplicationGE類的OpenKmlFile()函數,該函數接受兩個參數,第一個參數為要讀取的KML文件的絕對路徑,第二個參數為1。每次添加航跡點后,都需要讀取l-p.kml,使選中的地點顯示出標記效果。

完成添加航跡點后,使用OpenKmlFile()函數讀取l.kml文件,即可在Google Earth視圖上形成航跡,繪制航跡效果如圖6所示。

圖6 繪制航跡效果圖Fig.6 Effect of drawing track route

2.3 查看規劃好的航跡

完成添加航線后,有時需要查看已經規劃好的航跡,可以在地圖上直觀查看其地理位置或者查看某條航跡上的航跡點信息,這些需要用到一個帶復選框的List Box控件。MFC沒有提供帶復選框的List Box控件,可以修改其Owner Draw屬性和Has Strings屬性,并將綁定的控件類型改為CCheckListBox即可。

每次添加新航線后,要在List Box控件中生成一個新條目,以便全部添加完成后查看該航線信息。

通過勾選條目之前的復選框狀態,來決定是否在地圖上顯示某航跡。復選框狀態改變后,會發送ON_LBN_SELCHANGE消息,在該消息的處理函數OnSelchangeList()中添加代碼,實現顯示某條航線的功能。顯示航線流程圖如圖7所示。

流程圖中,i和j分別用來給條目和航跡點計數,由于條目編號從0開始,而航線編號從1開始,因此條目i對應的航線號為i+1。

通過雙擊條目來顯示某條航跡的詳細信息。雙擊List Box會發送ON_LBN_DBLCLK消息,在該消息的處理函數OnBnDBClickedListBox()添加代碼,通過 CMarkUp類來讀取所點擊航線對應的KML文件,獲取其coordinates元素信息,經過字符串處理,就能得到該航線各個航跡點的經度、緯度和海拔值。

2.4 在Google Earth視圖中顯示實時航跡

顯示實時航跡就是要在電子地圖上動態顯示無人機的飛行過程,以檢驗飛行效果和任務執行情況。這里需要讀取保存無人機飛行數據的EXCEL文件,讀取EXCEL文件的方法有很多,本文選用BasicExcel類來讀取[9]。

圖7 顯示航線流程圖Fig.7 Flow chart of displaying track route

首先建立一個包含Point元素和Style元素的KML文件,其LookAt元素和coordinates元素修改為無人機的初始位置,設置Style元素標記用來表示無人機;使用LineStyle元素來給表示實時航跡的線條設置不同的顏色和粗細度,以區別于規劃的航跡。

每隔固定時間,通過讀取EXCEL文件得到經緯度信息,依此來修改KML文件中coordinates元素的值,然后讀取KML文件。這樣每次讀取,無人機標記就會顯示在其實際飛行位置。實時航跡顯示效果如圖8所示。

圖8 實時航跡顯示效果圖Fig.8 Effect of Real-time track routes display

圖中,細線為規劃的航跡,粗線為實際飛行航跡。

3 結束語

Google Earth是Google公司開發的一款優秀軟件,普通用戶可以通過它來免費瀏覽全球各地的高清晰度衛星圖片。而有特殊需求的用戶則可以通過二次開發做出特定功能。本文基于Visual Studio 2008平臺,利用Google Earth API和KML文件,編寫程序實現了規劃航跡、查看航跡和顯示實時航跡等功能。

[1]DanielPerez,Ivan Maza, Fernando Caballero, David Scarlatti, Enrique Casado, Anibal Ollero.A Ground Control Station for a Multi-UAV Surveillance System[J].Journal of Intelligent&Robotic Systems,2013,69(1-4):119-130.

[2]王倩.基于GIS的電子導航圖和任務規劃[D].西安:西北工業大學,2007.

[3]江寬,龔小鵬.Google API開發詳解:Google Maps與Google Earth雙劍合璧[M].北京:電子工業出版社,2008.

[4]馬俊.基于GoogleEarth的無人機地面站監控系統[D].南京:南京航空航天大學,2011.

[5]Google.Google Developers:Keyhole 標 記 語 言 [EB/OL].(2013-09-30)[2013-11-08].https://developers.google.com/kml/documentation/kmlreference?hl=zh-CN.

[6]馬謙.智慧地圖:Google Earth/Maps/KML核心開發技術揭秘[M].北京:電子工業出版社,2010.

[7]侯俊杰.深入淺出MFC[M].武漢:華中科技大學出版社,2002.

[8]楊鑫,鄭新奇.Google Earth二次開發制圖接口設計與實現[J].中國科技論文在線精品論文,2011,4(18):1692-1696.YANG Xin,ZHENG Xin-qi.An interface for drawing features in secondary development of Google Earth[J].Highlights of Sciencepaper Online,2011,4(18):1692-1696.

[9]劉瑞通,茍先太,馬超,等.基于BasicExcel的讀寫Excel方法研究[J].計算機與現代化,2011(8):198-200.LIU Rui-tong,GOU Xian-tai,MA Chao,et al.Methods of accessexcelbased on basicExcel [J].Computerand Modernization,2011(8):198-200.

主站蜘蛛池模板: 九九九精品视频| 4虎影视国产在线观看精品| 成人免费午间影院在线观看| 国产自视频| 亚洲精品第一在线观看视频| 亚洲男人天堂久久| 亚洲国产精品日韩av专区| 国产日本一线在线观看免费| 色综合热无码热国产| 成人一级黄色毛片| 99在线视频精品| 99久久亚洲综合精品TS| 极品尤物av美乳在线观看| 欧美亚洲一区二区三区在线| 成人一区在线| 中文字幕第4页| 久草网视频在线| 国产97视频在线| 91无码视频在线观看| 国产激情国语对白普通话| 亚洲毛片网站| 中文字幕在线欧美| 国产精品亚洲五月天高清| yy6080理论大片一级久久| 最新亚洲人成无码网站欣赏网| 在线观看精品国产入口| 国产男人的天堂| 亚洲精品国产综合99| 久久综合色88| 9啪在线视频| a欧美在线| 色哟哟国产精品一区二区| 国产1区2区在线观看| 99激情网| 女人18毛片久久| a天堂视频| 国产精品性| 国产精品19p| 波多野结衣一区二区三区AV| 98超碰在线观看| www欧美在线观看| 婷婷综合色| 99久久精品国产麻豆婷婷| 亚亚洲乱码一二三四区| 亚洲中文字幕久久精品无码一区| 波多野结衣一区二区三区88| 亚洲欧洲一区二区三区| 国产网站免费| 91系列在线观看| 久久久精品久久久久三级| 婷婷久久综合九色综合88| 免费无遮挡AV| 国产美女自慰在线观看| 在线观看亚洲精品福利片| 97一区二区在线播放| 国语少妇高潮| 国产9191精品免费观看| 亚洲欧美国产高清va在线播放| 亚洲AV人人澡人人双人| 国产主播在线观看| 亚洲成aⅴ人在线观看| 99视频在线看| 丰满的少妇人妻无码区| 国产菊爆视频在线观看| 国产老女人精品免费视频| 日韩不卡免费视频| 久久6免费视频| 亚洲视频四区| 91精品国产丝袜| 国产一区二区三区在线观看视频| 国产精品视频系列专区 | 国产精品专区第一页在线观看| 在线观看热码亚洲av每日更新| 一本大道视频精品人妻| 国产乱人免费视频| 婷婷激情亚洲| 国产午夜不卡| 国产精品福利社| 色综合成人| 欧美日韩国产在线人成app| 免费观看国产小粉嫩喷水 | 日本精品一在线观看视频|