基于组件的GIS开发
——Visual Basic和MapObjects实现
一、MapObjects介绍
1、 基于组件的GIS开发技术
利用GIS支撑软件进行二次开发可以充分利用支撑软件所具有的强大功能,开发比较容易,但开发的系统要在支撑软件的环境中运行,系统往往比较庞大,相应成本也高,对某些地图和空间分析只是部分功能的系统来说,二次开发就不太适合。此外二次开发受到原有软件的限制,灵活性没有底层开发大。
基于上述原因,用户希望GIS支撑软件能组件化,在开发系统时,根据需要利用功能组件。为此,一些GIS公司相继开发了供开发人员使用的制图与GIS功能组件,如ESRI公司的MapObjects、MapInfo公司的MapX等。
2、MapObjects产品
MapObjects简称MO,是ESRI公司开发的一组供开发人员使用的制图与GIS功能组件,目前的版本是2.2。它是建立在微软的对象链结和嵌入(ActiveX,原先称OLE)基础之上的。ActiveX是当今得到最广泛支持的面向目标的软件集成技术。用户象用砖块盖房子一样利用ActiveX 组件开发和集成Windows应用。
一个ActiveX控件是一个可重复使用的软件组件。ActiveX 控件可以将许多其他ActiveX 对象包装在一个包中。这个包可以反映某些特定的功能,如统计图和多媒体等,并可以直接嵌入支持ActiveX 的应用中。ActiveX 对象具有特性和方法,可以通过对它们的编程来控制对象的外观、行为以及相互作用。
MO目前使用的主要版本为2.0、2.1和2.2。MO2.0于1999年发布;MO2.1于2001年3月,增加了CAD、ArcSDE、StreetMap等文件格式的支持功能;MO2.2发布于2003年1月,主要增加直接读取GIF和TIFF文件等功能。
MapObjects2.2由一个ActiveX 控件(Map控件)和46个可编程ActiveX对象(包括Map控件,可见的对象)所组成。MapObjects控件可以直接插入到许多标准开发环境的工具集中,包括VB、Delphi、Visual C++、Microsoft Access、Visual Foxpro等流行的程序设计环境。
3、利用MapObjects可以实现的功能
利用MapObjects,开发人员可以在熟悉和喜欢开发环境中开发出系统开销小的GIS系统,或在已有的系统中添加GIS功能。
利用MapObjects,可以进行如下的操作: 1)显示具有多个图层的地图
2)地图的放大、缩小和漫游
3)增加点、线、圆和多边形等各种图形 4)增加文本
5)显示特征的属性
6)利用图形选择特征
7)利用邻近分析选择特征 8)利用SQL表达式选择特征
9)选择特征的统计
10)查询和更新选择特征的属性数据 11)各种专题制图
12)按字段的高程或测量值显示 13)按字段值对特征进行标号
14)显示遥感图像
15)实时或时间序列数据的动态显示 16)地理编码
17)利用特征的测量值显示点和线事件 18)地图坐标转换 19)地图的空间操作 20)地图的旋转
4、在Visual Basic下使用MapObjects
安装MapObjcts之后,打开Visual Basic的程序开发环境,在左边的控件面板上点击右键将弹出控件选择框,选择ERSI MapObjcts2.2,控件中将增加一个名叫Map的控件。
如果要在应用程序中加入地图,则在控件栏中选择Map控件,利用该控件画一个图框用于显示地图。设置Map控件属性,包括所要显示的图层、显示顺序、每一图层的显示特性等(图1—1)。根据需要增加其他控件,并利用MO提供的对象进行编程。
图1—1 Map控件属性和图层属性设置
程序运行界面如图1—2所示。
图1—2 程序运行界面
5、 利用MapObjects在线帮助和实例
在地图控件处于活动状态下,按F1将打开MapObjects在线帮助。MapObjects在线帮
助含有每个对象、特性、方法、事件和变量的详细文档。学习MapObjects的最好方法是在在线帮助中利用编码例子。大多数帮助条目含有可以在VB工程中执行的例子。此外,MO还有许多实例,它们的Form设计和代码可以参考。
二、MO对象
MO中有46个对象,可以划分成5个大类:数据操作对象类(10个)、地图显示对象类(17个)、投影对象类(8个)、图形对象类(7个)和地址匹配对象类(4个)。 1、数据操作对象类
数据操作对象类中各个对象的关系如图2—1所示。
通过定义DataConnection对象可以确定连接的数据库或文件目录。利用DataConnection对象的GeoDatasets属性可以得到图层数据的集合对象(GeoDatasets)。利用GeoDatasets的Item方法可以得到其中的一个图层文件。利用Layers集合的Add方法可以把图层文件增加到地图控件中,并作为一个MapLayer对象。
利用MapLayer对象的Records属性可以得到Recordset对象。通过Recordset对象的Fields属性可以得到Fields集合;通过Fields集合的Item方法可以得到其中的一个Field对象。 通过Recordset对象的MoveFirst、MoveNext、MovePrevious方法可以对Recordset对象中的记录进行定位。
通过Database等属性与数据 库或文件目录建立连接
Statistics对 通过GeoDataset属性 MapLayer对象 通过Records属性 通过Fields属性 Fields集合 通过Item方法 Field对Table对 CalculateStatistics方法 通过
图2—1 数据操作对象类中各个对象的关系
2、地图显示对象类
地图显示对象类中各个对象的关系如图2—2所示。
Map Control上的图层包括MapLayer、ImageLayer和TrackingLayer。一个Map Control只有一个TrackingLayer。MapLayer和ImageLayer的集合所对应的对象为Layers。
Strings集合 Recordset对通过TableDesc属性
GeoDatasets集通过Item方法
GeoDataset对象 DataConnection对象 通过GeoDatasets属性
TableDesc对象 通过Records属性 MapLayer有不同的显示方式,通过给MapLayer的Symbol属性赋值,使MapLayer以
LabelPlacer对象 新的符号显示;通过给MapLayer的Renderer属性赋值,使MapLayer以新的显示方式显示。
图2—2 地图显示对象类中各个对象的关系
3、投影对象类
投影对象类中各个对象的关系如图2—3所示。 有两种类型坐标系;地理坐标系和投影坐标系。
通过Prime-Meridian、Datum和Unit三个对象可以定义一个地理坐标系,其中,Datum包括Spheroid对象的定义。
通过GeoCoord、SysProjCoordSys和Unit三个对象可以定义一个投影坐标系。 Map控件和MapLayer对象有CoordinateSystem属性,该属性可以用GeoCoordSys对象或ProjCoordSys对象来赋值。同时GeoCoordSys对象和ProjCoordSys对象又可以通过Type属性定义具体的坐标类型。
MapLayer对象有GeographicTransformation属性,该属性可以用GeoTransformation对象来赋值, GeoTransformation对象有type属性用于定义坐标变换类型。
GeoTransformation对象 Prime Meridian对象 Group Renderer对象 Map控件 通过Layers属性 Layers集合 Symbol对象 TextSymbol对象 Event Renderer对象 ZRenderer对象 MapLayer对象 通过Item方法 ImageLayer对象 通过TrackingLayers属性 TrackingLayer对象 GeoEvent对象 DotDensity Renderer对象 通过Event属性 Label Renderer对象 Chart Renderer对象 ClassBreaks Renderer对象 ValueMap Renderer对象 GeoCoordSys对象 Datum对象 Unit对象 Spheroid对象 ProjCoordSys对象 Projection对象 Map控件
图2—3 投影对象类中各个对象的关系
4、图形对象类
图形对象类中各个对象的关系如图2—4所示
通过Point对象的x、y属性可以定义一个点。通过Points对象的Add方法可以把一个点增加到Points对象中。一个线对象和一个多边形对象可以是多个部分(Parts)组成,通过Parts属性可以得到Parts集合。Parts集合的Add方法可以把Points对象增加到Parts集合。
图2—4 投影对象类中各个对象的关系
5、地址匹配对象类
地址匹配对象类共有4个对象(图2—5)。
AddressLocation通过Item方法 Point对象 Points对象 Line对象 通过Add方法 Parts 集合 通过Parts属性 Polygon对象 通过Bottom、Left、Top和Right四个属性可以定义一个Rectangle对象Ellipse对象
Rectangle对象 Ellipse对象 Standardizer对象 PlaceLocator对象 Geocoder对象