1、基于组件的GIS开发Visual BasicVisual Basic和和MapObjectsMapObjects实现实现 第一章 MapObjects介绍 技术的产生 利用GIS支撑软件进行二次开发可以充分利用支撑软件所具有的强大功能,开发比较容易,但开发的系统要在支撑软件的环境中运行,系统往往比较庞大,相应成本也高,对某些地图和空间分析只是部分功能的系统来说,二次开发就不太适合。此外二次开发受到原有软件的限制,灵活性没有底层开发大。1 基于上述原因,用户希望GIS支撑软件能组件化,在开发系统时,根据需要利用功能组件。为此,一些GIS公司相继开发了供应用开发人员使用的制图与GIS功能组件,如E
2、SRI公司的MapObjects、MapInfo公司的MapX、中科院地理信息中心的SuperMap等。MapObjects产品 MapObjects简称MO,是ESRI公司开发的一组供开发人员使用的制图与GIS功能组件(ActiveX控件)。ActiveX是当今得到最广泛支持的面向目标的软件集成技术。用户象用砖块盖房子一样利用ActiveX组件开发和集成Windows应用。2 MO目前使用的主要版本为2.0、2.1和2.2。MO2.0于1999年发布;MO2.1于2001年3月,增加了CAD、ArcSDE、StreetMap等文件格式的支持功能;MO2.2发布于2003年1月,主要增加直接读
3、取GIF和TIFF文件等功能。MapObjects 2.0由一个Map控件和46个可编程ActiveX对象所组成,可以直接插入到许多标准开发环境的工具集中,包括VB、Delphi、Visual C+、PowerBuilder等流行的程序设计环境。MapObjects 2.2增加了Legend和Scalebar控件。MapObjects功能 利用MapObjects,开发人员可以实现如下的GIS功能:显示具有多个图层的地图 地图的放大、缩小和漫游 增加点、线、圆和多边形等各种图形 增加文本 显示特征的属性 利用图形选择特征 利用邻近分析选择特征3 利用SQL表达式选择特征 选择特征的统计 查询和
4、更新选择特征的属性数据 各种专题制图 按字段的高程或测量值显示 按字段值对特征进行标号 显示遥感图像 实时或时间序列数据的动态显示 地理编码 利用特征的测量值显示点和线事件 地图坐标转换 地图的空间操作 地图的旋转在Visual Basic下使用MapObjects 打开Visual Basic的程序开发环境,增加MapObjcts控件(Map控件)到控件工具框中。如果要在应用程序中加入地图,则在控件栏中选择Map控件,利用该控件画一个图框用于显示地图。Map控件属性设置,包括所要显示的图层、显示顺序、每一图层的显示特性等。根据需要增加其他控件,并利用MO提供的对象进行编程。4Map控件属性设
5、置图层属性设置程序运行界面如何学习MO 利用MapObjects在线帮助 在地图控件处于活动(选中)状态下,按F1将打开MO在线帮助。MO在线帮助含有每个对象的特性、方法、事件和变量的详细文档。学习MapObjects的最好方法是在在线帮助中利用编码例子。大多数帮助条目含有可以在VB工程中执行的例子。5 阅读开发实例 MO还有许多实例(ESRIMapObjectsSamplesVB),它们的Form设计和代码可以参考。第二章 MapObjects对象 MO中有46个对象,可以划分成5个大类:数据操作对象类(10个)地图显示对象类(17个)投影对象类(8个)图形对象类(7个)地址匹配对象类(4个
6、)对象是根据需要而产生的。对象可以是具体的实体(如学生),也可以是反映实体性质的特征(如成绩)。通过对象的属性(或方法)可以得到新的对象或属性信息(如通过学生的成绩属性可以得到成绩对象,通过成绩对象的属性又可以得到具体的成绩信息,如数学成绩);可以利用对象或值对对象的属性进行赋值(如定义一个成绩对象并把它赋给一个学生的成绩属性;通过把具体的值赋给一个成绩对象来定义一个成绩对象)。DataConnection对象GeoDatasets集合GeoDataset对象Recordset对象Fields集合Field对象Statistics对象TableDesc对象Table对象Strings集合通过G
7、eoDatasets属性通过Item方法通过Fields属性通过Item方法通过CalculateStatistics方法通过TableDesc属性通过Records属性通过Database等属性与数据库或文件目录建立连接数据操作对象类MapLayer对象通过GeoDataset属性通过Records属性 通过定义DataConnection对象可以确定连接的数据库或文件目录。利用DataConnection对象的GeoDatasets属性可以得到图层数据的集合对象(GeoDatasets)。利用GeoDatasets的Item方法可以得到其中的一个图层文件。利用Layers集合的Add方法可
8、以把图层文件增加到地图控件中,并作为一个MapLayer对象。利用MapLayer对象的Records属性可以得到Recordset对象。通过Recordset对象的Fields属性可以得到Fields集合;通过Fields集合的Item方法可以得到其中的一个Field对象。通过Recordset对象的MoveFirst、MoveNext、MovePrevious方法可以对Recordset对象中的记录进行定位。Map控件Layers集合MapLayer对象ImageLayer对象TrackingLayer对象GeoEvent对象通过Item方法通过TrackingLayers属性通过Laye
9、rs属性通过Event属性地图显示对象类Event Renderer对象ZRenderer对象Chart Renderer对象TextSymbol对象Symbol对象 ClassBreaks Renderer对象ValueMap Renderer对象 DotDensity Renderer对象 Label Renderer对象 Group Renderer对象LabelPlacer对象 Map Control上的图层包括MapLayer、ImageLayer和TrackingLayer。一个Map Control只有一个TrackingLayer。MapLayer和ImageLayer的集合所
10、对应的对象为Layers。MapLayer有不同的显示方式,通过给MapLayer的Symbol属性赋值,使MapLayer以新的符号显示;通过给MapLayer的Renderer属性赋值,使MapLayer以新的显示方式显示。GeoTransformation对象GeoCoordSys对象ProjCoordSys对象Projection对象Prime Meridian对象Datum对象Unit对象Spheroid对象Map控件MapLayer对象投影对象类 有两种类型坐标系;地理坐标系和投影坐标系。通过Prime-Meridian、Datum和Unit三个对象可以定义一个地理坐标系,其中,D
11、atum包括Spheroid对象的定义。通过GeoCoord、SysProjCoordSys和Unit三个对象可以定义一个投影坐标系。Map控件和MapLayer对象有CoordinateSystem属性,该属性可以用GeoCoordSys对象或ProjCoordSys对象来赋值。同时GeoCoordSys对象和ProjCoordSys对象又可以通过Type属性定义具体的坐标类型。MapLayer对象有GeographicTransformation属性,该属性可以用GeoTransformation对象来赋值,GeoTransformation对象有type属性用于定义坐标变换类型。图形对象
12、类Point对象Points对象Line对象Polygon对象Rectangle对象Ellipse对象通过Item方法Parts 集合通过Parts属性通过Add方法通过Bottom、Left、Top和Right四个属性可以定义一个Rectangle对象Ellipse对象 通过Point对象的x、y属性可以定义一个点。通过Points对象的Add方法可以把一个点增加到Points对象中。一个线对象和一个多边形对象可以是多个部分(Parts)组成,通过Parts属性可以得到Parts集合。Parts集合的Add方法可以把Points对象增加到Parts集合。AddressLocation对象St
13、andardizer对象Geocoder对象PlaceLocator对象地址匹配对象类第三章 地图与图层 在MO中,Map Control(地图控件)是一个载体,可以在地图控件上增加一个或多个图层。MO支持三种类型图层:矢量图层、栅格图层和动态(Tracking)图层,所对应的对象分别为MapLayer、ImageLayer和TrackingLayer。矢量图层和栅格图层分别用于显示矢量数据和栅格数据,栅格图层和动态图层的集合所对应的对象为Layers(图层集合对象)。动态图层用于显示动态数据,如通过GPS采集到的车辆移动中的位置数据。在TrackingLayer层显示的对象称为GeoEven
14、t对象。一个地图控件只有一个TrackingLayer层。当在窗体中增加一个地图控件时,就会有一个TrackingLayer层,这时,没有GeoEvent对象,GeoEvent对象的EventCount属性为0。增加矢量图层 矢量图层是和具体的数据相关联,要增加矢量图层,首先要确定(连接)对应的数据。连接的方法是利用DataConnection和GeoDataset两个对象。利用DataConnection对象的Database属性可以定义矢量数据所在的路径。利用DataConnection对象的FindGeoDataset(“文件名”)方法可以得到指定路径下的文件,并返回GeoDataset
15、对象。利用该对象对MapLayer的GeoDataset属性进行赋值,使MapLayer与具体的数据文件关联。在图层集合中增加该图层。1 Dim dConn As New MapObjects2.DataConnection Dim mLayer As New MapObjects2.MapLayer dConn.Database=c:“Set mLayer.GeoDataset=dConn.FindGeoDataset(landuse)Map1.Layers.Add mLayer增加栅格图层 增加图像文件相对简单,只要声明一个新的Imagelayer对象,利用Imagelayer对象的Fil
16、e属性确定对应的图像文件,再在图层集合对象中利用Add方法增加该Imagelayer对象。2Dim iLayer As New ImageLayer iLayer.File=c:p1.jpg Map1.Layers.Add iLayerTracking层的操作 利用AddEvent方法可在Tracking层中增加一个新的GeoEvent对象:TrackingLayer.AddEvent(shape,SymbolIndex)Shape可以是点、线、多边形等图形对象,SymbolIndex是TrackingLayer符号列表中符号索引,0表示缺省符号。3Dim pt As New MapObjec
17、ts2.Point pt.X=Rnd pt.Y=Rnd Map1.TrackingLayer.AddEvent pt,0 在TrackingLayer中增加一个点事件的代码Rnd表示产生一个随机数(01之间)Private Sub Form_Load()Timer1.Interval=1000End Sub Private Sub Timer1_Timer()Dim pt As New MapObjects2.Point pt.X=Rnd pt.Y=Rnd Map1.TrackingLayer.AddEvent pt,0End Sub以一定的时间间隔增加点事件的代码如要清除前面的点,可以在一开
18、始增加Map1.TrackingLayer.ClearEvents在窗体上设置两个按钮,可以启动和暂停动态显示。Private Sub Command1_Click()Timer1.Enabled=TrueEnd SubPrivate Sub Command2_Click()Timer1.Enabled=FalseEnd Sub利用对话框选择需要增加的图层 CommonDialog1.Filter=“ESRI Shapefiles(*.shp)|*.shp“,对对话框中显示的文件进行过滤。CommonDialog1.ShowOpen,打开对话框。CurDir,返回用户选中文件的路径。name=
19、CommonDialog1.FileTitle,只返回用户选中的文件,不包括路径。4 Dim dc As New DataConnectionDim name As StringDim layer As New MapObjects2.MapLayer CommonDialog1.Filter=Shapefiles(*.shp)|*.shp CommonDialog1.ShowOpen dc.Database=CurDir Name =CommonDialog1.FileTitle Set layer.GeoDataset=dc.FindGeoDataset(name)Map1.Layers.
20、Add layer利用图例操作图层 在工程/部件下选中ESRI MapObjects Legend Control,图例控件将显示在控件栏中。利用图例控件在Form上画图例框架。利用legend1.setMapSource Map1使图例与相应的地图控件关联。当增加图层或删除图层时,利用legend1.LoadLegend True更新图例。当在图例上设置图层可见或不可见时,利用Map1.Refresh刷新地图。5Private Sub Form_Load()legend1.setMapSource Map1End SubPrivate Sub Map1_AfterLayerDraw()leg
21、end1.LoadLegend TrueEnd SubPrivate Sub legend1_AfterSetLayerVisible()Map1.RefreshEnd Sub 程序运行后,在图例框架上将显示各个图层,通过拖动图层可以改变图层的显示顺序,点击图层的复选框可以设置图层是否可见。删除选中图层 利用legend控件的getActiveLayer方法得到选中图层的索引号。利用Layers的Remove(n)方法删除第n个图层。Dim n As Integer n=legend1.getActiveLayer Map1.Layers.Remove(n)第四章 坐标系 控件坐标和地图坐标
22、地图控件的坐标系与VB窗体的坐标系一样,原点在左上角,从左到右,x坐标逐渐增加;从上到下,y坐标逐渐增加。坐标的缺省单位为twip。当我们定义了一个地图控件,该控件的坐标范围将保持不变。地图坐标系是笛卡尔坐标系,从左到右,x坐标逐渐增加;从下到上,y坐标逐渐增加。地图控件的地图坐标范围不是固定的,随着地图的放大、缩小和漫游发生变化。1 据地图控件的坐标范围以及地图的坐标范围,我们可以对控件坐标和地图坐标进行转换。控件坐标转为地图坐标,利用ToMapPoint方法。地图坐标转为控件坐标,利用FromMapPoint方法。Dim mapx As SingleDim mapy As Single T
23、ext1.Text=x:&X&,&y:&Y mapx=Map1.ToMapPoint(X,Y).X mapy=Map1.ToMapPoint(X,Y).Y Text2.Text=mapx:&mapx&,&mapy:&mapy显示矢量图层的坐标系信息 矢量图层的坐标系信息保存在prj文件中,它记录坐标系类型(地理坐标或投影坐标)、Datum、单位等信息。利用MapLayer的CoordinateSystem属性可得到GeoCoordSys对象或ProjCoordSys对象,可通过返回对象的IsProjected属性来判断是GeoCoordSys对象还是ProjCoordSys对象。2 如是Geo
24、CoordSys对象,通过该对象的Datum属性得到Datum对象,进一步可得到Datum的详细信息;同样可以得到Unit等其它属性的详细信息。如是ProjCoordSys对象,通过该对象的GeoCoordSys属性得到投影前的地理坐标系信息;利用Projection属性得到有关的投影信息,同样可以得到其它属性的详细信息。Dim ly As MapObjects2.MapLayerDim gcs As New MapObjects2.GeoCoordSysDim pcs As New MapObjects2.ProjCoordSys Set ly=Map1.Layers(0)If ly.Coo
25、rdinateSystem.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 改变Map控件的坐标系
26、 改变Map控件的坐标系将使控件中的地图以新的坐标系来显示。改变Map控件坐标系的方法是先定义一个坐标系对象(GeoCoordSys对象或ProjCoordSys对象),然后赋与Map控件的CoordinateSystem属性。3Dim 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.
27、Text=pcs.Projection.Name 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控件上显示的地图范围可以通过Map控件的Extent属性来得到和设置。Map控件的“Extent”属性返回rectangle对象,
28、反映在Map控件中显示的地图范围,由Top(左上角y坐标)、Left(左上角x坐标)、Bottom(右下角y坐标)和Right(右下角x坐标)四个坐标值组成。1 通过“Extent”设置地图的显示范围,有如下几种方法:通过坐标赋值设置地图范围With Map1.Extent .Left=20000 .Bottom=45000 .Right=32000 .Top=57000End With 设置为所有图层的最大范围 Set Map1.Extent=Map1.FullExtent 对目前的范围乘以一个比例因子,改变范围的大小 Set Map1.Extent=Map1.Extent.ScaleRec
29、tangle(.5)通过地图交互改变显示范围的位置(地图漫游)Set Map1.Extent=Map1.Pan 使地图的中心点定位在某一位置 Set Map1.Extent=Map1.CenterAt(55000,65000)改变显示范围的大小实际上改变地图的显示比例尺。地图比例尺是Map控件的屏幕范围(长度或高度)与实际范围(长度或高度)的比值。在VB中,窗体的缺省单位是twips,是1英寸的1/1440。通过Map控件的Width和height属性可得到Map控件的宽度和高度(屏幕范围,单位是twips),通过换算并与地图实际的宽度或高度比较即可得到地图比例尺(利用宽度或高度结果一致)。地
30、图的放大、缩小和全图显示(按钮方式)地图的放大、缩小和全图显示实际上是改变地图的显示范围。在同一Map控件中,显示范围越大,则比例尺越小;反之,比例尺越大。即:地图放大是通过缩小地图范围;地图缩小是通过扩大地图范围。定义地图范围的Rectangle对象可以利用ScaleRectangle(ScaleFactor)方法来改变,如比例因子为2,则Rectangle的高度和宽度都乘以2,地图缩小1倍。如地图放大1倍,则比例因子为0.5。2 Private Sub command1_Click()Set Rect=Map1.Extent Rect.ScaleRectangle(0.25)Map1.Ex
31、tent=Rect End Sub Private Sub command2_Click()Set Rect=Map1.Extent Rect.ScaleRectangle(1.25)Map1.Extent=RectEnd Sub Private Sub command2_Click()Map1.Extent=Map1.FullExtentEnd Sub地图的放大、缩小、漫游(工具方式)利用工具方式进行地图操作包括两个事件,第一个事件是工具栏上的按钮点击事件;第二个事件是Map控件上的操作事件(MouseDown事件)。对第一个事件的响应通常是改变鼠标指针的形状,同时记录按钮的功能。3Priv
32、ate Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)Select Case Button.Index Case 1 Map1.MousePointer=moZoomIn bfunction=zoomin Case 2 Map1.MousePointer=moZoomOut bfunction=zoomout Case 3 Map1.MousePointer=moPan bfunction=pan End SelectEnd SubmoDefault0Default cursor.moArrow1Arrow.moCros
33、s 2Cross hair.moIbeam3I beam.moIconPointer4Icon.(Available on Windows NT only)moSizePointer5Size.moSizeNESW6Size NE,SW.moSizeNS7Size N,S.moSizeNWSE8Size NW,SE.moSizeWE9Size W,E.moUpArrow10Up arrow.鼠标指针类型moHourglass11Hourglass.moNoDrop12No drop.moArrowHourglass13Arrow and hourglass.moArrowQuestion14A
34、rrow and question mark.moSizeAll15Size in all directions.moZoom50ZoommoZoomIn51Zoom inmoZoomOut52Zoom outmoPan 53PanmoPanning54PanningmoIdentify55IdentifymoLabel 56LabelmoHotLink57Hot LinkmoPencil58Pencil 对第二个事件的响应是根据点击按钮的功能(为了获得点击按钮的功能,需要在声明段中定义一个模块级变量),分别执行相应的代码。如是放大事件,则利用Map控件的TrackRectangle返回用户在
35、地图上定义的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 zoomin Set r=Map1.TrackRectangle Map1.Extent=r Case
36、 zoomout Set r=Map1.TrackRectangle r.ScaleRectangle(Map1.Extent.Width/r.Width)Map1.Extent=r Case pan Map1.Pan End SelectEnd Sub 用户在利用工具进行操作时,可能会出现用鼠标点击Map控件。当用鼠标点击Map控件时,除了有Click 事件,同时还有MouseDown和MouseUp事件。对前面的MouseDown事件过程,点击Map控件所返回的矩形其高度和宽度均为0。如选择缩小工具,程序中Map1.Extent.Width/r.Width的分母为0,程序将出错。为了避免出
37、错,对r.Width是否为0进行判断(If r.Width 0),如不为0,则执行相应代码;如为0,则不执行相应代码,即鼠标点击后,图层不发生变化。作业:在状态栏中显示地图比例尺。第六章 几何图形对象 在MO中,定义了7个图形对象:Point,Points,Line,Polygon,Rectangle,Ellipse和Parts。Point对象表示一个点,通过X、Y、Z属性可以获得点的坐标,也可以产生一个点;Point对象还提供了计算到点、线、多边形和矩阵之间距离的方法DistanceTo,计算与其他地理对象的交点的方法GetCrossings。Points对象是点对象的集合,通过Add方法可
38、以把一个新的点增加到Points对象中。Line对象至少有两个点,一个线对象可以一条线,也可以是多条线,利用Parts属性可以获得线的集合。Polygon,Rectangle,Ellipse都是广义上的多边形对象,一个多边形对象可以由多个多边形对象组成,利用Parts属性可以获得多边形的集合。Parts对象是Points对象的集合,每一个Points对象表示了组成一条线或一个多边形的一系列顶点。图形对象只能增加到TrackingLayer中,利用AddEvent方法可以把图形对象增加到TrackingLayer中。Map1.TrackingLayer.AddEvent(shape,Symbol
39、Index)也可以利用Map控件的DrawShape方法。Map1.DrawShape shape,symbol在程序中产生图形 产生点 新建一个点对象;对点对象的x、y属性进行赋值。Dim pt As New MapObjects2.Point pt.X=0.5 pt.Y=0.5 Map1.TrackingLayer.AddEvent pt,01 产生线 新建点、点集和线对象;对点对象的x、y属性进行赋值;点集中增加点对象;把点集作为一个Part增加到线对象的Parts集合中。Dim pt As New MapObjects2.PointDim pts As New MapObjects2.
40、PointsDim ln As New MapObjects2.Linept.X=0.2pt.Y=0.7pts.Add ptpt.X=0.6pt.Y=0.5pts.Add ptln.Parts.Add ptsMap1.TrackingLayer.AddEvent ln,0 产生多边形(多Part)Dim pt As New MapObjects2.PointDim pts1 As New MapObjects2.PointsDim pts2 As New MapObjects2.PointsDim poly As New MapObjects2.Polygon pt.X=0.7:pt.Y=0.
41、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.1:pt.Y=0.15:pts2.Add pt pt.X=0.1:pt.Y=0.35:pts2.Add pt pt.X=0.05:pt.Y=0.3:pts2.Add pt poly.Parts.Add pts2 Map1.TrackingLayer.AddEvent poly,0 产生矩形 矩形有Bottom、Top、Left、Right、Height、Width、Depth、Center等
42、属性。利用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 产生椭圆椭圆同样有Bottom、Top、Left、Right、Height、Width、Center等属性。利用Bottom、Top、Left、Right值可以构建一个椭圆。Dim ellipse As New MapObjects2.ellipseellipse.
43、Bottom=0.1:ellipse.Left=0.1ellipse.Top=0.6:ellipse.Right=0.9Map1.TrackingLayer.AddEvent ellipse,0利用鼠标在地图控件上产生图形 可以利用鼠标在地图控件上产生点、线、圆、多边形和矩形。语法如下:Set shape=Map1.ToMapPoint(x,y)Set shape=Map1.TrackLineSet shape=Map1.TrackCircleSet shape=Map1.TrackPolygonSet shape=Map1.TrackRectangle 执行语句时,用户可以在地图控件上数字化
44、点(或线、圆、多边形、矩形),同时返回一个图形对象(数字化结果)。2Select Case bfunction case drawpoint Dim pt As New MapObjects2.Point Set pt=Map1.ToMapPoint(X,Y)Map1.TrackingLayer.AddEvent pt,0 case drawline Dim line As New MapObjects2.line Set line=Map1.TrackLine Map1.TrackingLayer.AddEvent line,0 case drawpolygon Dim poly As Ne
45、w MapObjects2.Polygon Set poly=Map1.TrackPolygon Map1.TrackingLayer.AddEvent poly,0End Select在工具条上增加画点、画线和画多边形三个按钮,在MouseDown事件过程中增加如下代码。图形对象操作 图形操作包括图形的交、并、差、异或以及缓冲等操作,这些操作的语法如下:交操作 Set resultShape=object.Intersect(secondShape,extent)并操作 Set resultShape=object.Union(secondShape,extent)差操作 Set resul
46、tShape=object.Difference(secondShape,extent)异或操作Set resultShape=object.Xor(secondShape,extent)缓冲操作 Set resultShape=object.Buffer(bufferDistance,extent)其中,extent是一个可选参数,表示一个矩阵范围。3 Set poly1=Map1.TrackingLayer.Event(0).Shape Set poly2=Map1.TrackingLayer.Event(1).Shape Set resultshape=poly1.Intersect(p
47、oly2)Map1.TrackingLayer.ClearEvents Set ge=Map1.TrackingLayer.AddEvent(resultshape,0)多边形交操作:利用画多边形工具在地图控件上画两个多边形,进行交操作后,得到新多边形,并作为事件显示在动态图层上。多边形交操作第七章 地图表示 当我们在地图控件上增加一个图层时,该图层的所有要素以一种缺省的符号进行显示。一方面,我们可以改变显示的符号,另一方面我们可以对图层中的不同要素按照它们的字段值以不同的符号进行显示(专题制图)。显示符号 MapLayer有一个Symbol属性,它返回Symbol对象。Symbol对象有3个
48、类型(moPointSymbol,moLineSymbol和moFillSymbol),不同类型的Symbol对象有不同的属性。点符号、线符号和填充符号都有显示样式(Style)属性,即同一类型有不同样式。每种符号都有颜色特性,可以用不同颜色显示,MO支持23种颜色常数。对点符号,还可以设置符号尺寸、旋转等属性。对线符号,可以设置线的宽度等属性。对填充符号,可以设置多边形轮廓线的宽度、颜色等属性。1不同Style点符号不同Style线符号不同Style填充符号 改变图层的显示符号 得到图层的符号对象;对符号对象的属性进行赋值;地图刷新。Dim sym As Symbol Set sym=Map
49、1.Layers(0).Symbol sym.Color=moRed Map1.Refresh 如要改变符号的多个属性,可利用With语句定义:With ly.Symbol .Style=2 .Color=moRed .Size=20End With利用TrueType符号 TrueType符号是一种字符符号。在Windows中,已定义多种字体(Font)的字符,这些字符可以作为符号显示。MO提供了多种TrueType符号集,如Geology、Weather、Transportaton等,每个符号集中又有多种符号。在C:WINDOWSFonts 下可看到已有的Fonts集合。对点符号,如要以T
50、rueType符号显示,步骤如下:设置点符号的Style属性为moTrueTypeMarker;创建Font对象,定义Font名称;设置点符号的Font属性为定义的Font;设置点符号的CharacterIndex属性(即Font 集合中第几个符号);地图刷新。Dim sym As New MapObjects2.Symbol Set sym=Map1.Layers(0).Symbol sym.Style=moTrueTypeMarker Dim fnt As New StdFont fnt.Name=ESRI Crime Analysis Set sym.Font=fnt sym.Chara