應用MapX編程兩例
citylamp
0 MapX簡介
MapX是MapInfo公司提供的具有強大地圖分析功能的ActiveX控件產品。由于它是一種基于Windows操作系統的標準控件,因而能支持絕大多數標準的可視化開發環境,如Visual C++、Visual Basic、Delphi、PowerBuilder、Visual Studio.NET等。編程人員在開發過程中可以選用自己最熟悉的開發語言,輕松地將地圖功能嵌入到應用中,并且可以脫離MapInfo的軟件平臺運行。利用MapX,能夠簡單快速地在軟件中嵌入地圖化功能,增強軟件的空間分析能力。MapX采用基于MapInfo Professional相同的地圖化技術,可以實現MapInfo Professional具有的絕大部分地圖編輯和空間分析功能。
MapX的主要功能包括:
[1]專題地圖繪制 使用專題地圖繪制可以直觀地表示數據。將數據與地圖上的對象相關聯,然后使用顏色編碼(或其它樣式)來直觀地表現數據??墒褂昧N不同樣式的任何一種(顏色范圍、點密度、單獨值、分級符號、餅圖或條形圖)查看數據。
[2]逐層細化地圖繪制 通過簡單的點擊即可詳查數據。對于OLAP/DSS,可以通過點擊讓用戶逐層細化到地圖上的區域。
[3]數據綁定 地圖可以與嵌套了MapX的容器、ODBC或DAO數據源相連。MapX 提供了若干不同類型的數據綁定,包括郵政編碼級別的地理編碼。
[4]注釋 可以自行定義注釋的顯示方位。突出顯示特定數據。還可加入文本、符號、表格使地圖信息更加豐富直觀。
[5]圖層化 可以顯示和控制地圖圖層,使其縮放程度在預設的距離內時才顯示??梢允褂没騽摻o縫圖層,從而就像處理一個表一樣處理一組表??梢酝ㄟ^特殊圖層來支持特殊的應用,這些特殊圖層包括動畫圖層(用于實時跟蹤)和UserDraw 圖層(用于在地圖頂部繪制特殊地圖元素,例如徽標)。
[6]柵格圖像 在圖層中加入一個柵格圖像層作為背景可以使最終的地圖更加清晰、美觀。
[7]自動標簽 可以自動向地圖添加標簽,并可以控制其屬性和顯示。
[8]選取對象 可在地圖上拖動鼠標在圓、矩形或特定的點上選擇一個或多個對象或記錄以供分析。
[9]特征工廠 用FeatureFactory對象可以創建、合并、緩沖或清除點、線、區域對象。
[10]工具集 用戶可以通過單擊和拖放操作來與地圖交互??梢允褂肕apX內置的導航、選擇、標簽、縮放工具,或者創建自定義的工具來滿足程序的要求。
[11]地圖編輯 允許用戶添加、修改、刪除地圖上的文本、編輯區域、點等特殊對象。
[12]投影和坐標系 通過支持各種坐標系統和地圖投影,MapX允許微調地圖的顯示并在本地坐標中處理X-Y坐標數據。
[13]遠程空間服務器連接 可以訪問存儲在Oracle 8i 和MapInfo SpatialWare中的遠程地圖數據??臻g數據服務器如SpatialWare和Oracle 8i等都提供了先進的查詢處理能力 ,提高了空間數據組織的性能。將空間數據存儲到關系型數據庫中,可以增加應用程序的靈活性和地圖數據的安全性。
1 簡單的GIS功能
對于地圖縮放、平移、選取、標簽等比較簡單的功能,可以通過設置MapX控件對象的CurrentTool屬性方便地獲得。如平移功能就可以簡單地用以下語句獲得:
Map1.CurrentTool = miPanTool (假設MapX控件名字是Map1)
2 對象閃爍功能
很多GIS系統中要用到圖形對象的閃爍功能。比如:節點在狀態未知時顯示灰色,在接受查詢時以閃爍以表明狀態。這部分功能是借助定時器控件實現的。程序代碼主要部分如下:
´記錄目前正在處理的節點圖標
Dim CurCusSym As New MapXLib.Feature
´兩個交替顯示的圖標
Dim NewStyle As New MapXLib.Style, OldStyle As New MapXLib.Style
´用于更換圖標的布爾值
Dim blnold As Boolean
…………
Private Sub Timer1_Timer() (每次定時器間隔時間到時調用此函數)
Set lyr = Map1.Layers.Item(1)
Set FeaFac = Map1.FeatureFactory
With NewStyle
.SymbolType = miSymbolTypeBitmap
.SymbolBitmapSize = 24
.SymbolBitmapTransparent = True
.SymbolBitmapName = "red.BMP" (要顯示的第一張圖片)
End With
With OldStyle
.SymbolType = miSymbolTypeBitmap
.SymbolBitmapSize = 24
.SymbolBitmapTransparent = True
.SymbolBitmapName = "gray.BMP" (要顯示的第二張圖片)
End With
Map1.AutoRedraw = False (禁止自動刷新)
If (blnold = True) Then (如果正顯示第一張圖片,就替換為第二張圖片)
CurCusSym.Style = OldStyle
blnold = False
Else
CurCusSym.Style = NewStyle (如果正顯示第一張圖片,就替換為第二張圖片)
blnold = True
End If
CurCusSym.Update (刷新圖片)
End Sub
3 增刪站點圖標功能
在增加、減少、改動節點時會用到該功能。該部分功能是通過一個自定義工具實現的。主要實現代碼如下:
´在工程模塊中定義增刪節點的工具常數
Public Const CreateRTUSymbolTool = 106
Public Const DeleteRTUSymbolTool = 107
´注冊工具
Private Sub Form_Load()
…………
Map1.CreateCustomTool CreateRTUSymbolTool, miToolTypePoint, miSizeAllCursor
Map1.CreateCustomTool DeleteRTUSymbolTool, miToolTypePoint, miSizeAllCursor
End Sub
´工具的調用
Private Sub Map1_ToolUsed(ByVal ToolNum As Integer, ByVal X1 As Double, ByVal Y1 As Double, ByVal X2 As Double, ByVal Y2 As Double, ByVal Distance As Double, ByVal Shift As Boolean, ByVal Ctrl As Boolean, EnableDefault As Boolean)
…………
´添加節點圖標
If ToolNum = CreateRTUSymbolTool Then
Dim Pnt As New MapXLib.Point
Dim FeaFac As New MapXLib.FeatureFactory
Dim lyr As New MapXLib.Layer
Dim ftr As New MapXLib.Feature
Dim NewStyle As New MapXLib.Style
Set lyr = Map1.Layers.Item(1)
Set FeaFac = Map1.FeatureFactory
´設置節點圖標的樣式
With NewStyle
.SymbolType = miSymbolTypeBitmap
.SymbolBitmapSize = 24
.SymbolBitmapTransparent = True
.SymbolBitmapName = "gray.BMP"
End With
Map1.AutoRedraw = False ´禁止圖層自動刷新
lyr.Editable = True ´置當前圖層為可寫狀態
´創建點對象
Pnt.Set X1, Y1
Set ftr = FeaFac.CreateSymbol(Pnt, NewStyle) ´創建符號
´記錄目前正在處理的用戶標記
Set CurCusSym = ftr
´添加節點圖標進當前圖層并刷新圖層
lyr.AddFeature ftr
lyr.Refresh
Map1.AutoRedraw = True ´恢復圖層的自動刷新
lyr.Editable = False
´釋放對象
Set Pnt = Nothing
Set FeaFac = Nothing
Set lyr = Nothing
Set ftr = Nothing
End If
´刪除節點圖標
If ToolNum = DeletePointTool Then
Dim obj As MapXLib.Feature
Dim selectedFtrs As MapXLib.Features
Dim lyr As MapXLib.Layer
Set lyr = Map1.Layers.Item(1)
Set selectedFtrs = lyr.Selection
For Each obj In selectedFtrs
lyr.DeleteFeature (obj)
Next
End If
End Sub
4 注意事項
用于顯示的BMP圖片必須放在MapX安裝目錄下的CUSTSYMB子目錄下,存為不大于256色的圖片,這樣才可以用.SymbolBitmapName = "gray.BMP"這樣的語句來調用顯示。
5 MapX與.NET的結合
由于MapX是一個AvtiveX控件,所以可以被.NET托管使用。但由于.NET對ActiveX控件托管的實現是借助一個類似“殼”的包裝對象實現的,而且很多在VB6下面的ActiveX方法不再支持(如默認參數等),將MapX應用到.NET中有一些難度。當然基本功能還是比較容易實現的,如選擇工具調用的語句為:axMap1.CurrentTool = MapXLib.ToolConstants.miSelectTool(axMap1為相當于VB6下面的Map1對象)。
今年晚些時候MapInfo公司將推出MapInfo .NET,相信這個新版本將會成為 .NET平臺下GIS開發的利器。
[注] 本文有關MapX控件功能的介紹內容參考了英文版的“MapX參考指南”。
原文轉自:http://www.anti-gravitydesign.com