首 页文章中心下载中心繁體中文
设为首页
加入收藏
联系我们
您当前的位置:开源盛世-源代码下载网 -> 文章中心 -> GIS 专区 -> 文章内容 退出登录 用户管理
栏目导航
· VC++专区 · V B 专区
· GIS 专区 · PDA 专区
· 其他编程 · 网站开发类
· 数据库类 · 软件应用
· 网络安全 · 论文专区
· 综合资讯
热门文章
· Tab Control控件使用...
· 学生档案管理系统
· [图文] 排列组合公式
· UTF-8与GB2312之间的...
· DirectShow下载安装...
· Virtual PC 在PAE模...
· Windows2000终端服务...
· MapInfo上的GIS系统...
· Mapbasic参考手册索...
· MapX应用开发中文讲...
相关文章
· 基于MapInfo的线面拓...
基于MAPX控件的鹰眼图实现
作者:许士敏  来源:http://www.chinartu.com  发布时间:2005-5-13 21:57:57  发布人:Polaris

减小字体 增大字体

  MapX 控件是一个常用的GIS功能组件,而鹰眼图是GIS中一个基本的功能。本文简介了MapX并详细说明在Visual BasicVisual C++开发环境下利用MapX 控件实现鹰眼图的方法。

关键词MapX控件 GIS  VB  VC

 

一、引言

 地理信息系统 (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控件产品。MapXMapInfo公司向用户提供的具有强大地图分析功能的ActiveX控件产品。由于它是一种基于Windows操作系统的标准控件,因而能支持绝大多数标准的可视化开发环境如Visual C++Visual BasicDelphiPowerBuilder等。编程人员在开发过程中可以选用自己最熟悉的开发语言,轻松地将地图功能嵌入到应用中,并且可以脱离MapInfo的软件平台运行。利用MapX,能够简单快速地在企业应用中嵌入地图化功能,增强企业应用的空间分析能力,实现企业应用的增值。MapX采用基于MapInfo Professional的相同的地图化技术,可以实现MapInfo Professional具有的绝大部分地图编辑和空间分析功能。而且MapX提供了各种工具、属性和方法,实现这些功能是非常容易的。

鹰眼图是GIS中一个基本的功能,鹰眼图又名缩略图,顾名思义,在鹰眼图上可以象从空中俯视一样查看地图框中所显示的地图在整个图中的位置。如图1所示:以北京市地图为例,鹰眼的大小可分为北京市城区和北京市全区两个等级。Windows下的可视化开发工具现在大家接触得最多的就是VCVB,下面将详细介绍在VCVB环境下鹰眼图的具体实现,从这也可以看出利用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

 

根据map1BoundsMap2上绘制矩形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 BasicVisual C++相结合,可以很方便地开发出GIS应用系统,具有很大的实际意义。本文详细介绍在VCVB环境下鹰眼图的具体实现,显示出Map X控件强大的功能。

 

1.王文,李红,韩圣君, 应用桌面GIS开发方法探讨 遥感信息, 1 998(3 )

2.郭际元,曾文,多媒体技术在地理信息系统中的应用 中国地质大学学报, 1 998 (4)

3.齐超等 利用 Map X控件构建地图应用 电脑与信息技术 2000(5)

End of《基于MAPX控件的鹰眼图实现》

[] [返回上一页] [打 印] [收 藏]
下一篇文章:WebGIS雏形探讨和实践
 
∷相关“基于MAPX控件的鹰眼图实现”文章评论∷
(评论内容只代表网友观点,与本站立场无关!) [更多评论...]
  评论人:sunjianwangzi   打分:85 分  发表时间:2007-5-17 22:50:45
· 怎么在VC中编译总是通过不了呢,有谁做出来了吗》? 
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 网站目录 鄂ICP备06007162
开源盛世 版权所有Copyright © 2003-2005 VSCodes.Com. All Rights Reserved.