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