?? vb+mapgis.txt
字號:
基于MAPGIS組件的二次開發
0、吹牛先
MAPGIS是武漢中地信息工程有限公司研制的具有自主版權的大型基礎地理信息系統平臺。它是一個集當代最先進的圖形、圖像、地質、地理、遙感、測繪、人工智能、計算機科學于一體的大型智能軟件系統,是集數字制圖、數據庫管理及空間分析為一體的空間信息系統,是進行現代化管理和決策的先進工具。
這里簡短介紹一下MapGIS組件開發平臺的組成和功能劃分,和使用MapGIS組件進行GIS應用軟件二次開發的一般方法和步驟,以及在VB中使用MapGIS組件對象的基本步驟.并以VB為開發環境,結合MapGIS數據管理組件、圖形顯示組件、圖形編輯控件、屬性編輯控件等,給出了一個具有圖形顯示、地理屬性數據編輯等功能的實例程序,演示了如何使用MapGIS組件進行GIS應用軟件的二次開發.
地理信息系統(Geographic Information System, 簡稱GIS)是在計算機軟硬件支持下,以采集、存儲、管理、檢索、分析和描述空間物體的地理分布數據及與之相關的屬性,并回答用戶問題等為主要任務的技術系統。組件式GIS(Component GIS)指基于組件對象平臺,以組件的形式提供基本功能的GIS,是GIS與組件技術相結合的新一代地理信息系統組件式GIS充分利用了組件的可重用特性,使用GIS組件可以很大程度地提高GIS應用軟件的開發效率和質量.MapGIS地理信息系統是國產的GIS基礎軟件平臺,它提供了豐富的二次開發手段,包括API函數庫、C++類和組件開發庫.
一、MapGIS組件開發平臺
MapGIS組件開發平臺以一系列COM組件和ActiveX控件的形式提供了GIS基本功能:包括數據管理組件、圖形顯示組件、圖層管理組件、地圖管理組件、圖例管理組件、圖像處理組件、圖庫管理組件、圖形編輯控件、工程管理控件、屬性編輯控件、屬性結構編輯控件等.這些組件(控件)對象關系如圖1所示.
圖形顯示組件
數據管理組件
圖層管理組件
地圖管理組件
=圖庫管理組件
圖像管理組件
屬性結構編輯控件
屬性編輯控件
工程管理控件
圖形編輯控件
圖例管理組件
MapGIS組件(控件)對象關系
數據管理組件是整個系統的基礎和核心,主要進行空間數據和屬性數據的存取和管理,并提供基本的數據交互功能.數據管理組件定義了MapGIS的基本數據類型和數據結構,封裝了對點、線、區、網、表格等工作區的基本操作.GIS通用功能組件(控件)集合提供了MapGIS平臺的通用處理功能.通用功能組件基于數據管理組件構造而成,它們具有面向通用GIS功能:
(1)圖形顯示對象MapGIS DC封裝了MapGIS的基本顯示操作;
(2)圖層對象Layer封裝了點、線、區、網文件的數據管理功能;
(3)地圖對象Map封裝了對MapGIS基本圖形的編輯/輸出操作和對多個圖層的管理功能;
(4)圖例對象Legend封裝了點、線、區圖例元素的管理和操作功能,并提供了管理圖例文件存儲和圖例元素的功能;
(5)MSI對象封裝了對圖像工作區的操作和顯示,并提供了矢量數據和柵格數據的相互轉換功能;
(6)DBS對象封裝了操作和顯示圖庫工作區的方法.
同時, MapGIS組件開發平臺還提供了幾個可視化控件:
(1)EditView控件對象包括點編輯、線編輯、區編輯、數字化、矢量化及其他操作功能;
(2)MapTreeCtrl控件對象封裝了與Map對象的交互操作功能;
(3)GISAtteditt控件對象主要用來瀏覽和編輯MapGIS屬性數據;
(4)AttStruEdit控件對象主要用來瀏覽和編輯MapGIS屬性結構.
MapGIS組件包含在一系列Windows動態連接庫文件里,Active控件則包含在一系列OCX文件中.表1是Windows文件與MapGIS組件的對應關系.
表1 Windows文件與MapGIS組件對應關系
Windows文件
MapGIS組件(控件)
MapGISBasCom1.dll
數據管理組件
MapGISDspCom.dll
圖形顯示組件
MapGISLayerCom.dll
圖層管理組件
MapGISMapCom.dll
地圖管理組件、圖例管理組件
MapGISDbsCom.dll
圖庫管理組件
MapGISRasterCom.dll
圖像分析管理組件
EditView.ocx
圖形編輯控件
MapTree.ocx
工程管理控件
GisAttEdit.ocx
屬性編輯控件
AttStruEdit.ocx
屬性結構編輯控件
二、基于MapGIS組件的二次開發
MapGIS組件不依賴于某一種開發語言,它可以直接嵌入到通用的開發環境(如VB、VC或Delphi)中實現GIS功能.通過調用MapGIS組件的基本功能,并結合其他專業模型和專業模型分析控件,可以快速地開發GIS應用程序,這就大大降低了GIS應用系統的開發難度與開發成本.利用MapGIS組件開發平臺進行GIS應用程序的開發分以下幾個步驟進行:
(1) 選擇應用系統的開發工具,如VB;
(2) 將使用到的MapGIS組件引用到應用程序中;
(3) 調用MapGIS組件的屬性和方法完成GIS基本功能;
(4) 開發應用系統專用的功能.
基于MapGIS組件開發平臺的GIS應用程序結構如圖2所示.
MapGIS應用程序
MapGIS通用功能組件
MapGIS數據管理組件
MapGIS數據文件
圖2 MapGIS應用程序層次結構
三、VB開發示例
MapGIS組件的使用方法與一般組件的使用方法完全相同,在使用MapGIS組件之前,必須先注冊.安裝完MapGIS的SDK開發包后,自動安裝并注冊了MapGIS組件.
在VB中使用MapGIS組件對象的步驟是:
(1)嵌入MapGIS對象類型庫;
(2)建立MapGIS對象;
(3)調用MapGIS對象和其他VB對象的方法和屬性完成GIS應用軟件功能;
(4)釋放MAPGIS對象.
下面的例子演示了如何使用MAPGIS組件(控件)進行GIS應用軟件的開發.
(1)新建一個VB工程(標準EXE類型),“引用”程序中用到的組件和控件.為了使VB能夠訪問MAPGIS組件對象,需要在VB項目中嵌入MAPGIS對象類型庫.執行下列步驟:從Project (工程)菜單中選擇References(引用), References對話框出現后,選中所需的類型庫:MapGISBasCom11.o Type Library和MapGISDspCom1.0 Type Library。(如下圖)
再從Project (工程)菜單中選擇Components (組件), Components對話框出現后,選中所需的控件,EditView ActiveX Control module是圖形編輯控件。(如下圖)
(2)添加EditView控件到Form上,命名為EditView
將區文件、線區文件或點區文件加載到EditView有兩中方法,一是將區文件直接用Load方法,然后調用 Set EditView.RegArea = objRArea,二是用工程Map的形式加載,此處用方法二。
定義一個全局的Map
Public g_objPrjMap As MAPGISMAPCOMLib.Map
在Form Load的時候,將 g_objPrjMap 賦給 EditView.Map
Set EditView.Map = g_objPrjMap
接下去就是把區文件綁定到Map上,見下面函數:(此處以區為例)
Public Function AddLyrToMap(strLyrPath As String, strLyrName As String)
Dim objAddWArea As MAPGISBASCOM1Lib.WorkArea
Dim objRArea As New MAPGISBASCOM1Lib.RegArea
Dim objMapLyr As MAPGISLAYERCOMLib.MapLayer
If Not objRArea.Load(strLyrPath) Then
MsgBox "加載" & strLyrPath & "目錄下的圖層出錯!", vbInformation, "系統提示"
Exit Function
End If
objRArea.Name = strLyrName
Set objAddWArea = objRArea
Set objMapLyr = New RegLayer
g_objPrjMap.AddLayer objMapLyr
g_objPrjMap.Layer(g_objPrjMap.MapLayerCount-1).Attach objAddWArea
Set objAddWArea = Nothing
Set objRArea = Nothing
Set objMapLyr = Nothing
End Function
AddLyrToMap函數可以這樣調用:
Call AddLyrToMap(App.Path & "\Data\ST_XZQ.WP", "行政區") '添加行政區圖層
加載完地圖后,要將地圖復位:
'將Map全部顯示
Public Sub RestoreEditView()
Dim objTempLyr As MAPGISLAYERCOMLib.MapLayer
Dim objRC As MAPGISBASCOM1Lib.D_Rect
Dim i As Integer
Set objTempLyr = g_objPrjMap.FindFirst(gisFINDTYPE_ALL)
If objTempLyr Is Nothing Then Exit Sub
Set objRC = objTempLyr.rect
For i = 0 To g_objPrjMap.MapLayerCount - 1
If (Not objTempLyr.WorkArea.Empty) And (objTempLyr.WorkArea.logCount > 0) Then
If (objRC.xmin > objTempLyr.rect.xmin) Then
objRC.xmin = objTempLyr.rect.xmin
End If
If (objRC.xmax < objTempLyr.rect.xmax) Then
objRC.xmax = objTempLyr.rect.xmax
End If
If (objRC.ymin > objTempLyr.rect.ymin) Then
objRC.ymin = objTempLyr.rect.ymin
End If
If (objRC.ymax < objTempLyr.rect.ymax) Then
objRC.ymax = objTempLyr.rect.ymax
End If
End If
Set objTempLyr = Nothing
Set objTempLyr = g_objPrjMap.FindNext()
Next
frmMapWin.EditView.SetWinMapRange objRC.xmin, objRC.ymin, objRC.xmax, objRC.ymax
frmMapWin.EditView.RestoreWindow
Set objTempLyr = Nothing
Set objRC = Nothing
End Sub
(3)得到統計區的屬性值、面積等
由于區文件是以工程Map的形式綁定上來的,所以要取得區的屬性,就要先得到工程Map 里的MapLayer,然后在得到RegArea,具體見下面函數:
Private Sub Command1_Click()
Dim i As Integer
Dim dblArea As Double '統計面積
Dim objMapLay As MAPGISLAYERCOMLib.MapLayer
Dim objRArea As New MAPGISBASCOM1Lib.RegArea
Dim objRecd As MAPGISBASCOM1Lib.Record
Set objMapLay = New MAPGISLAYERCOMLib.RegLayer
Set objMapLay = g_objPrjMap.FindLayerByName("行政區")
Set objRArea = objMapLay.WorkArea
For i = 0 To objRArea.Count - 1
If (objRArea.RegAtt.Get(i, objRecd)) > 0 Then
Debug.Print objRecd.Item("XZQ_DM").Value
Debug.Print objRecd.Item("XZQ_DM").Value
dblArea = dblArea + objRecd.Item("Area").Value
End If
Next
Debug.Print dblArea
End Sub
(4)最后要釋放MAPGIS對象
Set g_objPrjMap = Nothing
這個就是一個最基本的MapGIS程序了,可以把它稱為“MapGIS的基石”,因為以后的程序都是在這個程序的基礎上“縫縫補補”而來的。
四、后話:鼎圖MapGIS版規劃編制項目情況
空間數據庫
1 Oracle 8i
數
據
層
邏輯層
表現層
空間數據引擎
數據模型
數據分析
GIS平臺
GIS組件
查詢統計分析
規劃方案編制
ADO
屬性數據庫
2 Oracle 8i
文檔數據庫
規劃成果管理與輸出
GIS平臺 : MapGIS/MapX
圖1 系統構架圖
規劃方案編制
規劃圖件編制
基礎數據資料與指標管理
規劃實施評價
專題研究分析
土地利用結構調整方案擬定
供選方案的擬定與比較分析
查詢分析
一般編輯
土地利用分區
地圖操作
規劃成果表和說明表匯總生成
規劃文本生成
數據校驗
要素屬性信息的建立
風格設置
生成成果圖件
編輯成果圖件
成果管理與輸出
系統維護配置
上傳空間數據
圖形數據下載
圖形數據交互
圖庫管理
數據備份/恢復
轉入SQL Server
圖形布局打印
數據柵格輸出
文本輸出
系統參數管理
代碼庫管理
行政代碼設置
線型庫
符號庫
用戶權限設置
圖 系統功能結構圖
參照:
1 規劃輔助編制信息系統 -- 南京鼎圖
2 MapGIS二次開發庫的設計與實現簡介
開發工具 : VB + ADO + Access
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -