第二章 MO程序设计入门
按照循序渐进的原则,本章尽可能详尽地介绍MO的最基本和最简单的功能的实现方法,旨在使你对地理信息系统的编程有一个快速的了解,也为初学者的学习建立兴趣和信心。
不要以为本书其它部分都是用罗嗦的语句描述这么简单的问题。如果你是程序开发的高手,或对地理信息系统的编程有深入的了解,可以跳过本章,直接进入后面的难度较大的章节。
2.1图层加载
2.1.1 Shapefile文件和图层的基本概念
进行GIS开发前,首先要有ArcInfo格式的GIS图层数据文件。这些文件可以从ArcInfo中产生,也可以从其它地理信息系统,如MapInfo、GeoMedia、MapGis等系统中转换而来。
MO可以便用的数据文件的格式主要有Shapefile、Coverage、SDE、VPF、StreetMap和各种CAD文件。本书主要介绍针对Shapefile文件的开发。
Shapefile文件采用早期的dBase数据库管理模式,一个文件夹是一个数据库,文件夹的不同文件就是数据库中的表,每个表代表GIS图中的一个图层。
每个图层文件必须包含3个以上的特征文件,才能在Mo中使用。它们是空间特征数据文件shp、索引文件shx和属性数据文件dbf。
对于Mexico(墨西哥)文件夹,其中有文件如下:
这就是说明其中包含CITIES(城市)、STATES(州)、LAKE(湖泊)和RIVERS(河流)4个图层。
图层又分为点状图层、线状图层和面状图层3类,如城市是点状图层,河流是线状图层,湖泊和州是面状图层。
图层加载时,要使点状图在最上面,线状图层在中间,面状图层在最下面。否则图状图层会把点状图层和线状图层覆盖掉。
要注意,在MO中,最先加载的在下面,最后加载的在上面。
在GIS系统中,还可以用开关(CheckBox)来控制每个图层的显示情况,如图3.3所示。
安装完成时,在C:\\Program Files\\ESRI\\MapObjects2\\Samples\\Data下有一些ESRI提供的数据文件,如世界地图(World)、美国地图(USA)、墨西哥地图(Mexico)等。由于墨西哥地图比较简单,本书的大多数例子以墨西哥地图为主。本书所附光盘中,提供了在謻示例中还使用的北京市地图。
2.1.2添加Map控件
在VB和VC上建立一个FORM后,在[工程]/[部件]中选择“ESRI MapObjects2.1”,就可以从左面的工具箱上向FORM添加Map控件的实例了。
Map控件的实例缺省命名为Map1,我们在以下的例子中均采用这个名称。你可以根据你的应用情况给它改名。
2.1.3手工加载图层
利用MO的Map控件,甚至可以不用编一行程序,就直接显示出来数字地图! 在Map1上右击,在菜单中选择[特性],出现如图2.1所示的图层设置界面,单击中间的[Add]和[Remove],可以加载和卸载图层,按上下箭头,调整图层覆盖关系。本例添加的是在ESRI\\MapObjects2\\Samples\\Data下的Mexico(墨西哥)地图。
图2.1Map1上的图层设置界面 图2.2 墨西哥地图显示 注意,图层的覆盖关系是自上而下,按照点状图层(城市、测站)、线状图层(河流、公路)、面状图层(湖泊、沼泽)顺序排列,整体面状图层(行政区划)在最下面。如果你要添加2个整体面状图层,可以把上面一个的图层模式设置为Transparent(透明)。
示例文件为工程Chapter2—Form01)参见本书所附光盘)、 按F5运行VB,可以显示图层或图层集合,如图2.2所示。
4
单击[Properties],设置图层属性,如图层颜色、线型、尺寸等。
在右边对图层模式、边界线型、取消方式、滚动条设置等总体性能做出选择。还可以选择[颜色]选项卡,设置Map1的底色。
虽然用手工加载图层很简单,但高高手们还是用程序来添加图层文件。这不仅操作上更方便,而且便于移植和安装。另外,在许多场合还需要动态加载和卸载图层文件,这只有用程序才能解决。
用程序添加图层文件的例子见3.1节。
2.2 地图操作的基本功能
2.2.1 地图放大
下面要给我们的系统添加程序了。
要实现的第一个功能是GIS系统的地图放大功能。在使用其它通用开发工具时,这是要用很多语句和技巧才能实现的复杂功能,但利用MO,只要一句就够了。
Set Map1.Extent = Map1.TrackRectangle
这条语句放在Map1_MouseDown1过程中。在开发界面中点击控件和过程,产生程序的头尾,再加入以上语句,全部程序为:
(工程Chapter2—Form02)
Private Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Set Map1.Extent = Map1.TrackRectangle End Sub
运行为个程序,在地图上用鼠标画框,就可以进行地图的放大了。 2.2.2地图移动
在MO中,实现用鼠标移动地图的功能,也是很简单的一条语句: Map1.Pan
以下程序实现按右键移动、左键放大的功能。 (工程Chapter2—Form03)
Private Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then
Set Map1.Extent = Map1.TrackRectangle ElseIf Button = vbRightButton Then Map1.Pan End If End Sub
注意,运行时,只有先对地图进行放大,才能进行移动。
2.2.3 地图缩小
地图的缩小的程序比放大复杂—点,先要设置缩小倍数。如果要缩小50%,则可以视为显示框放大1.5倍,添加一个Command1控件,程序为:
(工程Chapter2—Form04)
Option Explicit ‘强迫变量声明 Private Sub Command1_Click() Dim r As MapObjects2.Rectangle Set r = Map1.Extent
5