基于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(A pp .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二次开发库的设计与实现简介