版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
本文格式為Word版,下載可任意編輯——mapinfo在VC上的相關(guān)操作基于MFC的MapInfo數(shù)字地圖在VC++中的集成
Map",basic具有強大的地理信息數(shù)據(jù)操作處理功能,可實現(xiàn)對Mapinfo的編程,為用戶提供了擴(kuò)展系統(tǒng)功能的能力,提供了開放的結(jié)構(gòu),可實現(xiàn)Mapinfo與其他程序之間的連接。但是要實現(xiàn)美觀的用戶界面及較好功能的客戶端應(yīng)用程序,和對網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行計算就十分困難。而VC、VB等可視化的編程工具彌補Mapbasic的不足,更好的開發(fā)用戶所需要的系統(tǒng)。Mapinfo與其他程連接的方法有以下幾種:
(1)OLE(ObjectLinkingandEmbedding)自動化技術(shù)。Mapinfo提供OLE自動化對象模型,它允許其他支持OLE功能的應(yīng)用程序把Mapinfo作為OLE服務(wù)器向其他應(yīng)用程序提供它的對象,而客戶應(yīng)用程序則使用它的對象。其他應(yīng)用程序是通過調(diào)用OLE自動化對象(如Mapinfo和Applica",tion對象)的方法、屬性來操作Mapinfo。
(2)回調(diào)(CallBack)。回調(diào)是指當(dāng)服務(wù)器應(yīng)用程序發(fā)生了一個事件,它會自動地通知客戶應(yīng)用程序的過程。回調(diào)主要包括兩種方式:OLE回調(diào)、DDE回調(diào)。Mapinfo提供的標(biāo)準(zhǔn)的回調(diào)接口主要有:SCODESetStatusText(LPCTSTRlpszMessage)當(dāng)map",info的狀態(tài)欄發(fā)生變化時調(diào)用,參數(shù)為新的狀態(tài)欄字符串指針。SCODEWindowContentsChanged(UnsignedLongWin",dowID)當(dāng)派遣地圖窗口內(nèi)容發(fā)生變化時mapinfo將調(diào)用Win",dowContentsChanged方法,參數(shù)是被改變窗口的ID值。
(3)動態(tài)數(shù)據(jù)交換DDE(DynamicDataExchange)技術(shù)。應(yīng)用程序間的動態(tài)數(shù)據(jù)交換是多任務(wù)的重要特征。動態(tài)數(shù)據(jù)交換(DDE)是Windows操作系統(tǒng)支持的機(jī)制,用于支持DDE服務(wù)器程序組成。尋常請求數(shù)據(jù)的應(yīng)用程序是客戶,提供被請求的數(shù)據(jù)、更新DDE客戶端的是服務(wù)器,對于Mapinfo既可以是客戶也可以是服務(wù)器。事實上,一個單一的應(yīng)用程序可以同時開展多個會話,在一些會話中作為客戶程序,在另一些會話中作為服務(wù)器程序。
(4)調(diào)用動態(tài)連接庫(DLL)。DLL是一種基于Windows的程序模塊,它不僅可以包含可執(zhí)行代碼,還能有數(shù)據(jù),各種資源,擴(kuò)大了庫文件的使用范圍。而在Mapinfo中,調(diào)用動態(tài)連接庫方法比較繁瑣,需要較高的技巧,在實際應(yīng)用中很少用到.
基于MFC的Mapinfo數(shù)字地圖在VC++中集成的實現(xiàn)
在VC++中調(diào)用Mapinfo提供的對象模型,通過自動化技術(shù)可以便利的實現(xiàn)。將Mapinfo地圖窗口繼承到應(yīng)用程序中,是把Mapinfo作為自動化服務(wù)器,應(yīng)用程序作為自動化客戶。一般是利用MFC提供的COleDispatchDirver類創(chuàng)立靜態(tài)客戶。具體實現(xiàn)過程如下:
(1)創(chuàng)立工程,實現(xiàn)對mapinfo的調(diào)用!利用AppWizard創(chuàng)立工程,選擇Automation項。將mapinfow.h、mapinfow.cpp、mapbasic.h參與到工程文件中。在應(yīng)用程序類中參與頭文件:#include",mapinfow.h;并在成員變量聲明中,聲明全局變量mapinfo類的對象:DMapInfoMapinfo;在應(yīng)用程的InitInstance方法中,通過調(diào)
用CreateDispatch()來創(chuàng)立IDispatch類型的對象:Mapinfo.CreateDispatch(",MapInfo.Application)Mapinfo.CreateDispatch(",MapInfo.Runtime)#在頭文件mapinfow.h的最終面參與:externDMapInfoMapinfo;#include",mapbasic.h;
?在CMainFrame::OnCreate中參與以下語句:charstr[256];
sprintf(str,SetApplicationWindow%lu,(long)(UINT)m_hWnd);
mapinfo.Do(str);//調(diào)用mapinfo的Do()方法。這樣就實現(xiàn)了vc中調(diào)用mapinfo。(2)加載數(shù)字地圖
獲得mapinfo窗口的標(biāo)識,將mapinfo窗口作為應(yīng)用程序的字窗口。在視圖類的頭文件中參與以下成員變量:unsignedlongm_WindowId;//定義窗口標(biāo)識IDHWNDm_WindowHwnd;//定義窗口句柄!在視圖類的實現(xiàn)文件中參與頭文件:#include",Map",Infow.h;并在視圖類的構(gòu)造函數(shù)中初始化變量:m_WindowId=0;m_WindowHwnd=0;
在視圖類的OnCreate()函數(shù)中,加載所要求的數(shù)字地圖,并將地圖窗口作為應(yīng)用程序的子窗口,獲得子窗口的標(biāo)識及窗口句柄。
SetWindowLong(m_hWnd,GWL_STYLE,GetWin",dowLong(m_hWnd,GWL_STYLE|WS_CLIPCHILDREN);charstr[256];
mapinfo.Do(",OpenTable\\dongying\\\sprintf(str,\Fromdongying\Mapinfo.Do(str);
m_WindowId=atol(Eval(\sprintf(str,\m_WndowHwnd=(HWND)atoll(mapinfo.Eval(str));?當(dāng)程序退出時,保證mapinfo終止退出。在視圖類的OnDestroy()函數(shù)中參與如下代碼:if(m_WindowHwnd)
{::DestroyWindow(m_WindowHwnd);m_WindowHwnd=NULL;m_WindowId=0;}
#添加數(shù)字地圖的控制命令,實現(xiàn)mapinfo的基本功能。添加地圖的圖層控制菜單,在圖層控制的響應(yīng)函數(shù)中添加如下代碼:
Mapinfo.RunMenuCommand(M_MAP_LAYER_CON",TROL);至此,基本上完成了Mapinfo數(shù)字地圖在VC++中集成應(yīng)用。用戶還可以根據(jù)自己的需求擴(kuò)展更多的功能,實現(xiàn)數(shù)字地圖的操作控制。
利用OLE自動化技術(shù)實現(xiàn)MapInfo與VC++的集成
在OLE自動化這一技術(shù)領(lǐng)域中由應(yīng)用程序或OLE編程工具所浮現(xiàn)的對象稱為OLE自動化對象訪問操作并控制該對象的應(yīng)用程序或OLE編程工具則稱為OLE自動化控制器浮現(xiàn)這些對象的應(yīng)用程序則稱為OLE自動化服務(wù)器OLE自動化服務(wù)器浮現(xiàn)的自動化對象使通過編程方法操縱應(yīng)用程序成為可能通過使用OLE自動化能夠完成以下任務(wù)創(chuàng)立OLE自動化服務(wù)器創(chuàng)立和操縱OLE自動化對象創(chuàng)立OLE自動化控制器
OLE自動化服務(wù)器對象是編程的其可編程能力主要是通過方法和屬性這兩個類的概念及兩種類型的OLE自動化對象成員來實現(xiàn),其中方法可以是帶有大量參數(shù)的函數(shù).它定義了一個對象所能達(dá)到并能完成的行為同時可以獲取或設(shè)置數(shù)據(jù)屬性則是不帶有形參的函數(shù)并能存取或設(shè)置有關(guān)對象當(dāng)前狀態(tài)的信息.二MapInfo與VC++對OLE自動化的支持
我們將主要以MapInfo作為OLE自動化服務(wù)器,VC++6.0作為OLE自動化控制器,在VC++中實現(xiàn)對MapInfo功能的調(diào)用但是MapInfo同時具有回調(diào)能力將VC++應(yīng)用程序作為自動化服務(wù)器當(dāng)MapInfo自身發(fā)生變化時調(diào)用VC++應(yīng)用程序通知自己的改變1.MapInfo提供的支持
(1)MapInfo提供的OLE自動化對象模型如表1所示
其中
Application對象代表MapInfo的一個實例在MBApplications集和MBGlobals集中每一個對象分別代表一個正在運行的MapBasic應(yīng)用程序和一個正在運行的MapBasic應(yīng)用程序中定義的全局變量MIMapGen對象主要用于MapInfo網(wǎng)絡(luò)應(yīng)用程序MISearchInfo對象代表查找的結(jié)果MISelection對象代表MapInfo表MIRows對象集中每一個對象代表表中的每一行MIFields對象集中每一個對象代表表中的每一個域其中MapInfo的實例對象主要提供如下一些常用方法Do(string)向MapInfo出送命令字符串(MapBasic語句)MapInfo將執(zhí)行這些命令Evel(string)應(yīng)用程序通過此方法可獲得MapInfo的執(zhí)行結(jié)果RunMenuCommand(menuid)應(yīng)用程序可執(zhí)行MapInfo的主菜單命令RunCommand(string)解釋并執(zhí)行MapBasic語句與Do類似SetCallBack(Idispatch)將OLE自動化對象登記為一個接受器當(dāng)MapInfo窗口發(fā)生變化時MapInfo將通知.(2)MapInfo提供的回調(diào)功能
假使調(diào)用MapInfo的客戶程序可作為自動化服務(wù)器,則當(dāng)MapInfo發(fā)生變化時例如地圖窗口的變化狀態(tài)欄的改變或執(zhí)行了某一菜單命令等等.MapInfo將自動的通知其派遣對象自動發(fā)生的改變客戶程序可根據(jù)給定的消息編制代碼相應(yīng)的在應(yīng)用程序窗口中作出響應(yīng)和處理MapInfo提供的標(biāo)準(zhǔn)回調(diào)接口主要有SCODESetStatusText(LPCTSTRlpszMessage)當(dāng)MapInfo的狀態(tài)欄發(fā)生變化時調(diào)用參數(shù)為新的狀態(tài)欄字符串SCODEWindowContentsChanged(UnsignedLongwindowID)當(dāng)派遣地圖窗口內(nèi)容發(fā)生變化時MapInfo將調(diào)用WindowContentsChanged方法參數(shù)是被改變的窗口的ID值VC++對OLE自動化的支持
VisualC++集成的MFC框架ClassWizard和AppWizard都提供對OLE自動化的擴(kuò)展支持這些工具處理了創(chuàng)立自動化服務(wù)器和自動化控制器的大部分例行事務(wù)極大的便利了編程者M(jìn)FC框架對OLE自動化支持的基本機(jī)制是派遣映射表(DispatchMap)派遣映射表是一個宏集用于擴(kuò)展需要暴露屬性和方法的調(diào)用它給出了對象的函數(shù)和屬性的內(nèi)部名稱和外部名以及函數(shù)的參數(shù)數(shù)據(jù)類型和屬性的數(shù)據(jù)類型3.MapInfo與VC++的集成的實現(xiàn)
利用OLE技術(shù)在VC++6.0中調(diào)用MapInfo對象的具體實現(xiàn)步驟如下(1)在用AppWizard創(chuàng)立應(yīng)用程序時在OLE選項頁中選擇Automation若沒有選擇則首先需要參與OLE自動化的支持代碼開啟STDAFXh參與#include#include然后在應(yīng)用程序的InitInstance函數(shù)中參與if(!AfxOleInit())AfxMessageBox(\
initalizationfailed\(2)創(chuàng)立mapinfo的支持類并創(chuàng)立它的一個實例
在應(yīng)用程序類中參與頭文件#include\創(chuàng)立全局變量(自動化對象)DMapInfomapinfo;在應(yīng)用程序的InitInstance方法中參與mapinfo.CreateDispatch(\開啟mapinfo.h文件在底部參與externDMapInfomapinfo;
#include\tory/
mapbasic.h\此時已成功的利用OLE技術(shù)裝載了mapinfo(3)獲得mapinfo窗口的標(biāo)識使其成為您自己應(yīng)用
程序的子窗口以便于實現(xiàn)兩者的交互在視類的頭文件中參與成員變量
unsignedlongm_windowid;HWNDm_windowhwnd;
在視類的實現(xiàn)文件中參與頭文件#include\在視類的構(gòu)造函數(shù)中初始化變量m_windowid=0;m_windowhwnd=0;
在視類的OnCreate函數(shù)中裝入一幅地圖并使地圖窗口變成應(yīng)用程序的子窗口獲得其窗口標(biāo)識及句柄SetWindowLong(m_hWnd,GWL_STYLE,
GetWindowLong(m_hWnd,GWL_STYLE)|WS_CLIPCHILDREN);charstr256;
mapinfo.Do(\sprintf(str,\1MapFromStates\mapinfo.Do(str);
m_windowid=atol(mapinfo.Eval(\sprintf(str,\m_windowhwnd=(HWND)atol(mapinfo.Eval(str));
在視類的OnDestroy方法中參與代碼在應(yīng)用程序終止時終止mapinfoif(m_windowhwnd)
::DestroyWindow(m_windowhwnd);m_windowhwnd=NULL;m_windowid=OL;
(4)實現(xiàn)mapinfo的基本功能
參與mapinfo菜單命令(以參與圖層控制為例)在應(yīng)用程序主菜單中添加新項layercontral在主框架類中為其添加一個方法在具體實現(xiàn)代碼中參與
mapinfo.RunMenuCommand(M_MAP_LAYER_CONTROL)
其中M_MAP_LAYER_CONTROL宏的具體值可在mapbasic.h中查到參與
mapinfo工具條與參與菜單命令類似在處理函數(shù)中參與
mapinfo.RunMenuCommand(menuid)menuid的值根據(jù)需要在mapbasic.h中查詢
(5)添加回調(diào)功能(增加WindowContentsChanged方法)當(dāng)mapinfo窗口發(fā)生改變時能夠告知VC++應(yīng)用程序相應(yīng)的改變應(yīng)用程序中的地圖子窗口在具有OLE自動化功能的文檔類構(gòu)造函數(shù)中參與mapinfo.SetCallback(this->GetIDispatch(FALSE));
在ClassWizard中選擇OLEAutomation標(biāo)簽選擇文檔類及AddMethod在方法名中添加\返回值類型為SCODE參數(shù)表為long|WindowID選擇確定并關(guān)閉對話框則在文檔類中添加一個新的方法WindowContentsChanged。
VC環(huán)境下基于GIS的GPS導(dǎo)航系統(tǒng)的開發(fā)
從空間定位技術(shù)出發(fā),在VC環(huán)境下,以MapX控件為圖形平臺,以MSComm控件為通信平臺,開發(fā)具有屬性查詢、空間分析等GIS基本功能的GPS導(dǎo)航信息系統(tǒng)。為用戶提供開發(fā)具有典型GIS功能的應(yīng)用軟件接口程序的基本方法MapInfo環(huán)境下矢量圖形坐標(biāo)校正的方法探討摘要:MapInfo以矢量形式管理空間數(shù)據(jù),但其軟件本身并沒有提供對矢量圖形進(jìn)行確切校正的方法,所以對由于圖形旋轉(zhuǎn)、扭曲而產(chǎn)生的誤差無法消除。文中介紹了一種在MapInfo環(huán)境下以Map",Basic為工具對矢量圖形進(jìn)行坐標(biāo)校正的方法。
Maplnfo是一個簡單易用、群眾化的GIS桌面軟件,它具有對
地理空間數(shù)據(jù)進(jìn)行存貯、管理、顯示、查詢、分析和制圖等基本的GIS功能,在國內(nèi)具有比較大的用戶群。但是,Maplnfo軟件只提供了柵格圖像的確切坐標(biāo)配準(zhǔn)(控制點個數(shù)3),即可以在圖上選取3個以上的控制點(已知其確切坐標(biāo)),通過計算對整幅圖像進(jìn)行坐標(biāo)配準(zhǔn)。而對于矢量圖形,Maphfo只提供了2個控制點的配準(zhǔn),這顯然是不夠確切的,例如對于圖形旋轉(zhuǎn)、扭曲產(chǎn)生的誤差就無法消除。本文提出了一種對Maplnfo中矢量圖形坐標(biāo)進(jìn)行校正的方法Maplnfo中進(jìn)行坐標(biāo)校正的算法設(shè)計在Maplnfo中,點、線、多邊形、區(qū)域等都作為地圖對象來處理,共有10種類型。在進(jìn)行坐標(biāo)校正時,先通過函數(shù)Objectlnfo()返回當(dāng)前對象的類型,然后分別對其進(jìn)行校正。進(jìn)行坐標(biāo)校正的具體步驟為:
(1)選取控制點。為了求解(1)式中的6個未知系數(shù)a1,a2,a3,b1,b2和b3,我們首先要在圖上找到至少3個不在同一直線上的已知控制點,用其圖上坐標(biāo)和對應(yīng)的實際坐標(biāo)組成6個方程求解,從而得到整幅圖的仿射變換系數(shù)。在一幅圖中,具體經(jīng)緯網(wǎng)點的理論坐標(biāo)可以經(jīng)計算或根據(jù)標(biāo)準(zhǔn)經(jīng)緯網(wǎng)求得,為此,經(jīng)緯網(wǎng)點往往作為校正用的控制點。其他如三角點、GPS控制點、公里網(wǎng)的交點等都可以通過坐標(biāo)表查得或通過實際的數(shù)學(xué)公式計算而得其實際坐標(biāo),因此這些點也可以作為控制點。另外,為了使校正后的圖形各處校正效果都比較好,選取的控制點必需比較均勻的分布在圖形各處,特別是邊界、四角要有控制點,以避免圖形校正不能滿幅。
(2)用選取的控制點的圖上坐標(biāo)和對應(yīng)的實際坐標(biāo)組成方程求解,
從而得到了整幅圖的仿射變換系數(shù)。為了提高精度,選取的控制點數(shù)應(yīng)大于三個,這時可以用最小二乘法來解方程。
(3)通過函數(shù)Objectlnfo()返回當(dāng)前對象的類型,對于不同的對象類型用不同的函數(shù)獲得當(dāng)前對象的定位點坐標(biāo)序列,并將其代入方程(1)求算出改正后的確切坐標(biāo),最終用AlterObject語句將該對象修改到正確位置。下面以點對象(OBJ-TYPE-POINT)為例介紹具體編程過程。
一對(X,Y)坐標(biāo)就表示一個點對象,所以可以用ObjectGeography()函數(shù)獲取點對象的X、Y坐標(biāo)(OBJ!GEO-POINTX、OBJ-GEO-POINTY),代入仿射變換公式,即可算出改正后的確切坐標(biāo)X1、Y1(即(1)式中的x,y),最終用AlterObject語句將該對象修改到正確位置。其部分程序為:SubPointChange(BuffObjAs0bject)",DimX1,Y1,X,YAsFloat
",X=ObiectGeography(Buffob,jOBJ_GEO_POINTX)",Y=ObjectGeography(Buffob,j0BJ_GEO_POINTY)",X1=a1*X+b1*Y+c1",Y1=a2*X+b2*Y+c2",Alter0bjectBuffobj
",",",GeographyOBJ_GEO_POINTX,X1",AlterObjectBuffobj
",",",GeographyOBJ_GEO_POINTY,Y1",EndSub
MapInfo在VC++中的集成及其鷹眼的實現(xiàn)VC++與MapInfo的集成過程
MapInfo集成二次開發(fā)的關(guān)鍵技術(shù)有兩點:一是MapInfo的OLE對象實例的創(chuàng)立;二是MapInfo功能在VC++環(huán)境下的本地化,利用MapInfoOLE服務(wù)器提供的方法實現(xiàn)GIS功能。在VC++環(huán)境下通過OLE控制MapInfo1使用MapInfo應(yīng)用對象的方法
MapBasic語句尋常需要在VC++環(huán)境中被調(diào)用,即從MapInfo中獲取信息或向MapInfo發(fā)布命令,此類方法的實現(xiàn)有以下幾種途徑:1)Do方法:使用這種方法向MapInfo發(fā)送特別的字符串命令。它對所有的MapBasic命令直接執(zhí)行,并且不返回任何參數(shù)。例如:讓MapInfo執(zhí)行MapBasic的開啟標(biāo)尺窗口,可以用下面的語句實現(xiàn):CStringstrCommand;
strCommand.Format(\(long)mhWnd);
mapinfo.Do(strCommand);
2)Eval方法:這種方法也同時對所有的MapBasic命令直接執(zhí)行,但它與Do方法的不同之處在于它返回參數(shù)狀況,即一個字符串。3)RunCommand方法:使用方法完全同Do方法,直接執(zhí)行嵌入的所有MapBasic支持的命令,不返回值。
4)RunMenuCommand方法:執(zhí)行定義好的標(biāo)準(zhǔn)命令。例如:mapinfo.RunMenuCommand(103)
集成MapInfo窗口
使用VC++應(yīng)用程序向?qū)?chuàng)立一個多文檔應(yīng)用程序并參與對OLE自動化對象的支持,創(chuàng)立支持MapInfo的類和該類的一個實例,啟動MapInfo。在OnCreate()函數(shù)中,對MapInfo的各個功能進(jìn)行設(shè)置。此外,要在視圖類的OnDestroy()函數(shù)中增加代碼,關(guān)閉Mapinfo窗口。最終MapInfo的窗口集成成功,程序運行結(jié)果會顯示出一個簡單的地圖界面。菜單欄功能的實現(xiàn)
在菜單欄中添加菜單命令并建立消息函數(shù),以實現(xiàn)菜單欄上的各個功能,這里以MapInfo的點選功能為例。在程序的主菜單中參與“工具〞菜單,并在該菜單中參與“選擇?〞由于在非標(biāo)準(zhǔn)客戶區(qū)的工具條上動態(tài)創(chuàng)立組合框控件存在一定的困難,本系統(tǒng)所采用的是在VC++資源視圖中為工具條添加一個空按鈕,然后通過CToolBar類的SetButtonInfo()函數(shù)來對此空白按鈕進(jìn)行設(shè)置,然后再通過CToolBar類的GetItemRect()函數(shù)得到經(jīng)過修改后的按鈕區(qū)域坐標(biāo),從而指定在工具條的什么地方創(chuàng)立一個多大的組合框。經(jīng)過這些準(zhǔn)備工作后,工具欄的功能即可通過CComboBox類的Create()函數(shù)動態(tài)完成。鷹眼的實現(xiàn)
鷹眼的實現(xiàn)是回調(diào)技術(shù)在MapInfo二次開發(fā)中的一個重要應(yīng)用,它也是MapInfo二次開發(fā)的一個技術(shù)難點。首先需要創(chuàng)立一個鷹眼圖層:mapinfo2.Do(\MapLayer鷹眼\);然后再在CmainFrame中
建立ChangeEye()函數(shù),實現(xiàn)主圖變化時,鷹眼同步變化的功能:strCommand.Format(\CStringstrTmp;
strTmp.Format(\dX2,dY2);
strCommand+=strTmp;
strCommand+=\BrushMakeBrush(1,0,0)\mapinfo2.Do(strCommand);
最終也是關(guān)鍵的一步就是建立回調(diào),需要在CmainFrame.cpp和CmainFrame.h中添加聲明:
BEGINDISPATCHMAP(CMainFrame,CMDIFrameWnd)//{{AFXDISPATCHMAP(CMainFrame)//}}AFXDISPATCHMAPENDDISPATCHMAP()
在CmainFrame類(.cpp)中調(diào)用ChangeEye():
SCODECMainFrame::WindowContentsChanged(longlWindowId){
ChangeEye();returnSOK;}
至此,鷹眼的功能就實現(xiàn)了VC環(huán)境下基于GIS的GPS導(dǎo)航系統(tǒng)的開
發(fā)在VC環(huán)境下,以MapX控件為圖形平臺,以MSComm控件為通信平臺,開發(fā)具有屬性查詢、空間分析等GIS基本功能的GPS導(dǎo)航信息系統(tǒng)。為用戶提供開發(fā)具有典型GIS功能的應(yīng)用軟件接口程序的基本方法以VC為開發(fā)平臺,以MapX控件為圖形平臺,以MSComm控件為通信平臺,開發(fā)研制具有GPS導(dǎo)航、屬性查詢、地理分析、最優(yōu)路徑分析等基本功能的GIS應(yīng)用軟件的技術(shù)。
MSComm控件是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控件,它可為應(yīng)用程序提供簡便的串行通信功能,通過串行接口收發(fā)數(shù)據(jù)。在VC等可視化開發(fā)環(huán)境中,只需在設(shè)計階段將MapX、MSComm控件插入到窗體中,并對其進(jìn)行編程",",設(shè)置屬性、調(diào)用方法或響應(yīng)事件,從GPS接收機(jī)獲取導(dǎo)航數(shù)據(jù)后即可實現(xiàn)GPS數(shù)據(jù)地圖化、地圖數(shù)據(jù)可視化及屬性查詢、地理分析、最優(yōu)路徑分析等豐富的地理信息系統(tǒng)功能。2",應(yīng)用框架程序的生成
利用VC??環(huán)境下的應(yīng)用程序框架生成向?qū)?AppWizard?,可以快速生成基于MFC的應(yīng)用程序,編譯并運行該程序就可以見到標(biāo)準(zhǔn)的Windows應(yīng)用程序界面。一般狀況下對程序界面應(yīng)進(jìn)行再設(shè)計,包括菜單設(shè)計、工具欄設(shè)計、狀態(tài)欄設(shè)計、對話框設(shè)計、加速鍵設(shè)計等,讓用戶使用更加便利。在菜單中點擊Project/AddToProject/Compo",nentsandControls,然后選擇RegisteredActiveXCon",trols文件夾下的!MapInfoMapXV3?項并按下Insert按鈕,或在菜單中點擊Project/AddToProject/Files,添加MapInfo
MapX3.5/Samples30/Cpp文件夾中的MapX.cpp和MapX.h文件。這兩種方法都可將MapX控件支持類庫添加到本項目中,并且前一種方法將在對話框編輯器的工具欄中出現(xiàn)MapX控件圖標(biāo)。同樣,選擇RegisteredActiveXControls文件夾下的!MicrosoftCommunicationsControl?項并按下Insert按鈕,將MSComm控件參與到本項目中,此時將生成一個名為CMSComm的C??類,并且在對話框編輯器的工具欄中將出現(xiàn)MSComm控件圖標(biāo)。MapX、MSComm控件支持類是由MapX、MSComm控件導(dǎo)出的一系列接口函數(shù)構(gòu)成的,利用它們可以訪問MapX、MSComm控件的屬性(Property)和方法(Method)。開啟資源編輯器,在程序主對話框(本例假設(shè)資源ID為IDD_NAVIGATION_DIALOG,所對應(yīng)的類為CNavDialog類)上面放置一個MapX控件,并用ClassWizard為該對話框類添加對應(yīng)當(dāng)控件的成員變量m_ctrlMapX;同理,在程序主對話框上面放置一個MSComm控件,并用ClassWizard為該對話框類添加對應(yīng)當(dāng)控件的成員變量m_ctrlCMS。GPS導(dǎo)航數(shù)據(jù)的獲取將GPS接收機(jī)(本例所用的是可用于單機(jī)導(dǎo)航或?qū)崟r差分導(dǎo)航的GPSOEM板)與計算機(jī)通過串行口相連接,可以實現(xiàn)GPS導(dǎo)航數(shù)據(jù)的實時接收和傳輸。串行口的參數(shù)設(shè)置既可以在對話框編輯器里設(shè)定,也可以在程序代碼中通過調(diào)用CM",SComm類的成員函數(shù)設(shè)定。例如,我們可以在CNavDialog類的OnInitDialog成員函數(shù)中初始化MSComm控件的參數(shù)。MSComm控件共有27個屬性,以下是VC中MSComm控件的幾個相關(guān)屬性值的設(shè)置狀況:m_ctrlCMS.SetCommPort(1);//指定串口號m_ctrlCMS.
SetSettings(?9600,N,8,1?);//設(shè)置通信參數(shù)
m_ctrlCMS.SetRThreshold(1);//產(chǎn)生OnComm事件之前要接收的字符數(shù)
m_ctrlCMS.SetInputMode(1);//設(shè)置數(shù)據(jù)獲取方式if(!m_ctrlCMS.GetPortOpen())
m_ctrlCMS.SetPortOpen(TRUE);//開啟通信串口m_ctrlCMS.SetInputLen(0);...
其它屬性可以依照缺省值設(shè)置或者根據(jù)具體設(shè)備的要求進(jìn)行設(shè)置。同時應(yīng)注意將GPS接收機(jī)的輸出設(shè)置成NMEA0183格式。假使需要通過多個串行口與多臺設(shè)備通信,那么每一個串行口對應(yīng)于一個單獨的MSComm控件。接下來為程序主對話框建立響應(yīng)MSComm事件的處理函數(shù),每當(dāng)MSComm控件觸發(fā)事件時,該函數(shù)將被調(diào)用。用鼠標(biāo)左鍵雙擊MSComm控件圖標(biāo),在彈出的對話框中輸入函數(shù)名OnCommMym",scomm,該事件處理函數(shù)的原型定義和消息映射入口將自動被添加到CNavDialog類中,我們所要做的只是在OnCommMymscomm函數(shù)中給出具體的數(shù)據(jù)處理程序段。獲取位置信息GGA的主要代碼例如如下(其中strdata定義為CString類的全局變量,經(jīng)度Longitude、緯度Latitude定義為double型的全局變量):
VARIANTvResponse;
char*str;
intk,nEvent,length;CStringstrhead;
nEvent=m_ctrlCMS.GetCommEvent();switch(nEvent){
case2://收到大于RTHresshold個字符
k=m_ctrlCMS.GetInBufferCount();//接收到的字符數(shù)目if(k>0){
vResponse=m_ctrlCMS.GetInput();str=(char*)(unsignedchar*)vRe",sponse.parray->pvData;}
...//對數(shù)據(jù)進(jìn)行其它處理,以獲得完整的NMEA0183數(shù)據(jù)信息字符串
strdata=(constchar*)str;break;
case3://CTS線狀態(tài)發(fā)生了變化...}
length=strdata.GetLength();
strhead=strdata.Mid(0,6);
if(strhead==?$GPGGA?//該函數(shù)實現(xiàn)導(dǎo)航載體在電子地圖上的顯示、運動}
GPS導(dǎo)航數(shù)據(jù)的顯示
GPS接收機(jī)的所有數(shù)據(jù)都可以在對話框中顯示出來,并且通過對這些數(shù)據(jù)的特定處理可以滿足用戶特定的要求,例如本例中要求依據(jù)導(dǎo)航點的經(jīng)、緯度實時計算出該點的垂線偏差等量值。但是用戶有時更希望在地圖上看到當(dāng)前位置信息,這就產(chǎn)生了一個導(dǎo)航數(shù)據(jù)地圖化的問題。導(dǎo)航載體在電子地圖上顯示及運動的主要代碼如下(NewSbl、OldSbl定義為CmapXFeature類對象,step定義為int型變量,均為全局變量):
voidCNavDialog::NaviStream(){
CMapXLayerAnLay;
//以下對有關(guān)圖層和導(dǎo)航載體運動符號進(jìn)行設(shè)置...
AnLay=m_ctrlMapX.GetLayers().Item(?NavMap?);
AnLay.GetStyle().SetSymbolBitmapSize(12);NewSbl.Attach(m_ctrlMapX.GetDispatch());NewSbl.SetStyle(m_ctrlMapX.GetDefaultStyle());...
//在圖上顯示載體運動,其中Longitude、Latitude以度為單位
NewSbl.GetPoint().Set(Longitude,Lati",tude);if(step!=0)
AnLay.DeleteFeature(OldSbl);step++;
OldSbl=AnLay.AddFeature(NewSbl);...
m_ctrlMapX.Refresh();UpdateData(FALSE);UpdateWindow();}
基于C#的GIS校園電子地圖實現(xiàn)姜拓
根據(jù)校園規(guī)劃地圖,結(jié)合校園信息特點,利用MapInfo構(gòu)建地圖數(shù)據(jù),并將不同的數(shù)據(jù)圖層通過GeosetManager整合集成,在.NET編程環(huán)境下通過C#語言對MapX控件的二次開發(fā)而實現(xiàn)的校園電子地圖系統(tǒng)。系統(tǒng)除了具備地圖縮放、漫游等功能外,還實現(xiàn)了鷹眼、測距、圖元與屬性之間互查與定位功能。文中給出了主要
功能的開發(fā)過程及核心代碼。.4.1電子地圖基本功能
電子地圖基本功能包括放大、縮小、漫游等,MapX控件已經(jīng)集成了這些工具,因此編程時C#只需要簡單調(diào)用這些工具即可,具體代碼如下:
privatevoidtoolStripButton1_Click(objectsender,EventArgse){
axMap2.CurrentTool=MapXLib.ToolConstants.mi-ZoomInTool;//放大工具}
實現(xiàn)鷹眼圖的思路為:首先在窗體上放兩個MapX控件,分別為主圖和鷹眼圖,然后在鷹眼圖上創(chuàng)立一個圖層,并在其上添加一個矩形框,該矩形的大小隨主圖邊界而變化。C#實現(xiàn)鷹眼圖的代碼如下:privatevoidaxMap2_MapViewChanged(objectsender,EventArgse){
MapXLib.FeaturetempFea;
//聲明一個圖元,用于鷹眼圖中創(chuàng)立的矩形框MapXLib.PointstempPoints=newPoints();MapXLib.StyletempStyle=newStyle();MapXLib.PointptMap_1=newMapXLib.Point();
MapXLib.PointptMap_2=newMapXLib.Point();MapXLib.PointptMap_3=newMapXLib.Point();MapXLib.PointptMap_4=newMapXLib.Point();//設(shè)置矩形框四角坐標(biāo)為主圖邊框
ptMap_1.Set(axMap2.CtlBounds.XMin,axMap2.CtlBounds.YMin);ptMap_2.Set(axMap2.CtlBounds.XMax,axMap2.CtlBounds.YMin);ptMap_3.Set(axMap2.CtlBounds.XMax,axMap2.CtlBounds.YMax);ptMap_4.Set(axMap2.CtlBounds.XMin,axMap2.CtlBounds.YMax);//添加點到點集
tempPoints.Add(ptMap_1,1);tempPoints.Add(ptMap_2,2);tempPoints.Add(ptMap_3,3);tempPoints.Add(ptMap_4,4);
//////////////以下創(chuàng)立臨時圖層/////////////////////////MapXLib.LayerInfotempLayerInfo=newMapXLib.LayerInfoClass();
MapXLib.Fieldsflds=newMapXLib.FieldsClass();flds.AddStringField(\tempLayerInfo.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTemp;
tempLayerInfo.AddParameter(\tempLayerInfo.AddParameter(\
m_layer_Eagle=axMap1.Layers.Add(tempLayerInfo,1);//為鷹眼圖添加圖層
//////////////以上創(chuàng)立臨時圖層////////////////////////////以下設(shè)置邊框樣式tempStyle.RegionPattern
FillPatternConstants.miPatternNoFill;
tempStyle.RegionBorderColor=(uint)MapXLib.ColorConstants.miColorBlue;tempStyle.RegionBorderWidth=2;
//以下在臨時圖層添加大小為axMapx2的邊界的//Rectangle對象try{
tempFea=axMap1.FeatureFactory.CreateRegion(temp-Points,tempStyle);//創(chuàng)立矩形框
m_feature_Eagle=axMap1.Layers._Item(\AddFeature(tempFea,newMapXLib.RowValuesClass());//添加邊框到鷹眼圖}
catch(System.Exceptionex){
MessageBox.Show(ex.ToString());
=
}}
以下為鷹眼圖導(dǎo)航功能的實現(xiàn)代碼:
privatevoidaxMap1_MouseDownEvent(objectsender,AxMapXLib.CMapXEvents_MouseDownEvente){
doubleMapX=0.0;doubleMapY=0.0;
axMap1.ConvertCoord(refe.x,refe.y,refMapX,refMapY,MapXLib.ConversionConstants.miScreenToMap);//將屏幕坐標(biāo)轉(zhuǎn)換為地圖坐標(biāo)axMap2.CenterX=MapX;//將地圖坐標(biāo)付給主視圖axMap2.CenterY=MapY;}
2.4.3圖元查找及定位功能
首先,根據(jù)comboBox1選擇圖層,然后將該圖層“Name〞字段的值綁定到treeView1,雙擊treeView1中想要查找的圖元,則在主圖中心位置就會顯示要查找的圖元,并且將圖元其他信息顯示在主圖下方label中。主圖中定位目標(biāo)圖元主要代碼如下:
//查找定位Name字段為node.text的圖元,node.text為//treeView1雙擊查找的圖元
stringstr=\//\為圖層的一個字段
stringlayer_name=comboBox1.SelectedItem.ToString()
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度農(nóng)業(yè)技術(shù)合作免責(zé)責(zé)任書4篇
- 通信協(xié)議基礎(chǔ)課程設(shè)計
- 年度掘進(jìn)機(jī)市場分析及競爭策略分析報告
- 2024裝飾工程監(jiān)工質(zhì)量保障合同模板版
- 二零二五版電子商務(wù)平臺合作協(xié)議補充協(xié)議3篇
- 2025年度高品質(zhì)社區(qū)門窗安裝與物業(yè)綜合服務(wù)協(xié)議3篇
- 2025年度綜合能源服務(wù)項目承包工程合同范本4篇
- 2024投資融資咨詢服務(wù)合同范本兩
- 扶壁碼頭胸墻施工方案
- 汀步的施工方案
- 2025年病案編碼員資格證試題庫(含答案)
- 企業(yè)財務(wù)三年戰(zhàn)略規(guī)劃
- 提高膿毒性休克患者1h集束化措施落實率
- 山東省濟(jì)南市天橋區(qū)2024-2025學(xué)年八年級數(shù)學(xué)上學(xué)期期中考試試題
- 主播mcn合同模板
- 新疆2024年中考數(shù)學(xué)試卷(含答案)
- 2024測繪個人年終工作總結(jié)
- DB11 637-2015 房屋結(jié)構(gòu)綜合安全性鑒定標(biāo)準(zhǔn)
- 制造業(yè)生產(chǎn)流程作業(yè)指導(dǎo)書
- DB34∕T 4444-2023 企業(yè)信息化系統(tǒng)上云評估服務(wù)規(guī)范
- 福建中閩能源股份有限公司招聘筆試題庫2024
評論
0/150
提交評論