轉帖|其它|編輯:郝浩|2011-02-10 14:53:53.000|閱讀 559 次
概述:電子地圖應用作為一門新興學科,已不僅限于地圖制作中。本文利用VC++和OLE(Object Linking and Embedding, 對象連接和嵌入)編程技術,實現了實時信息在矢量地圖背景上的顯示。本文主要介紹如何用VC++實現矢量地圖背景下的實時顯示,希望對大家有幫助。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
一、 前言
電子地圖應用作為一門新興學科,已不僅限于地圖制作中。本文利用VC++和OLE(Object Linking and Embedding, 對象連接和嵌入)編程技術,實現了實時信息在矢量地圖背景上的顯示。
程序應用于顯示處理終端,接收并處理網絡信息的部分在不同的系統中有不同的要求,這里不再贅述。
MapInfo矢量地圖用圖層方式進行存儲和管理,每個圖層對應地圖上的一類要素(如居民地,水系,鐵路,公路等),對于每個包含圖形信息的圖層,需要有4個文件(.dat, .tab, .map, .id)支持。
MapInfo地圖允許嵌入一個地圖窗口到任何能接受OLE對象的應用程序中。從服務器(如MapInfo)插入一個OLE對象到容器應用程序(如Microsoft Word),并在該應用程序中對這個對象進行處理。被嵌入的對象是來自服務器應用程序的對象的一個副本。對象一旦位于容器中,它將不再被鏈接到源對象。
在VC++應用程序中用OLE方式嵌入MapInfo進程,需定義了一個MapInfo對象(DMapInfo類),DMapInfo類在MapInfo類型庫(Mapinfow.tlb)中定義。MapInfo軟件提供了自己的編程語言MapBasic, VC++對地圖進程的操作主要通過發送MapBasic命令來實現。
二、 創建程序框架
程序框架是用MFC實現的,MFC 應用程序向導(AppWizard)生成了大部分的代碼,然后加入MapInfo進程。步驟如下:
1. 創建一個新項目,項目類型選擇MFC AppWizard(exe),項目名稱設為MapApp,其它按照提示進行設置即可。應用程序向導自動生成了三個類:
CmapAppApp 應用程序類
CmapAppDoc 文檔類
CmapAppView 視圖類
CmainFrame 主框架類
2. 添加MapInfo類型庫
運行類向導,單擊增加類按鈕(Add Class …),選擇“From a type library”,找到“Mapinfow.tlb”文件并打開,在“Confirm Classes”中選擇“DMapInfo”類,單擊OK確認輸入并關閉對話框。現在MapApp應用程序中已添加了DMapInfo類,并增加了"mapinfow.h"和"mapinfow.cpp"兩個源文件。
3. 用OLE方式嵌入MapInfo進程
在"mapApp.cpp"中CMapAppApp theApp語句下面加入下面的語句:
DMapInfo mapinfo; file://mapinfo對象
在CMapAppApp::InitInstance() 函數中增加OLE的初始化,代碼如下:
程序清單1 MapApp.cpp文件
將"mapbasic.h"文件拷貝到本項目的目錄中,在“stdafx.h”中增加以下代碼,把mapinfo說明為全局變量:
4. 顯示地圖窗口
為CmapAppView類增加地圖窗口的標識和句柄變量,在MapAppView.h文件中添加如下代碼:
打開類向導窗口,在Class Name下拉列表框中選擇類CmapAppView,Object Ids列表框中選擇CmapAppView,Messages列表框中選擇OnInitialUpdate,單擊Add Function為CmapAppView重載OnInitialUpdate()函數,然后在函數中添加顯示地圖窗口的代碼。
程序清單2 MapAppView.cpp文件
5. 編譯運行軟件,將屏幕顯示分辨率設置為1600′1024,則在右半屏出現地圖窗口。現在剩下的工作只是加入接收目標數據并轉換為經緯度后進行實時顯示,這里只給出同地圖窗口有關的部分,假設正在不斷接收目標數據,寫入全局變量中,并向CmapAppView類發送消息,調用CmapAppView類的ShowMapLine()函數。在MapApp.cpp文件中添加全局變量定義:
在MapApp.h文件中添加全局變量說明:
在CmapAppView::OnInitialUpdate()函數的結束部分添加如下代碼:
/////////////////定義mapinfo中所用的變量
在CmapAppView:: ShowMapLine()函數代碼如下:
程序清單3 MapAppView.cpp文件
6. 編譯運行軟件,顯示界面如下:
要保存plane表,可在CmapAppView類的析構函數中添加下面的代碼:
程序清單4 MapAppView.cpp文件
左屏顯示內容的構造,可根據各軟件系統的要求,顯示數據,圖表等,由VC++編程實現。
三、 其它說明
上面程序清單2中
sprintf(str,"Add Map Window %lu Layer plane Animate",m_lWindowid);
語句中的Animate屬性一定要有,這表示將plane圖層設置為動態(Animate)圖層,每個地圖窗口只能有一個動態圖層,當這個圖層上的對象變化時,地圖窗口只刷新此圖層,以便可以實現快速刷新。
在應用OLE技術嵌入地圖窗口的應用中,還可根據需要加入多種工具,用于地圖信息的修改和查詢,如標尺窗口,信息窗口,圖層控制,圖層選擇編輯等,但在實時接收數據并顯示的狀態下,有些功能的使用將會導致訪問沖突,以致程序出錯,如圖層控制、圖層編輯等,原因是實時數據正在對plane表進行編輯,此時再改變其它圖層,就與mapInfo一次只能編輯一個圖層的原則產生了沖突。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉載自:網絡轉載