基于MAPGIS组件的二次开发

基于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封装了点、线、区图例元素的管理和操作功能,并提供了管理图例文件存储和图例元素的功能;

5MSI对象封装了对图像工作区的操作和显示,并提供了矢量数据和栅格数据的相互转换功能;

6DBS对象封装了操作和显示图库工作区的方法.

 

同时, MapGIS组件开发平台还提供了几个可视化控件:

1EditView控件对象包括点编辑、线编辑、区编辑、数字化、矢量化及其他操作功能;

2MapTreeCtrl控件对象封装了与Map对象的交互操作功能;

3GISAtteditt控件对象主要用来浏览和编辑MapGIS属性数据;

4AttStruEdit控件对象主要用来浏览和编辑MapGIS属性结构.

 

MapGIS组件包含在一系列Windows动态连接库文件里,Active控件则包含在一系列OCX文件中.1Windows文件与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组件不依赖于某一种开发语言,它可以直接嵌入到通用的开发环境(VBVCDelphi)中实现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组件之前,必须先注册.安装完MapGISSDK开发包后,自动安装并注册了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 LibraryMapGISDspCom1.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二次开发库的设计与实现简介

 

 


开发工具 : VB + ADO + Access

你可能感兴趣的:(图形,vb,平台,components,integer,windows)