你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Linux开发
基于MapObjects控件的鹰眼图实现
 

                                                   陈尹军  卞正富

  鹰眼图是地理信息系统(GIS)的一个基本功能。文中简要介绍了MapObjects控件,详细介绍在VB环境下应用MapObjects控件实现鹰眼图的过程。

关键词 MapObjects控件,鹰眼图,VB

 


地理信息系统(GIS)只有与具体行业的需求结合,才能真正体现地理信息系统的价值和作用,车辆导航电子地图中的鹰眼图就是地理信息系统与具体应用结合的体现。鹰眼图是为了方便用户浏览地图而设。在进行电子地图浏览时,用户要从浏览的区域马上切换到另一处与此不相邻的区域,可通过输入坐标,或利用平移和缩放工具一点一点地将浏览区域挪到目的地,但效率比较低。而如果有鹰眼图,则可以直接在鹰眼图中指定目的地,实现快速切换。此外,鹰眼图还能方便、直观地表示出当前的浏览区域在整个地图区域中的位置,通过设置鹰眼图中矩形框的大小可快速调整主图的显示范围。

一、MapObjects简介

MapObjectsESRI公司提供的一组供应用开发使用的制图与GIS功能组件,它包括一个名为MapAcriveX控件(OCX)和一组(四十多个)AcriveX自动化对象。通过MapObjects可灵活地建立地图接口。开发人员可在熟悉的开发环境,如Visual BasicVisual C++DelphiMicrosoft 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


 

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089