• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術(shù)開發(fā)教程 > 詳細頁面

        用VC++完成矢量地圖背景下的實時顯示

        用VC++完成矢量地圖背景下的實時顯示

        更新時間:2022-05-18 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

        摘要 本文介紹了在VC++實現(xiàn)的實時顯示系統(tǒng)中,用OLE方式嵌入MapInfo矢量地圖的編程方法,簡要敘述了其實現(xiàn)過程。

          一、 前言

          電子地圖應用作為一門新興學科,已不僅限于地圖制作中。本文利用VC++和OLE(Object Linking and Embedding, 對象連接和嵌入)編程技術(shù),實現(xiàn)了實時信息在矢量地圖背景上的顯示。

          程序應用于顯示處理終端,接收并處理網(wǎng)絡(luò)信息的部分在不同的系統(tǒng)中有不同的要求,這里不再贅述。
        MapInfo矢量地圖用圖層方式進行存儲和管理,每個圖層對應地圖上的一類要素(如居民地,水系,鐵路,公路等),對于每個包含圖形信息的圖層,需要有4個文件(.dat, .tab, .map, .id)支持。

          MapInfo地圖允許嵌入一個地圖窗口到任何能接受OLE對象的應用程序中。從服務(wù)器(如MapInfo)插入一個OLE對象到容器應用程序(如Microsoft Word),并在該應用程序中對這個對象進行處理。被嵌入的對象是來自服務(wù)器應用程序的對象的一個副本。對象一旦位于容器中,它將不再被鏈接到源對象。

          在VC++應用程序中用OLE方式嵌入MapInfo進程,需定義了一個MapInfo對象(DMapInfo類),DMapInfo類在MapInfo類型庫(Mapinfow.tlb)中定義。MapInfo軟件提供了自己的編程語言MapBasic, VC++對地圖進程的操作主要通過發(fā)送MapBasic命令來實現(xiàn)。

          二、 創(chuàng)建程序框架

          程序框架是用MFC實現(xiàn)的,MFC 應用程序向?qū)ВˋppWizard)生成了大部分的代碼,然后加入MapInfo進程。步驟如下:

          1. 創(chuàng)建一個新項目,項目類型選擇MFC AppWizard(exe),項目名稱設(shè)為MapApp,其它按照提示進行設(shè)置即可。應用程序向?qū)ё詣由闪巳齻類:

           CmapAppApp 應用程序類

           CmapAppDoc 文檔類

           CmapAppView 視圖類

           CmainFrame 主框架類

          2. 添加MapInfo類型庫

          運行類向?qū),單擊增加類按鈕(Add Class …),選擇"From a type library",找到"Mapinfow.tlb"文件并打開,在"Confirm Classes"中選擇"DMapInfo"類,單擊OK確認輸入并關(guān)閉對話框。現(xiàn)在MapApp應用程序中已添加了DMapInfo類,并增加了"mapinfow.h"和"mapinfow.cpp"兩個源文件。


        3. 用OLE方式嵌入MapInfo進程

          在"mapApp.cpp"中CMapAppApp theApp語句下面加入下面的語句:

        DMapInfo mapinfo; file://mapinfo對象

          在CMapAppApp::InitInstance() 函數(shù)中增加OLE的初始化,代碼如下:

          程序清單1 MapApp.cpp文件

        BOOL CMapAppApp::InitInstance()
        {
        if (!AfxOleInit()) file://OLE初始化
        { file://失敗
        AfxMessageBox("OLE失敗!");
        return FALSE;
        }
        if (!mapinfo.CreateDispatch("MapInfo.Application")) file://地圖窗口處理進程
        { file://失敗
        AfxMessageBox("Failed to create MapInfo dispatch class!");
        file://::MessageBox(0, mapinfo.GetFullName(), "Amazing!", MB_OK);
        return FALSE;
        }
        /*本處省略MFC自動生成的代碼*/
        }

          將"mapbasic.h"文件拷貝到本項目的目錄中,在"stdafx.h"中增加以下代碼,把mapinfo說明為全局變量:

        #include "mapbasic.h"
        #include "mapinfow.h"
        extern DMapInfo mapinfo; file://全局變量,地圖窗口對象
        4. 顯示地圖窗口

          為CmapAppView類增加地圖窗口的標識和句柄變量,在MapAppView.h文件中添加如下代碼:

        unsigned long m_lWindowid; file://地圖窗口標識
        HWND m_hWindowHwnd; file://地圖窗口句柄

          打開類向?qū)Т翱,在Class Name下拉列表框中選擇類CmapAppView,Object Ids列表框中選擇CmapAppView,Messages列表框中選擇OnInitialUpdate,單擊Add Function為CmapAppView重載OnInitialUpdate()函數(shù),然后在函數(shù)中添加顯示地圖窗口的代碼。

          程序清單2 MapAppView.cpp文件

        void CMapAppView::OnInitialUpdate()
        {
        char str[256];
        CView::OnInitialUpdate();
        char str[256];
        ///創(chuàng)建航顯底圖
        mapinfo.Do("Open Table \"F:\\Province.tab\" ReadOnly Interactive");
        mapinfo.Do("Open Table \"f:\\Capitals.tab\" ReadOnly Interactive");
        mapinfo.Do("Open Table \"f:\\China.tab\" ReadOnly Interactive");
        sprintf(str,"Set Next Document Parent %lu Style 2 ",(long)(UINT)m_hWnd);
        mapinfo.Do(str);//創(chuàng)建地圖窗口
        /*設(shè)置地圖窗口的圖層,由最上一層開始是中國疆域,各省疆域,省會城市,并標注上省會城市的名字*/
        mapinfo.Do("Map From Capitals, Province, China");
        mapinfo.Do("Set Map Layer 1 Label With Capital_Character_Name Parallel On Auto On Visibility On");

        file://獲取地圖窗口的ID號和句柄
        m_lWindowid = atol(mapinfo.Eval("WindowID(0)")); file://窗口ID
        sprintf(str,"WindowInfo(0, %u)", WIN_INFO_WND); file://窗口HWND
        m_hWindowHwnd = (HWND)atol(mapinfo.Eval(str));
        file://調(diào)整地圖窗口尺寸,將地圖窗口放置在右半屏上
        sprintf(str,
        "Set Window %lu Position (8.3,0) Width 8.4 Height 6.05 ScrollBars Off SysMenuClose Off", m_lWindowid);
        mapinfo.Do(str);
        file://調(diào)整地圖窗口視野和中心點
        double m_dView_center_x=113.35; file://地圖窗口中心點,經(jīng)緯度
        double m_dView_center_y=35.04;
        double m_dView_zoom = 4000.0; file://地圖窗口視野,"km"
        sprintf(str,"Set Map Window %lu Zoom %lf Units \"km\" Center (%lf,%lf) XY Units \"degree\"", m_lWindowid,m_dView_zoom,m_dView_center_x,m_dView_center_y);
        mapinfo.Do(str);//設(shè)置地圖窗口中心點窗口視野
        file://設(shè)置地圖窗口漫游縮放的右鍵菜單
        mapinfo.Do("Create Menu \"MapshellShortcut\" ID 17 as \"漫游\" calling 1702,\"縮小\" calling 1706, \"放大\" calling 1705 ,\"(-\"");
        file://創(chuàng)建實時航跡顯示圖層
        mapinfo.Do("Create Table plane (ID Integer) File \"f:\\plane.tab\" ");
        mapinfo.Do("Create Map For plane");
        sprintf(str,"Add Map Window %lu Layer plane Animate",m_lWindowid);
        mapinfo.Do(str); file://實時航跡圖層設(shè)置為快速刷新}
        5. 編譯運行軟件,將屏幕顯示分辨率設(shè)置為1600′1024,則在右半屏出現(xiàn)地圖窗口,F(xiàn)在剩下的工作只是加入接收目標數(shù)據(jù)并轉(zhuǎn)換為經(jīng)緯度后進行實時顯示,這里只給出同地圖窗口有關(guān)的部分,假設(shè)正在不斷接收目標數(shù)據(jù),寫入全局變量中,并向CmapAppView類發(fā)送消息,調(diào)用CmapAppView類的ShowMapLine()函數(shù)。在MapApp.cpp文件中添加全局變量定義:

           double global_long;//經(jīng)度

           double global_lat;//緯度

           double global_long_last;//上一點經(jīng)度

           double global_lat_last;//上一點緯度

           unsigned long global_num; file://接收點計數(shù)

          在MapApp.h文件中添加全局變量說明:

           extern double global_long;//經(jīng)度

           extern double global_lat;//緯度

           extern double global_long_last;//上一點經(jīng)度

           extern double global_lat_last;//上一點緯度

           extern unsigned long global_num; file://接收點計數(shù)

          在CmapAppView::OnInitialUpdate()函數(shù)的結(jié)束部分添加如下代碼:

        /////////////////定義mapinfo中所用的變量
        mapinfo.Do("Dim obj1 As Object"); file://飛機圖標點對象
        mapinfo.Do("Dim Line1 As Object"); file://航跡線對象
        global_num = 0; file://接收目標數(shù)據(jù)計數(shù)初始化為0

          在CmapAppView:: ShowMapLine()函數(shù)代碼如下:

          程序清單3 MapAppView.cpp文件

        void CMapAppView::ShowMapLine()
        {
        char str[256];
        file://畫飛機圖標
        double m_angle = COPI*atan2((global_lat - global_lat_last),
        (global_long - global_long_last))-90;//目標角度
        sprintf(str,
        "Create Point Into Variable obj1 (%lf,%lf) Symbol (85,255,30,\"MapInfo Transportation\",0,%lf)",
        global_long, global_lat, m_angle); file://設(shè)置飛機目標顯示的樣式
        mapinfo.Do(str); file://創(chuàng)建目標圖標對象
        if (global_num >0 )
        {/*收到的第一點,在plane表中插入第一條記錄,后面的點都是更新第一條記錄*/
        sprintf(str,
        "Update plane Set Obj = obj1 Where RowID = %lu",1);}
        else {
        sprintf(str,
        "Inset Into plane (ID,Obj) Values (%lu,Line1) ", global_num);
        }
        mapinfo.Do(str);//用obj1對象更新表中的記錄
        file://畫各設(shè)備的航跡
        sprintf(str,
        "Create Line Into Variable Line1 (%lf,%lf) (%lf,%lf) Pen MakePen(2,2,255)",
        global_long_last, global_lat_last , global_long, global_lat);
        mapinfo.Do(str);//創(chuàng)建line1對象
        if (global_num >0 )
        {//第一個點不畫航跡
        sprintf(str,"Fetch Last From plane");
        mapinfo.Do(str);
        file://插入line1到表中
        sprintf(str,"Insert Into plane (ID,Obj) Values (%lu,Line1)",global_num);
        mapinfo.Do(str);
        }
        global_num ++;
        }

          6. 編譯運行軟件,

          要保存plane表,可在CmapAppView類的析構(gòu)函數(shù)中添加下面的代碼:

          程序清單4 MapAppView.cpp文件

        CMapAppView::~CMapAppView()
        {
        char str[256];
        if (m_hWindowHwnd) file://地圖窗口存在
        {
        sprintf(str,"Close Window %lu",m_lWindowid);
        mapinfo.Do(str);
        m_hWindowHwnd = NULL;
        m_lWindowid = 0L;
        mapinfo.Do("Commit Table plane");//保存實時航跡表
        }
        }

          左屏顯示內(nèi)容的構(gòu)造,可根據(jù)各軟件系統(tǒng)的要求,顯示數(shù)據(jù),圖表等,由VC++編程實現(xiàn)。

          三、 其它說明

          上面程序清單2中

        sprintf(str,"Add Map Window %lu Layer plane Animate",m_lWindowid);

          語句中的Animate屬性一定要有,這表示將plane圖層設(shè)置為動態(tài)(Animate)圖層,每個地圖窗口只能有一個動態(tài)圖層,當這個圖層上的對象變化時,地圖窗口只刷新此圖層,以便可以實現(xiàn)快速刷新。

          在應用OLE技術(shù)嵌入地圖窗口的應用中,還可根據(jù)需要加入多種工具,用于地圖信息的修改和查詢,如標尺窗口,信息窗口,圖層控制,圖層選擇編輯等,但在實時接收數(shù)據(jù)并顯示的狀態(tài)下,有些功能的使用將會導致訪問沖突,以致程序出錯,如圖層控制、圖層編輯等,原因是實時數(shù)據(jù)正在對plane表進行編輯,此時再改變其它圖層,就與mapInfo一次只能編輯一個圖層的原則產(chǎn)生了沖突。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 中文字幕亚洲第一| 免费看片A级毛片免费看| 亚洲偷自拍拍综合网| 国产精品亚洲精品久久精品| 国产一卡二卡四卡免费| 99久久亚洲综合精品成人网| 久久久国产精品福利免费| 久久精品国产精品亚洲精品| 久久精品一区二区免费看| 久久久国产精品亚洲一区| 亚洲精品视频免费看| 亚洲依依成人精品| 最好免费观看韩国+日本| 老司机亚洲精品影院在线观看| 国产乱弄免费视频| yellow视频免费看| 亚洲国产精品乱码一区二区| 四虎国产精品永久免费网址| 亚洲酒色1314狠狠做| 99久久综合国产精品免费| 亚洲GV天堂GV无码男同| 亚洲国产精品无码久久久久久曰| 新最免费影视大全在线播放| 亚洲中文字幕在线第六区| 日韩人妻无码精品久久免费一| 亚洲国产品综合人成综合网站| 成人免费无码大片A毛片抽搐色欲| 色综合久久精品亚洲国产| 久久久久久A亚洲欧洲AV冫| 无码囯产精品一区二区免费| 精品亚洲成A人无码成A在线观看| 国产大片91精品免费观看男同| 国产无遮挡色视频免费观看性色| 亚洲综合日韩中文字幕v在线| 无码免费午夜福利片在线| 亚洲AV蜜桃永久无码精品| 中文字幕无码免费久久| 亚洲一区二区三区免费视频| 免费a级毛片无码av| 中文字幕乱码一区二区免费| 亚洲色www永久网站|