在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

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

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

更新時間:2022-05-18 文章作者:未知 信息來源:網絡 閱讀次數:

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

  一、 前言

  電子地圖應用作為一門新興學科,已不僅限于地圖制作中。本文利用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文件

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://地圖窗口句柄

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

  程序清單2 MapAppView.cpp文件

void CMapAppView::OnInitialUpdate()
{
char str[256];
CView::OnInitialUpdate();
char str[256];
///創建航顯底圖
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);//創建地圖窗口
/*設置地圖窗口的圖層,由最上一層開始是中國疆域,各省疆域,省會城市,并標注上省會城市的名字*/
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://調整地圖窗口尺寸,將地圖窗口放置在右半屏上
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://調整地圖窗口視野和中心點
double m_dView_center_x=113.35; file://地圖窗口中心點,經緯度
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);//設置地圖窗口中心點窗口視野
file://設置地圖窗口漫游縮放的右鍵菜單
mapinfo.Do("Create Menu \"MapshellShortcut\" ID 17 as \"漫游\" calling 1702,\"縮小\" calling 1706, \"放大\" calling 1705 ,\"(-\"");
file://創建實時航跡顯示圖層
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://實時航跡圖層設置為快速刷新}
5. 編譯運行軟件,將屏幕顯示分辨率設置為1600′1024,則在右半屏出現地圖窗口。現在剩下的工作只是加入接收目標數據并轉換為經緯度后進行實時顯示,這里只給出同地圖窗口有關的部分,假設正在不斷接收目標數據,寫入全局變量中,并向CmapAppView類發送消息,調用CmapAppView類的ShowMapLine()函數。在MapApp.cpp文件中添加全局變量定義:

   double global_long;//經度

   double global_lat;//緯度

   double global_long_last;//上一點經度

   double global_lat_last;//上一點緯度

   unsigned long global_num; file://接收點計數

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

   extern double global_long;//經度

   extern double global_lat;//緯度

   extern double global_long_last;//上一點經度

   extern double global_lat_last;//上一點緯度

   extern unsigned long global_num; file://接收點計數

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

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

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

  程序清單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://設置飛機目標顯示的樣式
mapinfo.Do(str); file://創建目標圖標對象
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://畫各設備的航跡
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);//創建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類的析構函數中添加下面的代碼:

  程序清單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");//保存實時航跡表
}
}

  左屏顯示內容的構造,可根據各軟件系統的要求,顯示數據,圖表等,由VC++編程實現。

  三、 其它說明

  上面程序清單2中

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

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

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

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

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 人人爽人人av| 91制片厂免费观看| 成人免费观看cn| aaaaaaaa毛片| 黄色a级三级三级三级| 中文字幕国产免费| 我看黄色一级片| 999精品视频在线| 四季av一区二区| 免费一区二区三区在线观看 | a在线观看免费视频| 成人一区二区三| 日本免费观看网站| 天天操精品视频| 五月天综合婷婷| 日韩欧美视频免费在线观看| www.av毛片| 日韩视频在线免费看| www.com黄色片| 黄色www在线观看| 欧美男女爱爱视频| 丁香婷婷激情网| 欧美精品色视频| 久久久久久久香蕉| 国产福利视频在线播放| 亚洲成人天堂网| 加勒比海盗1在线观看免费国语版| 欧美精品久久久久久久自慰| 一本大道熟女人妻中文字幕在线| 超碰在线播放91| 天天操天天干天天玩| 国产精品丝袜久久久久久消防器材 | 一区中文字幕在线观看| 欧美一区二区三区综合| 青青草原av在线播放| 免费黄频在线观看| 人妻av无码专区| 一道本视频在线观看| 日韩美女爱爱视频| 国内自拍第二页| 久久婷婷国产精品| 福利在线小视频| 色综合色综合色综合色综合| www.日本三级| 图片区乱熟图片区亚洲| 亚洲熟妇av一区二区三区漫画| 久久艹这里只有精品| 欧美黄色一级片视频| 国产黄色片免费在线观看| 日韩av片免费观看| 国产wwwxx| 国产午夜伦鲁鲁| 成人午夜免费在线视频| 亚洲一二三av| 天天综合网日韩| www.日日操| 国产av无码专区亚洲精品| www.亚洲成人网| 男同互操gay射视频在线看| 国产精品视频黄色| 国产主播在线看| 国产91在线视频观看| 蜜臀av无码一区二区三区| 91精品国产毛片武则天| 中文字幕av导航| 美国av在线播放| 成年人黄色在线观看| 色网站在线视频| 亚洲AV无码成人精品一区| 午夜福利123| 亚洲一区二区三区四区精品| 亚洲综合欧美激情| 久久久久国产一区| 欧美婷婷精品激情| 国产91色在线观看| 欧美女同在线观看| 影音先锋成人资源网站| 91看片淫黄大片91| 轻点好疼好大好爽视频| 欧美视频在线观看网站| 国产网站免费在线观看| 日av中文字幕| 国产探花在线观看视频| 久久最新免费视频| 丰满爆乳一区二区三区| 一区二区三区免费播放| 91精品国产三级| www婷婷av久久久影片| 九九九九免费视频| 最新av免费在线观看| 亚洲综合激情五月| 高清在线观看免费| 中文字幕亚洲影院| 国产精品www在线观看| 日韩精品视频久久| 香蕉视频xxxx| 少妇高潮喷水久久久久久久久久| 日本成人中文字幕在线| 大地资源第二页在线观看高清版| 欧美狂野激情性xxxx在线观| 亚洲男人天堂色| 欧美狂野激情性xxxx在线观| av无码精品一区二区三区| 久久久国产精华液999999| 潘金莲一级淫片aaaaaa播放1| 欧美日韩国产精品激情在线播放| 色一情一区二区三区| 黄网站欧美内射| 国产传媒免费观看| 亚洲乱码国产一区三区| 国产爆乳无码一区二区麻豆| 天堂一区在线观看| 欧美牲交a欧美牲交| 欧美a级免费视频| 午夜国产福利在线观看| 91av俱乐部| 日本a级片免费观看| 国产精品一二三在线观看| 手机在线看福利| 欧美成人免费在线观看视频| 中国黄色录像片| www.成年人| 日韩欧美国产片| 天天爽人人爽夜夜爽| avav在线看| 国产最新免费视频| 国产曰肥老太婆无遮挡| 中文字幕在线乱| 韩国一区二区在线播放| 中文字幕第38页| 免费激情视频在线观看| 国产极品美女高潮无套久久久| 日b视频免费观看| 日韩一级免费看| 黄色网址在线免费看| 91精品国产三级| 久久久天堂国产精品| 97久久国产亚洲精品超碰热 | 麻豆视频传媒入口| 欧美日韩视频免费在线观看| 手机视频在线观看| 五月花丁香婷婷| 亚洲欧美天堂在线| 樱空桃在线播放| 成年丰满熟妇午夜免费视频| 永久免费网站视频在线观看| 99久久99久久精品| 精品一区二区三区无码视频| 日韩精品―中文字幕| 已婚少妇美妙人妻系列| 尤蜜粉嫩av国产一区二区三区| 国产又黄又猛的视频| 日韩av影视大全| 丁香花在线影院观看在线播放| 亚洲中文字幕无码av永久| 免费午夜视频在线观看| 亚洲最大成人在线观看| 国产经典久久久| 99999精品视频| 91 视频免费观看| 亚洲 欧美 日韩 国产综合 在线| av视屏在线播放| 久久久成人精品一区二区三区| 久久久亚洲精品无码| 色国产在线视频| 亚洲国产精品无码av| 在线免费视频a| 成人在线免费高清视频| 狠狠操精品视频| 成人午夜免费在线视频| 男人搞女人网站| 亚洲色婷婷久久精品av蜜桃| 亚洲黄色a v| 狠狠97人人婷婷五月| av不卡在线免费观看| 亚洲一二三区av| 日本www在线视频| 一级黄色片在线免费观看| 国产精品后入内射日本在线观看| 毛片毛片毛片毛片毛| xxxx一级片| 日韩av综合在线观看| 亚洲成人动漫在线| 国产无遮挡猛进猛出免费软件| 国产aaa一级片| 日本a在线天堂| 男女h黄动漫啪啪无遮挡软件| 亚洲综合欧美激情| 人妻无码视频一区二区三区| 和岳每晚弄的高潮嗷嗷叫视频| 久久精品一二三四| 亚洲久久中文字幕| 天天干天天操天天玩| 亚洲男人天堂色| www黄色在线| 三级a在线观看| 天堂av在线网站| 天天综合网日韩| 簧片在线免费看| 一本久道中文无码字幕av|