Mapx的VC开发实践
生活随笔
收集整理的這篇文章主要介紹了
Mapx的VC开发实践
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?? 摘? 要? 闡述了在VC環(huán)境下引入MapX控件的方法,以及在文檔視圖架構(gòu)下如何使用MapX控件的問題,介紹了MapX數(shù)據(jù)綁定的方法及其與MapX專題圖創(chuàng)建的關(guān)系,闡明了創(chuàng)建MapX專題圖的一般方法,并給出了具體實例。 ??? 關(guān)鍵詞? MapX;VC程序設(shè)計;專題圖制作
圖1 中國各省(區(qū)、市)人口密度專題圖
1 引言
MapInfo MapX是一個用來做地圖化工作的OCX控件,它可以很容易地在您的應(yīng)用程序中加入強大的制圖功能。它可以把您的數(shù)據(jù)用地圖的形式顯示出來,更易于理解。地圖形式可以比簡單的圖表、圖形提供更多的信息,而且描述地圖比描述數(shù)據(jù)表更加簡單迅速。 專題圖是按照特定專題渲染地圖的過程,以圖形的形式在地圖上表示數(shù)據(jù)。通常使用數(shù)據(jù)集中的一組或多組數(shù)據(jù),利用顏色渲染、填充圖案、符號、直方和餅圖等方式表示數(shù)據(jù)。根據(jù)數(shù)據(jù)中的特定值指派這些顏色、圖案或符號,創(chuàng)建不同的專題地圖。 微軟的Visual C++6.0技術(shù)成熟、應(yīng)用廣泛、影響巨大,在應(yīng)用軟件的開發(fā)方面是首選的開發(fā)環(huán)境之一。而MapX編程的教程通常是以VB為基礎(chǔ)的。利用VC編譯MapX程序比利用VC編寫MapX程序要相對復(fù)雜一些,兼容性也要差一點。因此利用VC編寫MapX程序的可供參考的教程和示例代碼相對較少。但因為大量的應(yīng)用軟件采用VC編寫、大量的軟件公司采用VC作為開發(fā)工具,因此在VC環(huán)境中引入MapX控件進行MapX功能開發(fā)就非常重要。本文的目的在于具體闡述VC環(huán)境下基于MapX控件創(chuàng)建專題地圖的方法。2 VC下MapX開發(fā)環(huán)境的建立
2.1 MapX控件的引入
要在VC下使用MapX的各個功能來編寫程序,首先必須要確保MapX控件已經(jīng)在系統(tǒng)中安裝并注冊。在 MapX Web 站點 <http://www.mapx.com> 上找到最新的示例應(yīng)用程序。該示例應(yīng)用程序的源代碼文件夾中包含MapX.h和MapX.cpp兩個文件,這兩個文件實際上分別就是MapX控件的類層次定義文件和COM接口實現(xiàn)文件。把這兩個文件拷貝到應(yīng)用程序所在的文件夾。或者將MapX安裝目錄下“\MapInfo\MapX 5.0\Samples50\C++\Cpp”文件夾下的MAPX.H和MAPX.CPP文件,拷貝到VC應(yīng)用程序的工程目錄下。然后再在VC++6.0集成開發(fā)環(huán)境的“Project”菜單中點擊“Add To Project”→“Files”,彈出“Insert File Into Project”對話框。在文件列表框中列出了項目中的文件。按住“Control”鍵的同時選中MapX.h和MapX.cpp兩個文件,然后點擊對話框中的“OK”按鈕,完成MapX控件的插入。2.2 Doc/View下MapX控件的使用
MAPX是一個窗口控件,要想在Doc/View中使用就必須動態(tài)創(chuàng)建,一般遵從這樣的步驟: (1)添加資源ID,需要在工程的資源視圖下的String Table下增加一個ID。 (2) 添加MAPX控件頭文件的引用,可以直接把MAPX頭文件的引用添加到工程的StdAfx.h文件中,這樣就不必在其他的很多文件中添加這個引用了。 (3)聲明CMapX類型變量,在視圖類中寫入形如CMapX? m_ctrlMapX的聲明。 (4)使用MAPX的Creat方法,在工程中視圖類創(chuàng)建的時候創(chuàng)建MAPX控件,其代碼為: int C**View::OnCreate(LPCREATESTRUCT lpCreateStruct) // (視圖類的WM_CREATE消息響應(yīng)函數(shù)) { if (CView::OnCreate(lpCreateStruct) == -1)?? return -1; RECT windRect; GetClientRect(&windRect); //取得視圖區(qū)域? if (!m_ctrlMapX.Create(NULL, WS_VISIBLE, windRect, this,IDS_MAPX1))????? ?return -1; //以當(dāng)前視圖窗口為父窗口,以IDS_MAPX1為標(biāo)識,創(chuàng)建一個可見的、無窗口名稱的、 //覆蓋整個視圖區(qū)域的MAPX控件窗口。 return 0; } (5)設(shè)定控件的初始狀態(tài), 如果簡單的創(chuàng)建了MAPX控件在顯示的時候會顯示美國的地圖,這樣就需要在視圖出現(xiàn)前改變MAPX的基本設(shè)置,改變默認地圖以及改變地圖中心、縮放率、是否可編輯、是否可選擇以及添加一些新圖層等操作。 (6)添加MAPX控件的事件響應(yīng)。給動態(tài)生成的MAPX控件添加事件需要槽事件處理宏來處理消息映射。首先要在視圖類的頭文件H文件中聲明宏DECLARE_EVENTSINK_ MAP();然后在視圖類的CPP文件中加入MapX事件處理函數(shù)映射宏 BEGIN_EVENTSINK_MAP(CHWDView, CView) //CPP文件中消息映射 END_EVENTSINK_MAP() 其中BEGIN_EVENTSINK_MAP帶有兩個參數(shù),第一個參數(shù)當(dāng)前類、第二個參數(shù)是當(dāng)前類的基類。BEGIN_ EVENTSINK_MAP和END_EVENTSINK_MAP()是一對定義事件映射的宏,其間可以插入自定義的MapX控件消息映射。3 基于MapX創(chuàng)建專題圖
3.1 數(shù)據(jù)綁定與專題地圖
數(shù)據(jù)綁定是將數(shù)據(jù)源中的數(shù)據(jù)導(dǎo)入 MapX 的過程。為了增強GIS系統(tǒng)數(shù)據(jù)處理的靈活性,系統(tǒng)分開存儲涉及的圖形矢量數(shù)據(jù)及空間屬性數(shù)據(jù)。MapX通過數(shù)據(jù)集集合(Datasets)對象,可以將用戶的屬性數(shù)據(jù)與地圖的空間數(shù)據(jù)連接起來,屬性數(shù)據(jù)與幾何數(shù)據(jù)的關(guān)聯(lián)是通過數(shù)據(jù)綁定實現(xiàn)的。數(shù)據(jù)綁定的數(shù)據(jù)源可以是ODBC數(shù)據(jù)源、MapInfo Table文件、安全數(shù)組等。要綁定一個數(shù)據(jù)源,首先要指定所綁定的圖層,然后需要指定與圖層中地圖對象相匹配的關(guān)鍵字段。將自己的數(shù)據(jù)綁定到地圖上主要有以下兩個優(yōu)點:一是可以將數(shù)據(jù)作為地圖上的圖元查看;二是可以將屬性數(shù)據(jù)綁定到地圖上,然后使用該綁定創(chuàng)建基于數(shù)據(jù)的專題地圖。 數(shù)據(jù)綁定的實現(xiàn)是通過Datasets.Add方法實現(xiàn)的。DataSets.add方法原型為DataSets.Add (Type, SourceData, [Name], [Geofield], [SecondaryGeofield], [BindLayer], [Fields], [Dynamic])。對大多數(shù)數(shù)據(jù)綁定類型, SourceData其實是一種OLE接口。MapX通過這個接口直接從數(shù)據(jù)源中訪問數(shù)據(jù),數(shù)據(jù)并沒有真正傳遞給DataSets.Add。 當(dāng)綁定時數(shù)據(jù)包含經(jīng)度和緯度,且要在新的圖層相應(yīng)的位置上創(chuàng)建這些點時需使用BindLayer 對象。通過數(shù)據(jù)綁定,可以將BindLayer對象作為一個參數(shù),使用Datasets.Add方法將自己的數(shù)據(jù)轉(zhuǎn)變?yōu)橐粋€DataSet。 在 MapX中有Field對象和Fields對象。在數(shù)據(jù)綁定時,MapX 對綁定的每個數(shù)據(jù)列均需要開銷,通過Field對象和Fields對象只綁定地圖中需要的數(shù)據(jù)。使用Datasets.Add 的Fields 參數(shù)建立要綁定到地圖上的字段。字段集合對象的Add方法的原型為[Field=]OBJECT.Add (DataSourceCol, [Name], [AggregateFunction], [Type])? // DataSourceCol取值為數(shù)據(jù)源中字段名或索引值。 數(shù)據(jù)綁定事件:一旦數(shù)據(jù)源的某列被定義為地理列,并且確定了綁定數(shù)據(jù)的圖層,則綁定就開始進行。數(shù)據(jù)源的每一行都和一個圖元相匹配且數(shù)據(jù)將會帶入地圖。如果某行有不匹配發(fā)生,則DataMismatch事件被激活。當(dāng)數(shù)據(jù)源發(fā)生變化時,MapX通過調(diào)用DataSet.Refresh來刷新數(shù)據(jù)。但數(shù)據(jù)源有新行時,此方法并不添加新圖元。3.2 專題地圖的制作
MapX中使用Themes集合與Theme對象來實現(xiàn)對專題圖的支持,每個Themes集合中可以包含多個Theme對象,也就是說,針對一個Dataset,可以創(chuàng)建多幅不同的專題地圖。每個Dataset都擁有一個Themes集合,并以其屬性的形式存在,即Dataset.Themes。使用Themes的Add、Remove、RemoveAll等方法可以控制專題的添加和刪除。 在創(chuàng)建專題圖的過程中,有幾個關(guān)鍵因素,包括專題圖變量的確定、屬性數(shù)據(jù)的獲取以及專題圖層的顯示與控制。 在進行專題圖規(guī)劃時,首先要確定專題圖變量。在專題圖中顯示的數(shù)據(jù)就是專題圖變量。一個專題變量可以是一個字段或表達式。取決于專題圖的類型,在一張地圖上可以顯示一個或多個專題圖變量。范圍值、等級符號、點密度和獨立值地圖都只檢查一個變量。可以利用餅圖或直方圖一次顯示多個專題變量。也可以創(chuàng)建雙變量專題地圖,其中一個地圖對象可代表兩個不同的數(shù)據(jù),用符號的顏色代表一個專題變量,符號的大小代表另一個專題變量。 在創(chuàng)建專題地圖之前,必須確定需要顯示何種信息,信息存儲在什么位置。它可以在創(chuàng)建地圖時所基于的表中,也可以在ODBC支持的外部數(shù)據(jù)庫中。數(shù)據(jù)來源于Field對象或Field集合,在Themes.Add方法中通過Fields參數(shù)傳遞。 具體在創(chuàng)建專題圖時,首先應(yīng)將某個產(chǎn)生專題圖數(shù)據(jù)的dataset通過數(shù)據(jù)綁定引入地圖中,之后使用Themes.Add方法創(chuàng)建一個Theme對象。代碼為:curmap.Datasets(1).Themes. Add(miThemeRanges,‘TotPop’,‘’),函數(shù)的語法為Themes. Add([Type], [Field], [Name])。Type用于定義要創(chuàng)建的專題圖的類型,它的取值范圍是ThemeTypeConstants,該參數(shù)可選,如果沒有定義或者定義為 miThemeAuto,MapX會根據(jù)字段數(shù)以及已經(jīng)存在的專題圖類型自動在ThemeTypeConstants中選擇一個。如果MapX無法自行確定專題類型,就會產(chǎn)生一個錯誤。Field(s)定義在專題圖中使用的一個或多個字段,可以通過字段名、字段索引或字段對象來引用。當(dāng)創(chuàng)建多變量專題圖時,可以使用數(shù)組表示。該字段是可選的,若不特意指定,MapX會使用DataSet中的第一個數(shù)字型字段。Name,即專題圖的名稱,String類型參數(shù),若不指定,MapX會自動生成一個名字。 專題圖創(chuàng)建好后,有兩種方法可以控制專題地圖。一是使用Theme.ThemeDlg方法。該方法顯示一個對話框,用戶可以直接修改專題圖特性。語句如下為curmap.Datasets(1).Themes(1).ThemeDlg;這種方法雖然簡單,但是很難與自己的程序風(fēng)格相一致,用戶界面不友好,而且在這個默認的對話框中,用戶可以隨意改變?nèi)魏卧O(shè)置,使得程序的控制難度加大。二是改變ThemeProperties對象屬性。通過設(shè)置ThemeProperties對象屬性,可以使用自己定制的界面,給用戶有限的修改能力,實現(xiàn)起來也非常簡單,而且對用戶的操作有全部的控制權(quán)。ThemeProperties對象是Themes集合中的一員,主要用于定義專題地圖的顯示,包括顏色、符號等。ThemeProperties對象的屬性中有許多又屬于其他對象,如RangeCategory、Individualvalue、Style等,可進行更深層次的設(shè)定。3.3 專題圖實例
圖1是以中國各省(區(qū)、市)的人口密度為專題圖變量繪制的范圍專題圖。從圖1中可以看出,我國西北地區(qū)人口密度最小,東南區(qū)域人口密度相對較大;江蘇、臺灣、河南、山東人口密度較大,西藏人口密度最小。圖1 中國各省(區(qū)、市)人口密度專題圖
4 結(jié)束語
使用專題渲染在地圖上顯示數(shù)據(jù)時,可以清晰地展現(xiàn)在數(shù)據(jù)列表中幾乎無法顯現(xiàn)的樣式和趨勢,為用戶的決策支持提供依據(jù)。本文實現(xiàn)了VC環(huán)境下基于MapX控件創(chuàng)建專題圖,為在VC環(huán)境下開發(fā)MapX程序做了初步探索和有益啟示。轉(zhuǎn)載于:https://www.cnblogs.com/kenter/archive/2010/12/28/1919150.html
總結(jié)
以上是生活随笔為你收集整理的Mapx的VC开发实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入浅出SharePoint2010——
- 下一篇: 转:JNI jstring与c++字符串