个坐标值组成。
通过“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)