陈尹军 卞正富
摘 要 鹰眼图是地理信息系统(GIS)的一个基本功能。文中简要介绍了MapObjects控件,详细介绍在VB环境下应用MapObjects控件实现鹰眼图的过程。
关键词 MapObjects控件,鹰眼图,VB
地理信息系统(GIS)只有与具体行业的需求结合,才能真正体现地理信息系统的价值和作用,车辆导航电子地图中的鹰眼图就是地理信息系统与具体应用结合的体现。鹰眼图是为了方便用户浏览地图而设。在进行电子地图浏览时,用户要从浏览的区域马上切换到另一处与此不相邻的区域,可通过输入坐标,或利用平移和缩放工具一点一点地将浏览区域挪到目的地,但效率比较低。而如果有鹰眼图,则可以直接在鹰眼图中指定目的地,实现快速切换。此外,鹰眼图还能方便、直观地表示出当前的浏览区域在整个地图区域中的位置,通过设置鹰眼图中矩形框的大小可快速调整主图的显示范围。
一、MapObjects简介
MapObjects是ESRI公司提供的一组供应用开发使用的制图与GIS功能组件,它包括一个名为Map的AcriveX控件(OCX)和一组(四十多个)AcriveX自动化对象。通过MapObjects可灵活地建立地图接口。开发人员可在熟悉的开发环境,如Visual Basic,Visual C++,Delphi与Microsoft Access中,使用MapObjects实现地图与用户的交互。
二、鹰眼图实现
1 程序功能
利用MapObjects中的Map控件显示地图图层,编写代码控制鹰眼图的鼠标驱动事件,实现鹰眼图对主图的导航作用。
程序实现鹰眼图的两种导航操作方式:一是在鹰眼图中双击导航主图时,将主图的中心坐标设为鼠标双击处的坐标;二是在鹰眼图中按住鼠标左键并拖动,指定鹰眼矩形框来导航主地图。根据矩形框的坐标位置设置主图的显示范围,可用右键拖动矩形框使主图显示不同位置的地图。
2 引用MapObjects控件
安装了MapObjects之后,在VB中引用MapObjects控件的步骤为:工程->部件->控件->ESRI MapObjects 2.3。工具箱中将出现Map控件。程序中将鹰眼图和主图放在同一个窗口中,所以在窗体中添加两个Map控件,分别用于显示鹰眼图和主图。
3 代码分析
Dim mMaps As New Collection
Dim mExtent As MapObjects2.Rectangle '鹰眼图中矩形框的地图范围
Dim mPoint As MapObjects2.Point '鹰眼图双击处
程序运行时在主图中加入“道路”、“公园”、“绿化”、“河流”图层。为了使鹰眼图中矩形框能够指示当前主图区域在整幅地图中的位置,在鹰眼图中加入主图中的“道路“图层作为导航主图,图层数据为MapObjects支持的Shapfile格式。
Private Sub Form_Load()
Dim i As Integer, lyr As MapObjects2.MapLayer
Dim datacon As New MapObjects2.DataConnection '声明数据连接
Dim mlyrriver As MapObjects2.MapLayer
Dim mrec As MapObjects2.Rectangle
datacon.Database = App.Path & "\DATA" '设置数据连接对象的Database属性
If Not datacon.Connect Then '检查数据连接对象的Connected属性,确保连接成功
MsgBox "没找到数据!"
End
End If
Set mlyrriver = New MapObjects2.MapLayer
mlyrriver.GeoDataset = datacon.FindGeoDataset("河流") '调用FindGeoDataset方法来设置地
'图图层对象的GeoDataset属性
mlyrriver.Name = "河流" 'GeoDataset对象表示地图数据的一个图层
mlyrriver.Symbol.Color = vbBlue
mapMain.Layers.Add mlyrriver '将图层加入到图层集合中,通过相同的方法添加其他图层
Set mrec = mlyrriver.Extent
mrec.ScaleRectangle 1.1
mapMain.FullExtent = mrec
mapMain.Extent = mapMain.FullExtent '设置初始主图地图显示的范围
frmmain.AddMap mapMain '将mapMain加入mMaps
mapEagleeye.Layers.Add mapMain.Layers("道路") '在鹰眼图中加入"道路"图层作为导航主图
End Sub
在鹰眼图中指定矩形框作为主图的地图显示范围,矩形框由闭合的折线组成。
Private Sub mapEagleeye_BeforeTrackingLayerDraw(ByVal hDC As stdole.OLE_HANDLE)
Dim lineSym As MapObjects2.Symbol, l As MapObjects2.Line
Dim pts As MapObjects2.Points, p As MapObjects2.Point
'在鹰眼图中画一个矩形框作为主图的地图显示范围
If Not mExtent Is Nothing Then '鹰眼图中已有矩形框
Set lineSym = New MapObjects2.Symbol
lineSym.SymbolType = moLineSymbol
lineSym.Color = moGreen
lineSym.Size = 2
Set l = New MapObjects2.Line
Set pts = New MapObjects2.Points
Set p = New MapObjects2.Point '矩形框左下角
p.X = mExtent.Left
p.Y = mExtent.Bottom
pts.Add p
Set p = New MapObjects2.Point '左上
p.X = mExtent.Left
p.Y = mExtent.Top
pts.Add p
Set p = New MapObjects2.Point '右上
p.X = mExtent.Right
p.Y = mExtent.Top
pts.Add p
Set p = New MapObjects2.Point '右下
p.X = mExtent.Right
p.Y = mExtent.Bottom
pts.Add p
Set p = New MapObjects2.Point '左下角,回到起点闭合
p.X = mExtent.Left
p.Y = mExtent.Bottom
pts.Add p
l.Parts.Add pts
mapEagleeye.DrawShape l, lineSym '画矩形框
End If
End Sub
双击鹰眼图的导航操作。在双击鹰眼图后,通过主图的CenterAt方法将鹰眼图双击处设为主图的中心。
Private Sub DBClickUpdatemapMain()
Dim m As MapObjects2.Map
For Each m In mMaps
m.CenterAt mPoint.X, mPoint.Y '将鹰眼图双击处设为主图的中心
Next m
End Sub
Private Sub mapEagleeye_DblClick()
DBClickUpdatemapMain
End Sub
Private Sub mapEagleeye_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim e As MapObjects2.Rectangle
Set mPoint = mapEagleeye.ToMapPoint(X, Y) '鹰眼图双击处的坐标转换为地图坐标
If Button = 1 Then '左键画矩形框
Set mExtent = mapEagleeye.TrackRectangle 'mExtent鹰眼图矩形框范围
UpdatemapMain '将矩形框范围设为主图的显示范围
Else '右键移动矩形框
If mExtent Is Nothing Then
MsgBox ("请用左键在鹰眼图中拖画矩形框作为主图地图的显示范围,或在鹰眼图中双击!")
Exit Sub
End If
MoveExtent mapEagleeye.ToMapPoint(X, Y)
End If
mapEagleeye.TrackingLayer.Refresh True
End Sub
在鹰眼图中用右键拖动矩形框使主图显示不同位置的地图。
Private Sub mapEagleeye_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
MoveExtent mapEagleeye.ToMapPoint(X, Y) '将矩形框的中心移到(X, Y)的地图坐标处
End If
End Sub
Private Sub mapEagleeye_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
UpdatemapMain '用鹰眼图中的矩形框对主图进行刷新使两者同步
End If
End Sub
Public Sub AddMap(m As MapObjects2.Map)
mMaps.Add m
End Sub
Private Sub MoveExtent(p As MapObjects2.Point)
Dim pt As MapObjects2.Point
Set pt = mExtent.Center
mExtent.Offset p.X - pt.X, p.Y - pt.Y '对矩形框中心位置进行更新
mapEagleeye.TrackingLayer.Refresh True
End Sub
Private Sub UpdatemapMain()
Dim m As MapObjects2.Map
For Each m In mMaps
m.Extent = mExtent '将鹰眼图中矩形框的范围设为主图的显示范围
Next m
End Sub
图1 双击鹰眼图导航
图2 鹰眼图矩形框导航
三、结语
鹰眼图是车辆导航电子地图中的一个基本功能。本文介绍了在VB环境下利用MapObjects控件实现鹰眼图的过程。程序中鹰眼图具备两种导航方式:一是在鹰眼图中双击导航主图时,将主图的中心坐标设为鼠标双击处的坐标;二是在鹰眼图中按住鼠标左键并拖动,指定鹰眼矩形框来导航主地图,程序能够正常运行。(注明:程序中所用示例数据来源于网络。)
参考文献
1. 韩鹏.地理信息系统开发—MapObjects方法.武汉大学出版社,2004
2. 刘光.地理信息系统—组件开发篇.中国电力出版社,2003
|