阅读:2283回复:7
基于MAPX控件的鹰眼图实现
一、引言
地理信息系统 (GIS)是计算机技术和信息系统共同发展的产物,但是最初的 GIS系统过于专业化,主要运用于地理、地质等专业部门,加上处理设备的昂贵,一度曾阻碍了它的发展[1]。随着计算机技术的发展和用户需求的不断提高,特别是 GIS系统在军事及其它非专业领域内的应用,更是加快了它的发展,使其在世人面前重放光彩,新的信息可视化地图信息系统自重并成为计算机信息系统的一种发展趋势[2]。结合GIS工具软件与当今可视化开发语言的集成二次开发方式就成为GIS应用开发的主流。它的优点是既可以充分利用GIS工具软件对空间数据库的管理、分析功能,又可以利用其它可视化开发语言具有的高效、方便等编程优点,集二者之所长,不仅能大大提高应用系统的开发效率,而且使用可视化软件开发工具开发出来的应用程序具有更好的外观效果,更强大的数据库功能,而且可靠性好、易于移植、便于维护。尤其是使用OCX技术利用GIS功能组件进行集成开发,更能表现出这些优势。Map Info公司顺应这一发展潮流,该公司开发的 MapX就是一种受到用户广泛欢迎的功能强大的地图分析功能的 ActiveX控件,本文将对该控件作简要的介绍。 二、 Map X的功能简介 Map Info公司吸取了传统 GIS系统的精华,并借助于计算机技术的发展,及时将 GIS概念从大中型计算机的专用工作站上普及到普通桌面 PC上,开创了一种崭新的信息系统模式。MapX是 Map Info公司的能向用户提供强大地图分析功能的 Active X控件产品。MapX是MapInfo公司向用户提供的具有强大地图分析功能的ActiveX控件产品。由于它是一种基于Windows操作系统的标准控件,因而能支持绝大多数标准的可视化开发环境如Visual C++、Visual Basic、Delphi、PowerBuilder等。编程人员在开发过程中可以选用自己最熟悉的开发语言,轻松地将地图功能嵌入到应用中,并且可以脱离MapInfo的软件平台运行。利用MapX,能够简单快速地在企业应用中嵌入地图化功能,增强企业应用的空间分析能力,实现企业应用的增值。MapX采用基于MapInfo Professional的相同的地图化技术,可以实现MapInfo Professional具有的绝大部分地图编辑和空间分析功能。而且MapX提供了各种工具、属性和方法,实现这些功能是非常容易的。 鹰眼图是GIS中一个基本的功能,鹰眼图又名缩略图,顾名思义,在鹰眼图上可以象从空中俯视一样查看地图框中所显示的地图在整个图中的位置。如图1所示:以北京市地图为例,鹰眼的大小可分为北京市城区和北京市全区两个等级。Windows下的可视化开发工具现在大家接触得最多的就是VC,VB,下面将详细介绍在VC与VB环境下鹰眼图的具体实现,从这也可以看出利用MapX开发GIS应用程序的方法和技巧。 图1 鹰眼图示意图 三、VB下鹰眼图的实现 VB下鹰眼图实现的思路是这样的:在某一Form上放两个MapX控件:Map1(主图),Map2(鹰眼图);然后在鹰眼图上创建一个图层,在该图层上添加一个矩形Feature,该矩形的大小随着主图边界而变化。 具体实现参考下面详细代码。 Dim m_Layer As Layer ’鹰眼图上临时图层 Dim m_Fea As MapXLib.Feature ’鹰眼图上反映主地图窗口位置的Feature Private Sub Form_Load() Set m_Layer = Map2.Layers.CreateLayer("Rectlayer") ’在Map2创建图层 End Sub ’根据map1的Bounds在Map2上绘制矩形Feature Private Sub Map1_MapViewChanged() Dim tempFea As MapXLib.Feature ’声明Feature变量 Dim tempPnts As MapXLib.Points ’声明Points变量 Dim tempStyle As MapXLib.Style ’声明Style变量 ’矩形边框还没有创建时 If m_Layer.AllFeatures.Count = 0 Then ’设置矩形边框样式 Set tempStyle = New MapXLib.Style ’创建Style对象 tempStyle.RegionPattern = miPatternNoFill ’设置Style的矩形内部填充样式 tempStyle.RegionBorderColor = 255 ’设置Style的矩形边框颜色 tempStyle.RegionBorderWidth = 2 ’设置Style的矩形边框宽度 '在图层创建大小为Map1的边界的Rectangle对象 Set tempFea = Map2.FeatureFactory.CreateRegion(Map1.Bounds, tempStyle) Set m_Fea = m_Layer.AddFeature(tempFea) ’添加矩形边框 Else ’否则,根据Map1的视野变化改变矩形边框的大小和位置 With m_Fea.Parts.Item(1) .RemoveAll ’除去已有的矩形边框的顶点 ’添加大小和位置已变化的矩形边框的四个顶点 .AddXY Map1.Bounds.XMin, Map1.Bounds.YMin .AddXY Map1.Bounds.XMax, Map1.Bounds.YMin .AddXY Map1.Bounds.XMax, Map1.Bounds.YMax .AddXY Map1.Bounds.XMin, Map1.Bounds.YMax End With m_Fea.Update ’更新显示 End If End Sub ’鹰眼图上鼠标单击用来导航主图,其方法是把鼠标处的坐标设置为主图的中心 Private Sub Map2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim MapX As Double ’定义x坐标变量 Dim MapY As Double ’定义y坐标变量 ’把屏幕坐标转换为地图坐标 Map2.ConvertCoord X, Y, MapX, MapY, miScreenToMap ’设置主图的中心x坐标和y坐标 Map1.CenterX = MapX Map1.CenterY = MapY End Sub 四、VC下鹰眼图的实现 VC下鹰眼图实现的思路与VB是一样的,只不过VC的可视化程序没有VB高,VC更多的是利用代码来实现一定的功能。如利用下面的两句代码创建两个控件,分别用来显示主图和鹰眼图。 m_ctrlMapX.Create(NULL, WS_VISIBLE, CRect(0,0,300,300), this, IDC_MAP1); m_eagleMapx.Create(NULL, WS_VISIBLE, CRect(0,0,400,400), this,IDC_MAP2); 另外在初始化程序时,还需创建一个图层,用于显示鹰眼图上矩形Feature。 m_eagleMapx.GetLayers().CreateLayer("RectLayer"); 鹰眼图的主要功能是在主图发生变化时,在鹰眼图上用变化的矩形框来显示当前主图显示的边界。这里主要利用MapX 控件内置的消息MAPX_DISPID_MAPVIEWCHANGED映射的函数来完成该功能,当主视图发生变化时,MapX 控件发出消息,调用OnMapViewChanged()函数进行相应的处理,所以主要的代码在OnMapViewChanged()函数中实现。 ON_EVENT(CMapXSampleView, IDC_MAP1, MAPX_DISPID_MAPVIEWCHANGED, OnMapViewChanged, VTS_NONE) //主视图发生变化时,调用如下的函数 void CMapXSampleView::OnMapViewChanged() { double X1,Y1,X2,Y2; //声明坐标变量 double x2,y2,x4,y4; //声明坐标变量 VARIANT scx, scy, scx1, scy1; //声明屏幕坐标变量 VARIANT mapx1,mapy1,mapx2,mapy2; //声明地图坐标变量 //声明FeatureFactory变量并获取缺省值 CMapXFeatureFactory cFactory=m_eagleMapx.GetFeatureFactory(); CMapXLayer layer; //声明图层变量 CMapXFeature feature; //声明Feature变量 CMapXFeatures features; //声明Features变量 CMapXPoints points; //声明Points变量 points.CreateDispatch(points.GetClsid()); CMapXRectangle rect; //声明矩形变量 rect.CreateDispatch(rect.GetClsid()); //获取主图的边界,根据这个边界值,在鹰眼图上添加一个矩形Feature rect = m_ctrlMapX.GetBounds(); X1 = rect.GetXMin(); //获得矩形左上顶点x坐标 Y1 = rect.GetYMin(); //获得矩形左上顶点y坐标 X2 = rect.GetXMax(); //获得矩形右下顶点x坐标 Y2 = rect.GetYMax(); //获得矩形右下顶点y坐标 //进行坐标变换 m_eagleMapx.ConvertCoordV(&scx,&scy,COleVariant(X1),COleVariant(Y1),miMapToScreen); m_eagleMapx.ConvertCoordV(&scx1,&scy1,COleVariant(X2),COleVariant(Y2),miMapToScreen); m_eagleMapx.ConvertCoordV(&scx,&scy1,&mapx1,&mapy1,miScreenToMap); m_eagleMapx.ConvertCoordV(&scx1,&scy,&mapx2,&mapy2,miScreenToMap); //获得矩形框顶点坐标 x2= mapx1.dblVal; y2=mapy1.dblVal; x4=mapx2.dblVal; y4=mapy2.dblVal; //得到添加矩形Feature的图层 layer=m_eagleMapx.GetLayers().Item("RectLayer"); features=layer.AllFeatures(); //没有添加矩形Feature的图层,则新建 if(features.GetCount() == 0) { //添加四个顶点构成一个矩形框 points.AddXY(X1,Y1); //添加顶点1 points.AddXY(x2,y2); //添加顶点2 points.AddXY(X2,Y2); //添加顶点3 points.AddXY(x4,y4); //添加顶点4 //创建矩形Feature COleVariant vtPoints; vtPoints.vt = VT_DISPATCH; vtPoints.pdispVal = points.m_lpDispatch; vtPoints.pdispVal->AddRef(); feature=cFactory.CreateRegion(vtPoints); //设置矩形Feature的属性 CMapXStyle style=feature.GetStyle(); style.SetRegionPattern(miPatternNoFill); //设置矩形的填充方式 style.SetRegionBorderColor(miColorRed); //设置矩形边框颜色 style.SetRegionBorderWidth(2); //设置矩形边框宽度 feature.SetStyle(style.m_lpDispatch); //添加已经创建的矩形Feature m_eaglefeature = layer.AddFeature(feature); } else //否则更新Feature的矩形大小与位置 { m_eaglefeature.GetParts().Item(1).RemoveAll(); //除去已有的顶点 m_eaglefeature.GetParts().Item(1).AddXY(X1,Y1); //添加顶点1 m_eaglefeature.GetParts().Item(1).AddXY(x2,y2); //添加顶点2 m_eaglefeature.GetParts().Item(1).AddXY(X2,Y2); //添加顶点3 m_eaglefeature.GetParts().Item(1).AddXY(x4,y4); //添加顶点4 m_eaglefeature.Update(); //更新Feature属性 } //更新显示图层 layer.Refresh(); } 五、总结 Map X控件作为一种具有强大地图分析功能的 Active X控件,它是一种基于 Windows操作系统的标准控件,与标准的可视化开发环境Visual Basic或Visual C++相结合,可以很方便地开发出GIS应用系统,具有很大的实际意义。本文详细介绍在VC与VB环境下鹰眼图的具体实现,显示出Map X控件强大的功能。 |
|
|
1楼#
发布于:2003-07-31 10:48
斑竹手里什么都有
可想斑竹学的时候是下了多大的工夫 值得偶等后辈学习 |
|
2楼#
发布于:2003-08-01 00:32
这个不好看,我在MO里面做了,在MAPX理是不是也可以用API呢
|
|
|
4楼#
发布于:2003-09-04 10:18
楼上有位兄台用mo,不过mo中做索引图方法很多,不一定都得用api,不过在vb中使用picture来实现索引图就得使用api啦,并不是难题,但还是值得交流!
|
|
|
5楼#
发布于:2003-09-04 14:32
这个源代码我有,需要的话,联系吧!!
是我从一个地方下载的! |
|
|
6楼#
发布于:2003-09-05 12:34
袁兄弟给我一份,参考参考!
wsuysulin@sina.com |
|
7楼#
发布于:2003-10-12 12:30
袁兄请给我一份 yanbn@163.net
|
|
8楼#
发布于:2003-10-13 11:54
贴上来,也不是不行啊,hoho
|
|
|
9楼#
发布于:2003-12-06 15:43
OpenGL做三维有没有示例代码?
|
|