mo+vb开发 doc

更新时间:2024-03-06 10:19:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于组件的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对象

图2—5 地址匹配对象类

三、地图与图层操作

在MO中,Map Control(地图控件)是一个载体,可以在地图控件上增加一个或多个图层。Mo支持三种类型图层:矢量图层、栅格图层和动态(Tracking)图层,所对应的对象分别为MapLayer、ImageLayer和TrackingLayer。

矢量图层和栅格图层分别用于显示矢量数据和栅格数据,栅格图层和动态图层的集合所对应的对象为Layers(图层集合对象)。

动态图层用于显示动态数据,如通过GPS采集到的车辆移动中的位置数据。在TrackingLayer层显示的对象称为GeoEvent对象。当在窗体中增加一个地图控件时,就会有一个TrackingLayer层,这时,没有GeoEvent对象,GeoEvent对象的EventCount属性为0。 1、 增加矢量图层

矢量图层是和具体的数据相关联,要增加矢量图层,首先要确定(连接)对应的数据。连接的方法是利用DataConnection和GeoDataset两个对象。

DataConnection对象表示与包含shapefiles的文件夹或包含SDE数据库的服务器的连接。如要连接到包含shapefiles的文件夹,把DataConnection对象的Database属性设置为文件夹名(字符串,包括路径),然后应用Connect方法,如果返回值为True,表明连接成功。如要连接到SDE数据库,则需要设置数据库、口令、服务器和用户特性,然后应用Connect方法检查是否连接成功。

如果连接成功,就可以利用FindGeoDataset方法把文件夹中的一个shapefile文件或SDE数据库中的一个层的数据赋给新创建图层的GeoDataset。

接着,在图层集合中增加该图层。

以下的代码显示在地图控件中增加矢量图层。 Dim dConn As New MapObjects2.DataConnection Dim mLayer As New MapObjects2.MapLayer dConn.Database = \

Set mLayer.GeoDataset = dConn.FindGeoDataset(\ Map1.Layers.Add mLayer

2、增加栅格图层

增加图像文件相对简单,只要声明一个新的Imagelayer对象,利用Imagelayer对象的File属性确定对应的图像文件,再在图层集合对象中利用Add方法增加该Imagelayer对象。

Dim iLayer As New ImageLayer iLayer.File = \

Map1.Layers.Add iLayer

3、Tracking层的操作

利用AddEvent方法可在Tracking层中增加一个新的GeoEvent对象: TrackingLayer.AddEvent(shape,SymbolIndex)

Shape可以是点、线、多边形等图形对象,SymbolIndex是TrackingLayer符号列表中符

号索引,0表示缺省符号。

下面的代码将在Tracking层中增加一个新的GeoEvent对象。 Dim pt As New MapObjects2.Point pt.X = Rnd pt.Y = Rnd

Map1.TrackingLayer.AddEvent pt, 0 下面的代码将演示动态显示图形。

1)利用Timer控件的Interval属性来控制执行操作的时间间隔。Interval的单位为ms,即千分之一秒。

Private Sub Form_Load() Timer1.Interval = 1000

End Sub

Private Sub Timer1_Timer()

Dim pt As New MapObjects2.Point pt.X = Rnd pt.Y = Rnd

Map1.TrackingLayer.AddEvent pt, 0 End Sub

Rnd函数返回0和1之间的随机数。如要清除前面的点,增加Map1.TrackingLayer.ClearEvents

在窗体上设置两个按钮,可以启动和暂停动态显示。 Private Sub Command1_Click() Timer1.Enabled = True End Sub

Private Sub Command2_Click() Timer1.Enabled = False End Sub

4、利用对话框选择需要增加的图层

增加Visual Basic的CommonDialog控件(Microsoft Common Dialog Control 6.0)以便确定文件的路径和文件名。双击“增加图层”按钮进行编程。增加以下的Visual Basic语句。 Private Sub Command1_Click() Dim dc As New DataConnection

Dim gs As GeoDataset

Dim name As String

Dim layer As New MapObjects2.MapLayer CommonDialog1.Filter = \ CommonDialog1.ShowOpen dc.Database = CurDir

Name = CommonDialog1.FileTitle Set gs = dc.FindGeoDataset(name) layer.GeoDataset = gs Map1.Layers.Add layer End Sub

执行程序,点击增加图层按钮,并选择所要显示的Shape文件,选择的图层将显示在地图中。

CurDir[(Drive)],指定一个存在的驱动器。如果没有指定驱动器,或drive是零长度字符串(“”),则CurDir会返回当前驱动器的路径。

5、 利用图例操作图层

在工程/部件下选中ESRI MapObjects Legend Control,图例控件将显示在控件栏中。利用图例控件在Form上画图例框架。

1)利用legend1.setMapSource Map1使图例与相应的地图控件关联。

2)当增加图层或删除图层时,利用legend1.LoadLegend True更新图例。 3)当在图例上设置图层可见或不可见时,利用Map1.Refresh刷新地图。 Private Sub Form_Load() legend1.setMapSource Map1

End Sub

Private Sub Map1_AfterLayerDraw(ByVal index As Integer, ByVal canceled As Boolean, ByVal hDC As stdole.OLE_HANDLE)

legend1.LoadLegend True End Sub

Private Sub legend1_AfterSetLayerVisible(Index As Integer, isVisible As Boolean) Map1.Refresh

End Sub

程序运行后,在图例框架上将显示各个图层,通过拖动图层可以改变图层的显示顺序,点击图层的复选框可以设置图层是否可见。

删除选中图层

Dim n As Integer

n = legend1.getActiveLayer Map1.Layers.Remove (n)

四、坐标系

1、控件坐标和地图坐标

地图控件的坐标系与VB窗体的坐标系一样,原点在左上角,从左到右,x坐标逐渐增加;从上到下,y坐标逐渐增加。坐标的缺省单位为twip。当我们定义了一个地图控件,该控件的坐标范围将保持不变。

地图坐标系是笛卡尔坐标系,从左到右,x坐标逐渐增加;从下到上,y坐标逐渐增加。地图控件的地图坐标范围不是固定的,随着地图的放大、缩小和漫游发生变化。

根据地图控件的坐标范围以及地图的坐标范围,我们可以对控件坐标和地图坐标进行转换。

控件坐标转为地图坐标,利用ToMapPoint方法。

地图坐标转为控件坐标,利用FromMapPoint方法。

Dim mapx As Single Dim mapy As Single

Text1.Text = \

mapx = Map1.ToMapPoint(X, Y).X

mapy = Map1.ToMapPoint(X, Y).Y

Text2.Text = \

2、显示矢量图层的坐标系信息

矢量图层的坐标系信息保存在prj文件中,它记录坐标系类型(地理坐标或投影坐标)、Datum、单位等信息。

利用MapLayer的CoordinateSystem属性可得到GeoCoordSys对象或ProjCoordSys对象,可通过返回对象的IsProjected属性来判断是GeoCoordSys对象还是ProjCoordSys对象。

如是GeoCoordSys对象,通过该对象的Datum属性得到Datum对象,进一步可得到Datum的详细信息;同样可以得到Unit等其它属性的详细信息。

如是ProjCoordSys对象,通过该对象的GeoCoordSys属性得到投影前的地理坐标系信息;利用Projection属性得到有关的投影信息,同样可以得到其它属性的详细信息。

下面的代码是在文本框中显示图层的相关坐标系信息。

Dim ly As MapObjects2.MapLayer

Dim gcs As New MapObjects2.GeoCoordSys Dim pcs As New MapObjects2.ProjCoordSys Set ly = Map1.Layers(0)

If ly.CoordinateSystem.IsProjected Then Set pcs = ly.CoordinateSystem Text1.Text = \投影坐标系\

Text2.Text = pcs.GeoCoordSys.Datum.Name Text3.Text = pcs.Unit.Name

Text4.Text = pcs.Projection.Name Else

Set gcs = ly.CoordinateSystem Text1.Text = \地理坐标系\ Text2.Text = gcs.Datum.Name Text3.Text = gcs.Unit.Name Text4.Text = \ End If

3、改变Map控件的坐标系

改变Map控件的坐标系将使控件中的地图以新的坐标系来显示。

改变Map控件坐标系的方法是先定义一个坐标系对象(GeoCoordSys对象或ProjCoordSys对象),然后赋与Map控件的CoordinateSystem属性。

下面的代码是把Map控件的坐标系改变成地理坐标系(图4—1)。

Dim gcs As New MapObjects2.GeoCoordSys gcs.Type = moGeoCS_WGS1984 Map1.CoordinateSystem = gcs Text1.Text = \地理坐标系\ Text2.Text = gcs.Datum.Name Text3.Text = gcs.Unit.Name

Text4.Text = \

下面的代码是把Map控件的坐标系改变成投影坐标系(图4—2)。 Dim pcs As New MapObjects2.ProjCoordSys pcs.Type = moProjCS_World_WinkelII Map1.CoordinateSystem = pcs Text1.Text = \投影坐标系\

Text2.Text = pcs.GeoCoordSys.Datum.Name Text3.Text = pcs.Unit.Name

Text4.Text = pcs.Projection.Name

图4—1 Map控件的坐标系改变成地理坐标系

图4—2 Map控件的坐标系改变成投影坐标系

五、地图显示范围操作 1、 地图显示范围

在Map控件上显示的地图范围可以通过Map控件的Extent属性来得到和设置。Map控件的“Extent”属性返回rectangle对象,反映在Map控件中显示的地图范围,由Top(左上角y坐标)、Left(左上角x坐标)、Bottom(右下角y坐标)和Right(右下角x坐标)四

个坐标值组成。

通过“Extent”设置地图的显示范围,有如下几种方法: 1) 通过坐标赋值设置地图范围

With Map1.Extent .Left = 20000 .Bottom = 45000 .Right = 32000

.Top = 57000 End With

2)设置为所有图层的最大范围

Set Map1.Extent = Map1.FullExtent

3)对目前的范围乘以一个比例因子,改变范围的大小 Set Map1.Extent = Map1.Extent.ScaleRectangle(.5) 4)通过地图交互改变显示范围的位置(地图漫游) Set Map1.Extent = Map1.Pan

5)使地图的中心点定位在某一位置

Set Map1.Extent = Map1.CenterAt(55000,65000)

改变显示范围的大小实际上改变地图的显示比例尺。地图比例尺是Map控件的屏幕范围(长度或高度)与实际范围(长度或高度)的比值。在VB中,窗体的缺省单位是twips,是1英寸的1/1440。通过Map控件的Width和height属性可得到Map控件的宽度和高度(屏幕范围,单位是twips),通过换算并与地图实际的宽度或高度比较即可得到地图比例尺(利用宽度或高度结果一致)。

2、地图的放大、缩小和全图显示(按钮方式)

地图的放大、缩小和全图显示实际上是改变地图的显示范围。在同一Map控件中,显示范围越大,则比例尺越小;反之,比例尺越大。即:地图放大是通过缩小地图范围;地图缩小是通过扩大地图范围。

定义地图范围的Rectangle对象可以利用ScaleRectangle (ScaleFactor)方法来改变,如比例因子为2,则Rectangle的高度和宽度都乘以2,地图缩小1倍。如地图放大1倍,则比例因子为0.5。

在Form上增加三个按钮(command1、command2和command3),功能分别为放大、缩小和全图。针对按钮的点击事件执行如下相应的程序。 Private Sub command1_Click() Set Rect = Map1.Extent Rect.ScaleRectangle (0.25) Map1.Extent = Rect End Sub

Private Sub command2_Click() Set Rect = Map1.Extent Rect.ScaleRectangle (1.25) Map1.Extent = Rect

End Sub

Private Sub command2_Click()

Map1.Extent = Map1.FullExtent

End Sub

3、 地图的放大、缩小、漫游(工具方式)

利用工具方式进行地图操作包括两个事件,第一个事件是工具栏上的按钮点击事件;第二个事件是Map控件上的操作事件(MouseDown事件)。

对第一个事件的响应通常是改变鼠标指针的形状(表4—1),同时记录按钮的功能。

Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button) Select Case Button.Index

Case 1

Map1.MousePointer = moZoomIn bfunction = \ Case 2

Map1.MousePointer = moZoomOut bfunction = \ Case 3

Map1.MousePointer = moPan bfunction = \ End Select End Sub

表4—1 鼠标指针

常数 MoDefault MoArrow MoCross MoIbeam moIconPointer MoSizePointer MoSizeNESW MoSizeNS MoSizeNWSE MoSizeWE MoUpArrow MoHourglass MoNoDrop moArrowHourglass moArrowQuestion MoSizeAll MoZoom MoZoomIn MoZoomOut MoPan MoPanning MoIdentify MoLabel MoHotLink MoPencil 值 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 50 51 52 53 54 55 56 57 58 描述 Default cursor. Arrow Cross hair. I beam. Icon. (Available on Windows NT only) Size Size NE, SW Size N, S. Size NW, SE Size W, E Up arrow. Hourglass No drop. Arrow and hourglass Arrow and question mark Size in all directions Zoom Zoom in Zoom out Pan Panning Identify Label Hot Link Pencil

对第二个事件的响应是根据点击按钮的功能(为了获得点击按钮的功能,需要在声明段中定义一个模块级变量),分别执行相应的代码。如是放大事件,则利用Map控件的TrackRectangle返回用户在地图上定义的Rectangle,并作为放大后地图的范围;如是缩小事件,则根据定义的Rectangle大小确定比例,即地图控件高度(或宽度)与用户定义的Rectangle高度(或宽度)之比,Rectangle越小,缩小的比例越大;如是漫游功能,则利用Map控件的Pan方法。

Private Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Select Case bfunction Case \

Set r = Map1.TrackRectangle Map1.Extent = r

Case \

Set r = Map1.TrackRectangle

r.ScaleRectangle (Map1.Extent.Width / r.Width) Map1.Extent = r Case \ Map1.Pan End Select End Sub

当r.Width = 0(即鼠标点击时),程序将出错。为了避免出错,对r.Width是否为0进行判断,如不为0, 把r.Width赋给一个变量rw,如r.Width为0,则把目前地图宽度Map1.Extent.Width赋给变量rw,即鼠标点击后,图层不发生变化。

六、几何图形对象

在MO中,定义了7个图形对象:Point,Points,Line,Polygon,Rectangle,Ellipse和Parts。

Point对象表示一个点,通过X、Y、Z属性可以获得点的坐标,也可以产生一个点; Point对象还提供了计算到点、线、多边形和矩阵之间距离的方法DistanceTo,计算与其他地理对象的交点的方法GetCrossings。

Points对象是点对象的集合,通过Add方法可以把一个新的点增加到Points对象中。 Line对象至少有两个点,一个线对象可以一条线,也可以是多条线,利用Parts属性可以获得线的集合。

Polygon,Rectangle,Ellipse都是广义上的多边形对象,一个多边形对象可以由多个多边形对象组成,利用Parts属性可以获得多边形的集合。

Parts对象是Points对象的集合,每一个Points对象表示了组成一条线或一个多边形的顶点。

图形对象只能增加到TrackingLayer中,利用AddEvent方法可以把图形对象增加到TrackingLayer中。

Map1.TrackingLayer.AddEvent(shape, SymbolIndex) 1、 在程序中产生图形 1.1产生点

Dim pt As New MapObjects2.Point

pt.X = 0.5 pt.Y = 0.5 1.2 产生线

Dim pt As New MapObjects2.Point Dim pts As New MapObjects2.Points Dim ln As New MapObjects2.Line pt.X = 0.2 pt.Y = 0.7 pts.Add pt pt.X = 0.6 pt.Y = 0.5 pts.Add pt

ln.Parts.Add pts

1.3产生多边形(多Part)

Dim pt As New MapObjects2.Point Dim pts1 As New MapObjects2.Points Dim pts2 As New MapObjects2.Points Dim poly As New MapObjects2.Polygon pt.X = 0.7: pt.Y = 0.15: pts1.Add pt pt.X = 0.4: pt.Y = 0.55: pts1.Add pt pt.X = 0.3: pt.Y = 0.3: pts1.Add pt

poly.Parts.Add pts1

pt.X = 0.7: pt.Y = 0.15: pts2.Add pt pt.X = 0.1: pt.Y = 0.55: pts2.Add pt pt.X = 0.05: pt.Y = 0.3: pts2.Add pt

poly.Parts.Add pts2

Map1.TrackingLayer.AddEvent poly, 0 1.4 产生矩形

矩形有Bottom、Top、Left、Right、Height、Width、Depth、Center等属性。利用Bottom、Top、Left、Right值可以构建一个矩形。

Dim rect as New MapObjects2.Rectangle rect.Bottom = 0.1: rect.Left = 0.1

rect.Top = 0.6: rect.Right = 0.6

Map1.TrackingLayer.AddEvent rect, 0

1.5产生椭圆

椭圆同样有Bottom、Top、Left、Right、Height、Width、Center等属性。利用Bottom、Top、Left、Right值可以构建一个椭圆。

Dim ellipse As New MapObjects2.ellipse ellipse.Bottom = 0.1: ellipse.Left = 0.1 ellipse.Top = 0.6: ellipse.Right = 0.9

Map1.TrackingLayer.AddEvent ellipse, 0

2、 利用鼠标在地图控件上产生图形

可以利用鼠标在地图控件上产生点、线、圆、多边形和矩形。语法如下:

Set shape = Map1.ToMapPoint(x, y)

Set shape = Map1.TrackLine

Set shape = Map1.TrackCircle Set shape = Map1.TrackPolygon Set shape = Map1.TrackRectangle

执行语句时,用户可以在地图控件上数字化点(或线、圆、多边形、矩形),同时返回一个图形对象(数字化结果)。

Select Case bfunction

case \

Dim pt As New MapObjects2.Point Set pt = Map1.ToMapPoint(X, Y) Map1.TrackingLayer.AddEvent pt, 0 case \

Dim line As New MapObjects2.line Set line = Map1.TrackLine

Map1.TrackingLayer.AddEvent line, 0 case \

Dim poly As New MapObjects2.Polygon Set poly = Map1.TrackPolygon Map1.TrackingLayer.AddEvent poly,0 End Select

3、图形对象操作

图形操作包括图形的交、并、差、异或以及缓冲等操作,这些操作的语法如下:

1) 交操作 Set resultShape = object.Intersect(secondShape [,extent])

2) 并操作 Set resultShape = object.Union(secondShape [,extent]) 3) 差操作 Set resultShape = object.Difference(secondShape [,extent]) 4) 异或操作Set resultShape = object.Xor(secondShape [,extent])

5) 缓冲操作 Set resultShape = object.Buffer(bufferDistance [,extent])

其中,extent是一个可选参数,表示一个矩阵范围。

以下的例子是对动态图层上的两个多边形进行交操作,并显示交操作得到的图形(图6—1)。

Set poly1 = Map1.TrackingLayer.Event(0).Shape

Set poly2 = Map1.TrackingLayer.Event(1).Shape Set resultshape = poly1.Intersect(poly2) Map1.TrackingLayer.ClearEvents

Set ge = Map1.TrackingLayer.AddEvent(resultshape, 0)

图6—1 交操作

七 地图表示

当我们在地图控件上增加一个图层时,该图层的所有要素以一种缺省的符号进行显示。一方面,我们可以改变显示的符号,另一方面我们可以对图层中的不同要素以不同的符号进行显示(专题制图)。 1、 显示符号

在MO中,Symbol是一个符号对象,它有SymbolType(符号类型)、Style(样式)、Color(颜色)、Size(尺寸)等属性。符号类型包括点(Point)、线(Line)和多边形(Fill),不同类型的符号可以设置的属性是不一样的,如轮廓线颜色只能对多边形符号进行设置。 Style是指符号的样式,点、线和多边形三种类型符号分别有相应的样式集合(图7—1,图7—2,图7—3)。

图7—1点符号样式集合

图7—2 线符号样式集合

图7—3填充符号样式集合

利用符号对象的Custom特性可以产生定制的点、线和填充符号。

每一符号可以用不同颜色显示,颜色的定义有几种方法:利用VB颜色常数,如vbBlue,或利用MO颜色常数,如moRed。MapObjects定义了如下23种颜色常量:MoBlack,MoRed,MoGreen,moBlue,moMagenta,moCyan,moWhite,moLightGray,moDarkGray,moGray,moPaleYellow,molightYellow,moyellow,moLimeGreen,moTeal,moDarkGreen,moMaroon,moPurple,moOrange,moKhaki,moOlive,moBrown,moNavy。

对点符号,还可以设置符号尺寸、旋转等属性。

对线符号,还可以设置线的宽度等属性。

对填充符号,还可以设置多边形轮廓线的宽度、颜色等属性。 利用符号对象的Custom特性可以产生定制的点、线和填充符号。

改变图层的显示符号,首先是得到图层的符号对象,然后对符号对象的属性进行赋值,地图刷新后,即以新的符号显示。

下面的代码是改变MapLayer的符号为moRed。 Dim ly As MapObjects2.MapLayer Set ly = Map1.Layers(0) Ly.Symbol.Color = moRed

Map1.Refresh

如要改变符号的多个属性,可利用With语句定义 With ly.Symbol .Style = 2 .Color = moRed

.Size = 20 End With

2、 利用图例改变地图显示符号

包括两个过程,首先是点击图例中的一个图层,打开符号编辑窗口;然后在符号编辑窗口中设置符号属性,确认后,该图层以新的符号显示。

点、线、多边形三种类型图层分别用Point、Line和Fill三种符号表示。这三种符号可以设置的属性是不一样的,针对不同类型的图层,在符号编辑窗口中显示不同的界面(图)。

对话框包括五个Label控件、一个PictureBox控件、三个组合框控件、一个文本框控件以及一个命令按纽控件。

Label控件的Caption属性在程序中设置,当点击的图层是点图层时,五个Label控件的Caption分别为:Marker Color、Style、Size、Font和Character Index;当点击的图层是线图层时,前三个Label控件的Caption分别为:Line Color、Style和Line width,后两个Label控件不显示;当点击的图层是多边形图层时,前三个Label控件的Caption分别为:Fill Color、Style和Outline width,后两个Label控件不显示。

PictureBox控件不显示图片,只显示背景颜色,初始背景颜色是点击图层原有的颜色,可通过Layer.Symbol.Color语句获得。点击PictureBox控件,将打开颜色选择对话框(Commondialog1.ShowColor),用户在颜色框中选择一个颜色,该颜色将作为PictureBox控件的背景颜色。

第一个组合框控件用于显示符号的Style,可通过组合框的AddItem方法把不同的Style名称增加到组合框中。不同类型符号的Style是不一样。确省的Style是点击图层原有的Style,可通过Layer.Symbol.Style语句获得。用户在组合框中选择一个Style,该Style将作为选中的Style。

当点击的图层是点图层,显示第二和第三个组合框。 当Style是moTrueType(字符形式的符号)时,第二个组合框用于显示所有Font的名称(C:\\WINDOWS\\Fonts\\),可利用组合框的AddItem Screen.Fonts(i),确省的Font可利用layer.Symbol.Font.Name语句获得。

Private Sub Combo1_Click()

Dim i As Integer

Dim fnt As New StdFont

If Combo1.Text = \ For i = 0 To Screen.FontCount - 1 Combo2.AddItem Screen.Fonts(i) Next i

Combo2.Text = lyr.Symbol.Font.Name End If End Sub

当用户在第二个组合框中选中一个Font,第三个组合框用于显示该Font中的所有TrueType marker符号。首先是定义Font名称(fnt.Name = Combo2.Text),然后,把该字体中的所有TrueType符号增加到第三个组合框中(在增加符号前可以把原有清除),所有Font中的字符索引(index)都是从0到255。

Private Sub Combo2_Click() Dim i As Integer Dim fnt As New StdFont fnt.Name = Combo2.Text Combo3.Clear Combo3.Font = fnt For i = 0 To 255

Combo3.AddItem Chr(i) Next End Sub

文本框控件用于显示点符号的Size、线符号的width或多边形符号的Outline width,都是用数字表示,初始的值通过Layer.Symbol.Size语句获得,用户可以在文本框中输入一个值。

点击OK按钮,分别把PictureBox控件的背景颜色、组合框控件的列表选择和文本框控件的输入值作为图层符号的颜色、Style和Size,并对地图进行刷新,刷新后的地图以新的符号显示。

Dim sym As MapObjects2.Symbol Set sym = lyr.Symbol

sym.Color = Picture1.BackColor sym.Style = Combo1.ListIndex sym.Size = Text1.Text

If sym.Style = moTrueTypeMarker Then Dim fnt As New StdFont fnt.Name = Combo2.Text Set sym.Font = fnt

sym.CharacterIndex = Asc(Combo3.Text) End If

Form1.legend1.LoadLegend True Form1.Map1.Refresh

3、 地图显示方式(专题制图)

在MapObjects中,有8个renderer对象(ValueMapRenderer对象、ClassBreaksRenderer对象、DotDensityRenderer对象、ChartRenderer对象、ZRenderer对象、EventRenderer对象、LabelRenderer对象和GroupRenderer对象),分别用于不同的地图显示方式。 2.1 ValueMapRenderer(按要素字段值显示地图)

按要素字段值显示地图即不同字段值的要素用不同的符号表示,如一个图层表示土地地块,有些地块为居住用地,有些地块为公园,有些为工业用地,等等,我们根据土地利用类型用不同符号表示,就可以利用ValueMapRenderer对象。

Set recset = Map1.Layers(0).Records For Each f In recset.Fields List1.AddItem f.Name Next f End Sub

List的ListIndex属性设置或返回控件中当前选中项目的索引。

图8—1 选中字段统计

本文来源:https://www.bwwdw.com/article/x6ba.html

Top