程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#進行MapX二次開發之MapX基礎知識

C#進行MapX二次開發之MapX基礎知識

編輯:關於C#

MapX的主要技術特點

(1)、以表(Table)的形式組織信息

每一個表都是一組MapInfo文件,這些文件組成了地圖文件和數據庫文件。為使用MapInfo,就需要有組成表的用戶數據和地圖文件。這些文件可以來自MapInfo或者由用戶創建。用戶要想在MapInfo中工作,就必須打開一個或多個表。

MapInfo通過表的形式將數據與地圖有機地結合在一起。當用戶在MapInfo中打開數據文件時,MapInfo將創建一個表。這個表至少由兩個獨立的文件組成,一個是包含數據結構的文件,另一個是包含原始數據的文件。一個典型的MapInfo表將主要由*.tab、*.dat、*.wks、*.dbf、*.xls、*.map、*.id、*.ind文件格式組成。

(2)、圖形對象

MapInfo內置的數據庫管理系統是一種關系型數據庫管理系統,也是用二維表組織數據。與其它關系型數據庫不同的是表結構中除可包含常用類型的屬性列外,還引入一個圖形對象列(OBJ列),用於存儲圖形對象(如線、區域等)。MapInfo提供許多圖形對象的操作接口,利用這些接口可以生成和處理所需要的各種圖形。

(3)、地圖圖層化

MapInfo是按圖層組織計算機地圖的。也就是說,將一幅計算機地圖加工成多個層層疊加的透明層,這個透明層就稱為圖層。每個圖層包含了整個地圖的一個不同方面。例如,第一個圖層包含省邊界,第二個圖層表示省府的符號,第三個圖層由標注文本組成,把它們層層疊加就形成一幅完整的地圖。在創建每一個圖層時,都要為其建立一張表,MapInfo就是通過這種方式使表與地圖之間建立了聯系。

也就是說,MapInfo是以表的形式來進行管理的,每個表一般包含兩部份:地圖部分和數據庫(屬性)部份。

(4)、專題地圖

提供多種數據可視化的專題地圖,能將數據庫中的信息進行直觀的可視化分析。使用專題渲染在地圖上顯示數據時,可以清楚地看出在數據記錄中難以發現的模式或趨勢,為用戶的決策提供依據。專題地圖包括范圍值、點密度、柱狀圖、等級符號、餅圖和獨立值六種形式。

(5)、內置ODBC

MapInfo內置ODBC,支持各種關系型數據庫,支持SQL查詢,從而保證了對原有數據庫的沿用和對遠程數據庫地訪問。具備空間查詢的功能擴展(如緩沖區、疊加等),采用數據倉庫的最新技術OLAP(Online Analytical Processing)的聯機事物處理,對於應用程序實現圖形查詢和表查詢提供了強大的手段。

(6)、支持多種數據格式及其轉換

MapInfo既支持數字化儀的圖形輸入方式,直接生成矢量圖,也支持目前市場上流行的圖形圖象格式。可接受AutoCAD的DWG、DXF標准文件格式,還可通過MIF及MID文件與其它軟件建立數據的接口。其中MIF文件內保存有圖形信息,MID文件內保存有圖形的屬性信息。MIF及MID文件通過MapInfo的菜單命令Import和Export來輸入和產生。

(7)、二次開發工具MapBasic

作為一個系統軟件,MapInfo提供了可以將其所有的功能用程序來驅動的方法,內置標准的二次開發工具——MapBasic。MapBasic不僅與大眾化的Basic語法相一致,具有基本一致的常用函數集(計算、字符串處理、文件I/O、DLL調用等),而且利用MapBasic語言所提供的函數、過程和語句命令可以完成許多有關圖形對象管理的復雜操作和運算。它的真正優勢在於對MapInfo中的Table及其圖形對象的管理所提供的特性和強大功能。采用面向對象及事件驅動編程

(8)、集成二次開發能力

具有OLE和OLE Automation功能,可以方便地使用Delphi、VB、VC等多種開發工具,保證了新的應用程序與原有的應用界面保持一致,為日後的深層開發提供一個擴展空間。

MapX的組件模型結構

MapX組件的基本組成單元是Object(單個對象)和Collection(集合)。其中集合包括對象,是多個對象的組合。每種對象和集合負責處理地圖某一方面的功能。

由圖4.4可以看出,位於頂層的是Map對象本身,其它均由Map對象繼承。Layers、DataSets、Annotations是Map對象下面的三個重要的分支。其中Layer主要用於操作地圖的圖層,DataSet用於訪問空間數據表,Annotation用於在地圖上增加文本或者符號。

每個Map對象主要包括Datasets、Layers、Annotations三個對象集合。

Map對象有一些主要的屬性,如Zoom用來設置放大級別(在地圖上顯示的大小),Rotation控制地圖的旋轉角度,CenterX和CenterY用於設置x和y的坐標系,這要取決於地圖的投影。

Map對象的許多屬性本身又是一個對象,比如說一幅地圖由多個圖層組成,則在一個Map對象中存在一個單獨的layers集合,其中包含所有圖層的信息。

Layers

在MapX中,每張單獨的地圖都被表示成單獨的一個圖層,所有的圖層存儲在layers集合中。Layers集合由Layer對象組成,按順序編號為0到n。Layer對象由features對象組成,features對象又是由Feature對象組成,對應於地圖中的點、線、區域或符號。

最上面一層為Layers(1),Layers(2)位於Layers(1)的下面,以次類推。最下面的圖層最先繪制,最上面的圖層最後繪制。在應用程序中,合理地安排好每層在Layers中的順序是至關重要的。比如說有兩個圖層,一層為點,一層為區域,則應將點層放到區域層的上方,否則區域會將點覆蓋。

另外,在進行地圖選擇操作時,根據要求調整圖層的順序也是十分重要的。MapX中的選擇工具總是從可選擇圖層中的最上層開始選擇,如果在地圖上的同一位置存在多個位於不同層的地圖對象,其結果是很難精確地選擇到目標對象。因此,最好將被選擇圖層提到最上層顯示。

GeoSets

GeoSet是在GeoManager中建立好的.GST文件,類似MapInfo中的WorkSpace概念,是圖層及其設置的集合,控制程序中顯示的地圖。也可以在運行階段設置GeoSet,此時將導致已經加載的所有圖層和DataSet被刪除而由GeoSet中定義的圖層所代替。如果單純地想刪除所有圖層,只需給GeoSet賦一個空字符串即可。

可以使用GeoSet Manager程序來管理GeoSet 文件(*.GST)。默認情況下.GST文件存儲在…\\mapx\maps目錄下,可以調用GeoDictionary Manager程序進行修改,指向用戶程序數據所在的位置。

Datasets

Datasets用於實現地圖與數據的綁定。舉例說明,有一個關於城市銷售情況的MSAccess 數據庫和一張該城市的地圖,則可以將二者綁定,在地圖上形象地顯示出各城市銷售業績的趨勢,這一點是表格數據無法做到的。

建立地圖信息與屬性數據之間聯系的過程稱之為自動綁定或自動匹配(autobinding /automatching)。要實現這一過程,必須首先將地圖在GeoDictionary 中注冊。

屬性數據表示的可視化使得創建專題地圖成為可能。

數據綁定"Putting Your Data on the Map"

專題地圖"Theme Mapping and Analysis"

Annotations

Annotations集合提供了操縱地圖中文字和符號的簡單方法。Annotations位於所有其它圖層的上方並且不與任何數據連接,有點兒象MapInfo中的透明圖層。

Annotations包括以下主要的屬性與方法:AddSymbol在Annotations中增加符號,符號類型使用Map.DefaultStyle定義;AddText在Annotations中增加文本;Remove刪除特定的標注.;Type取值為miSymbolAnnotation或miTextAnnotation。

Annotations還有一個非常重要的屬性Graphic,其定義為Graphic對象,在該對象中包含了符號或文本的樣式、位置等信息,即Graphic的Caption、Position、Style 、X、Y屬性。如Annotations的Type屬性定義為miTextAnnotation,則可以定義Graphic的Caption屬性設置標注的字符串。

可創建對象

在MapX對象模型中,以下對象是可以被創建的:

AffineTransform、BindLayer、BitmapSymbols、CoordSys、Datum、Feature、Fields、LayerInfo、Map、ODBCQueryInfo、Parts、Point、Points、Rectangle、RowValue、RowValues、Style、Variables、NotesQueryInfo、NotesViewInfo。

專題地圖

1、專題地圖的概念

MapInfo的一個顯著特征就是能將數據庫中的信息進行直觀的可視化分析。專題地圖就是用於分析和表現數據的一種強有力的方式。用戶可以通過使用專題地圖的方式將數據圖形化,使數據以更直觀的形式在地圖上體現出來。當使用專題渲染在地圖上顯示數據時,可以清楚地看出在數據記錄中難以發現的模式和趨勢,為用戶的決策支持提供依據。專題地圖是MapInfo中的一個重要概念,是用戶使用好MapInfo的一種體現。

制作專題地圖是根據某個特定專題對地圖進行“渲染”的過程。所謂的專題渲染,就是以某種圖案或顏色填充來表明地圖對象(點、線、區域)的某些信息(例如人口、大小、年降雨量、日期等等),也就是說,這類渲染存在著主題,經過這樣渲染的地圖就是專題地圖。利用MapInfo,可根據數據庫表中特定的值來賦給地圖對象顏色、圖案或符號,從而創建不同的專題地圖。

2、專題圖的六種類型

MapInfo為創建專題地圖提供了強有力的支持。用戶可以使用范圍值、等級符號、點密度、獨立值、直方圖和餅圖等多達六種方式來創建不同的專題地圖。

(1)、范圍值

按照設置的范圍顯示數據。這些范圍用顏色和圖案進行渲染。范圍專題地圖能夠通過點、線和區域來說明數值,在反映數值和地理區域的關系(如銷售數字,家庭收入),或顯示比率信息如人口密度(人口除以面積)時是很有用的。

(2)、等級符號

等級符號為表中每條記錄顯示一個符號,符號大小與數據值成比例。等級符號地圖用特定的數值來顯示數據點,對於闡明定量信息(如由高到低依次變化)很有用處。符號的大小與該點對應的數值成比例,數值越大點就越大,數值越小點就越小。因此,等級符號最適合數據值數據。

(3)、點密度

在地圖上用點來顯示數據,每一點都代表一定數量,某區域中點的總數與該區域數值成比例。每個點代表一定數量的單元,該數乘以區域內總的點數,就等於該區域的數據值。

(4)、獨立值

按獨立數值渲染地圖,可以表達多個變量。根據獨立值繪制地圖對象的專題地圖有助於強調數據的類型差異而不是顯示定量信息(如給定區域內的商店類型、分區類型等等)。

(5)、直方圖

將表中每條記錄的專題變量顯示為一個直方圖。使用直方圖可分析地圖中每條記錄的多個變量。比較每個直方圖中各直方條的大小可考察表中某條記錄,比較所有直方圖中某一條的大小可考察所有記錄的某個變量,而比較各直方圖的高度可考察整張表。用直方圖來表達負值時,該條會沿直方圖反方向伸展。在疊加直方圖中不顯示負值。

(6)、餅圖

以餅圖顯示表中各記錄的專題變量。餅圖可包含多個變量。在地圖上使用餅圖可一次分析多個變量,比較每個圖中餅扇的大小可考察表中某條記錄,比較所有餅圖中某一個餅扇,可考察所有記錄中某個變量的變化,比較各餅圖的直徑可考察整張表。

3、MapX對專題圖的支持

MapX中使用Themes集合與Theme對象來實現對專題圖的支持,每個Themes集合中可以包含多個Theme對象,也就是說,針對一個Dataset,可以創建多幅不同的專題地圖。

每個Dataset都擁有一個Themes集合,並以其屬性的形式存在,即Dataset.Themes。使用Themes的Add、Remove、RemoveAll等方法可以控制專題的添加和刪除。

a) Add方法:創建一個專題並將其加入到某個特定的DataSet的Themes集合中,

b) Remove方法:從集合中刪除某一特定的專題圖

c) RemoveAll方法:從集合中刪除所有的的專題圖

Theme對象用於設置每個專題圖的屬性。

比較重要的有

a) Layer:返回一個Layer對象,表示該專題圖所在的圖層

b) Legend:控制 對專題地圖的說明,即圖例

c) ComputeTheme 控制是否可以對原始數據進行計算,默認為True

d) Type 即專題圖類型,取值范圍為ThemeTypeConstants

e) Fields 只讀屬性,返回該專題圖所基於的Dataset中的字段集合

ThemeProperties 復合型屬性,對應ThemeProperties對象,包含了專題圖詳盡的定義信息,如范圍定義、顯示風格設置等。

4、專題圖的規劃

在創建專題圖的過程中,有幾個關鍵因素,包括專題圖變量的確定、屬性數據的獲取以及專題圖層的顯示與控制。

(1)、確定專題圖變量

在專題圖中顯示的數據就是專題圖變量。例如在行政區面積專題圖中,表示面積的字段“area”就是這個專題地圖的專題地圖變量。

一個專題變量可以是一個字段或表達式。取決於專題圖的類型,在一張地圖上可以顯示一個或多個專題圖變量。范圍值、等級符號、點密度和獨立值地圖都只檢查一個變量。可以利用餅圖或直方圖一次顯示多個專題變量。也可以創建雙變量專題地圖,其中一個地圖對象可代表兩個不同的數據,入符號的顏色代表一個專題變量,符號的大小代表另一個專題變量。

(2)、屬性數據的獲取

在創建專題地圖之前,必須確定需要顯示何種信息,信息存儲在什麼位置。它可以在創建地圖時所基於的表中,也可以在ODBC支持的外部數據庫中。數據來源於Field對象或Field集合,在Themes.Add方法中通過Fields參數傳遞。

(3)、創建專題圖

首先應將某個產生專題圖數據的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會自動生成一個名字。

(4)、專題圖類型常量

專題圖變量由Theme.Typeproperty取得,其定義如下:

miThemeRanged = 0

miThemeBarChart = 1

miThemePieChart = 2

miTheme GradSymbol = 3

miThemeDotDensity = 4

miThemeIndividualValue = 5

miThemeAuto = 6

miThemeNone = 9

5、控制專題地圖

有兩種方法可以控制專題地圖。

(1)、使用Theme.ThemeDlg方法

該方法顯示一個對話框,用戶可以直接修改專題圖特性。語句如下:

curmap.Datasets[1].Themes[1].ThemeDlg;

這種方法雖然簡單,但是而且很難與自己的程序風格相一致,用戶界面不友好,而且在這個默認的對話框中,用戶可以隨意改變任何設置,使得程序的控制難度加大。

(2)、改變ThemeProperties對象屬性

通過設置ThemeProperties對象屬性,可以使用自己定制的界面,給用戶有限的修改能力,實現起來也非常簡單,而且對用戶的操作有全部的控制權。

ThemeProperties對象是Themes集合中的一員,主要用於定義專題地圖的顯示,包括顏色、符號等。不同類型的專題圖有自己與眾不同的一些特性,在ThemeProperties中有其分別的定義。如DotSize專用於設定點密度專題圖中點的大小,NumRanges專用於設定范圍值專題圖中的范圍分布,SymbolStyle控制等級符號專題圖使用的符號類型,ValuePerDot用於在點密度專題圖中每個點所代表的值。

ThemeProperties對象的屬性中有許多又屬於其他對象,如RangeCategory、IndividualValue、Style 等,可進行更深層次的設定。

6、自定義圖例

專題地圖被創建後,MapX會自動生成一個圖例來解釋顏色、符號或大小所代表的含義。同ThemeDlg一樣,可以直接用LegendDlg 方法調用默認的Legend對話框,但更常用的依舊是訪問Theme.Legend 屬性來進行一些個性化的設置。

基礎使用代碼介紹

在MapX中,提供了標准的地圖工具,可以很容易地利用常用的標准工具開發出方便易用的地理信息系統,而不必針對每一種地圖操作都完全靠開發者自已編程。MapX內置了常用的標准地圖工具,主要分為兩類:一是對象創建工具,用來創建地圖圖元;另一類是選擇工具。在選擇工具的使用時,可以配合功能鍵Shift和Ctrl鍵。它們包括:

(1)改變地圖比例尺和地圖導航的工具:放大工具、縮小工具、平移工具和居中工具。

(2)通過單擊地圖圖元進行標注的標注工具。

(3)以不同方式選擇地圖圖元的選擇工具集合。具體開發方法是:在程序適當位置激活某一個標准工具,把CurrentTool屬性設為某一個常量,或直接用值。例如,在窗體中MapX控件為axMap1對象,當需要放大工具時:

axMap1.CurrentTool = MapXLib.ToolConstants.miZoomInTool;

運行程序就會看到此鼠標光標變為了放大鏡。其他工具設定的方法與此相同。在具體實現中經常會為用戶提供一些工具條,上面有地圖的標准操作工具,以方便用戶操作地圖,例如提供放大、縮小、平移和選擇這4種常用的工具按鈕,在按鈕的命令中可以編寫為:

//地圖放大工具

axMap1.CurrentTool = MapXLib.ToolConstants.miZoomInTool;

//地圖縮小工具

axMap1.CurrentTool = MapXLib.ToolConstants.miZoomOutTool;

//縮放到初始大小(全圖)、

axMap1.ZoomTo(this.MapZoom, this.CenterX, this.CenterY);

//地圖平移工具

axMap1.CurrentTool = MapXLib.ToolConstants.miPanTool;

//地圖選擇工具

axMap1.CurrentTool = MapXLib.ToolConstants.miSelectTool;

//矩形選擇

axMap1.CurrentTool = MapXLib.ToolConstants.miRectSelectTool; 

//圓形選擇

axMap1.CurrentTool = MapXLib.ToolConstants.miRadiusSelectTool; 

//打開圖層對話框

axMap1.Layers.LayersDlg(null, null);

//打開ActiveX屬性對話框 

axMap1.ShowPropertyPages();

axMap1.Refresh();

//添加符號

axMap1.CurrentTool = MapXLib.ToolConstants.miSymbolTool;

為了在地圖中創建新的圖元,或者修改已有的圖元,需要地圖編輯功能。MapX的標准工具提供了miAddPoint、ToolmiAddLine、ToolmiAddPolyLineTool、miAddRegionTool四種添加工具,分別屬於添加點、添加線、添加折線和添加區域工具。對於添加工具,MapX指定將添加的圖元放在Insertionlayer圖層中。

因此需要在添加的圖層前,先設定Insertionlayer圖層,並將其設為可編輯的。方法如下:

axMap1.Layers.LayersDlg(null, null);                         // (1)

axMap1.Layers.InsertionLayer=axMap1.Layers[1];     //  (2)

其中(1)表示:打開圖層對話框,在圖層對話框中將當前圖層設為可編輯;(2)表示:將Insertionlayer圖層設定為當前層。

文章來源:http://www.iqidi.com

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved