C#进行MapX二次开发之鹰眼实现

鹰眼一般是指GIS应用中,系统有两个一大一小的图,小图提供快速定位地图位置的功能,这个是在GIS中应用比较广泛的一个功能,在Google地图中,右下角也有一个小图框,也是指的鹰图。如下图所示。

  

在本次介绍的例子中,左边是主地图,右边是小地图,即鹰眼。

鹰眼要实现下面几个功能:

1。 主地图变化时,鹰眼也要做出相应的位置变化,以便更好展示位置所在。

2。鹰眼地图移动到任何一个位置,主地图也要做相关联的位置变化,以实现地图的粗略定位。

3。主地图实现鼠标滚轮的变化支持。

首先我们先设置主地图的鼠标滚轮支持,先在主地图上设置MouseWheelSupprot属性为miFullMousewheelSupport。该值是表示地图视图支持滚轮的操作。或者你在代码中添加下面的代码实现滚轮支持。

axMap1.MousewheelSupport = MapXLib.MousewheelSupportConstants.miFullMousewheelSupport;

然后在MapViewChanged的事件中添加和鹰图关联的操作 

        private void axMap1_MapViewChanged(object sender, EventArgs e)
        {
            MapXLib.Feature tempFea;//声明Feature变量
            MapXLib.Style tempStyle = new MapXLib.Style();//声明Style变量
            Double Xmin, Xmax, Ymin, Ymax;
            RegionPoint Pmin, Pmax;

            //矩形边框还没有创建时 
            if(Portal.gc.MainDialog.EagleAnoLayer.AllFeatures.Count == 0)
            {
                //设置矩形边框样式 
                tempStyle.RegionPattern = MapXLib.FillPatternConstants.miPatternNoFill;//设置Style的矩形内部填充样式
                tempStyle.RegionBorderWidth = 2;//设置Style的矩形边框宽度

                //在图层创建大小为Map1的边界的Rectangle对象 
                tempFea = Portal.gc.MainDialog.EagleMap.FeatureFactory.CreateRegion(Portal.gc.MainDialog.MainMap.CtlBounds, tempStyle);
                Portal.gc.MainDialog.EagleFea = Portal.gc.MainDialog.EagleAnoLayer.AddFeature(tempFea, Missing.Value);//添加矩形边框
                return;
            }
            else
            {
                //否则,根据Map1的视野变化改变矩形边框的大小和位置
                Xmin = Portal.gc.MainDialog.MainMap.CtlBounds.XMin;
                Xmax = Portal.gc.MainDialog.MainMap.CtlBounds.XMax;
                Ymin = Portal.gc.MainDialog.MainMap.CtlBounds.YMin;
                Ymax = Portal.gc.MainDialog.MainMap.CtlBounds.YMax;

                MapXLib.Points feaPoint = Portal.gc.MainDialog.EagleFea.Parts[1];
                feaPoint.RemoveAll(); //除去已有的矩形边框的顶点
                //添加大小和位置已变化的矩形边框的四个顶点
                feaPoint.AddXY(Xmin, Ymin, Missing.Value);
                feaPoint.AddXY(Xmax, Ymin, Missing.Value);
                feaPoint.AddXY(Xmax, Ymax, Missing.Value);
                feaPoint.AddXY(Xmin, Ymax, Missing.Value);
                Portal.gc.MainDialog.EagleFea.Update(Missing.Value, Missing.Value);//更新显示

                if (Portal.gc.MainDialog.MainMap.Zoom < 3) 
                {   //如果放大到实际比例的1/2倍以上,则启动局部刷新线程
                    Pmin.x = Xmin;
                    Pmin.y = Ymin;
                    Pmax.x = Xmax;
                    Pmax.y = Ymax;
                }
                else 
                {   //否则,停止局部刷新线程               
                    Pmin.x = 0;
                    Pmin.y = 0;
                    Pmax.x = 0;
                    Pmax.y = 0;
                }

                if(fsFlag == 0)
                {
                    oldZoom = Portal.gc.MainDialog.MainMap.Zoom;
                    oldCenterX = (Xmin + Xmax) / 2;
                    oldCenterY = (Ymin + Ymax) / 2;
                }                
            }
        }

其中我们注意到了操作小图的地代码,是添加一个矩形图来表示大图的当前视点。如下面的代码:

tempFea = Portal.gc.MainDialog.EagleMap.FeatureFactory.CreateRegion(Portal.gc.MainDialog.MainMap.CtlBounds, tempStyle);

                Portal.gc.MainDialog.EagleFea = Portal.gc.MainDialog.EagleAnoLayer.AddFeature(tempFea, Missing.Value);//添加矩形边框 

 在小图中,为了能够单击鼠标就可以定位到主地图位置上,我们需要处理鼠标单击的时间,如代码

        private void axMap1_MouseDownEvent(object sender, AxMapXLib.CMapXEvents_MouseDownEvent e)
        {
            double MapX = 0;//定义x坐标变量
            double MapY = 0;//定义y坐标变量
            //把屏幕坐标转换为地图坐标
            axMap1.ConvertCoord(ref e.x, ref e.y, ref MapX, ref MapY, MapXLib.ConversionConstants.miScreenToMap);
            //设置主图的中心x坐标和y坐标
            Portal.gc.MainDialog.MainMap.CenterX = MapX;
            Portal.gc.MainDialog.MainMap.CenterY = MapY;

 这样基本上就能够实现两个地图之间的视图关联,从而更好定位地图的位置,如果为了鹰图更友好和更方便操作,也可以通过在主图变化的时候,绘制出更好的图形来展现主图的当前位置。

本文转自博客园伍华聪的博客,原文链接:C#进行MapX二次开发之鹰眼实现,如需转载请自行联系原博主。

时间: 2024-10-24 18:16:19

C#进行MapX二次开发之鹰眼实现的相关文章

C#进行MapX二次开发之开篇介绍及资源汇总

关于地理信息的开发有好多控件工具可以选择,GIS软件包括三家美国GIS开发商ESRI,Intergraph和 MapInfo的软件产品,以及国产软件:MapGIS,GeoStar和Citystar,SuperMap等产品.另外还有一些边缘 产品,是Web GIS的领域,不是纯粹的GIS产品,称之为地图应用平台可能较好,如Google公司的Google Maps.微软的Virtual Earth,国内的51地图,搜狗的地图等. 可能用的比较多的是ESRI了,他的 Arc IMS或者ArcGIS S

C#进行MapX二次开发之控件基本操作

上篇介绍了MapX的部分基本使用代码,包括放大.缩小.缩放到初始大小(全图).平移.矩形选择. 圆形选择.箭头.打开图层对话框 .打开ActiveX属性对话框 .添加符号等基本操作代码,本篇继续探 讨一些控件的基本操作. MapX提供的标准工具,不同的工具将会使鼠标能够完成多种任务.例如 ,如果当前的工具设成 miLabelTool,那么当单击鼠标时,会在此特指的地图对象上放置标签.鼠标光标 将根据正使用的工具更改形状.MapX 可用的标准工具列表如下所示: 工具 常量 描述 Add Line

C#进行MapX二次开发之图层操作

特别说明,本文整理自一篇网络的文章<MapX从数据库读取数据形成新图层(C#)> 在C#中实 现MapX从数据库读取数据形成新图层分为两个问题: 1.MapX从数据库读取数据形成新图层: 2.将DataTable转换为ADO的Recordset.这里的第二个问题是由第一个问题引起的,因为MapX是一 个COM控件,而且它只支持ADO的数据访问方式,而C#编程时一般会使用ADO.NET方式,为此需要在两种方 式之间做一下转换.(当然也可以在C#中使用ADO方式) DataTable转换为ADO的

C#进行MapX二次开发之地图搜索

在GIS中,地标或者道路等信息查找是一项很重要的功能,类似于我们查找数据库记录那样,需要模糊 进行匹配,一般来说,找到需要的地标或者道路等地图元素后,双击可以定位到地图的具体位置,并放大 地图,类似于Google Map的Fly to功能. 由于地图的信息是按照层来存储的,所以我们查找信息 的时候,也是按照一层层来进行检索,由于MapInfo的地图一般有很多层,每层进行遍历会比较花费时间 ,所以一般的专业系统,都只是关系一部分层,我们通常在配置文件中指定感兴趣的层名集合,然后查找 的时候,在这些

求vb+mapx二次开发高手 我已经实现了地图的加载,和一般的功能,现在需要,点击一个区改变区的颜色?

问题描述 我现在双击一个区,连接到该区的属性数据用frmprop的grid来显示,代码如下:PrivateSubMap1_DblClick()OnErrorResumeNextIfMap1.CurrentTool=miSelectToolThenDimiAsIntegerDimlyrAsMapXLib.LayerSetfrmprop.map=Map1Fori=1ToMap1.Layers.CountSetlyr=Map1.Layers(i)Iflyr.Selection.Count=1Thenf

长连接-c#腾讯企业邮箱二次开发实现新邮件提醒

问题描述 c#腾讯企业邮箱二次开发实现新邮件提醒 新邮件提醒,需要维持长连接,图片是API文档关于长连接的描述, 但是我获取到token,传入参数ver=0,返回错误,无效的请求,有做过这个功能的吗,求助啊!! private bool GetPostData(string url, string pars, ref string json) { System.GC.Collect(); //url=请求的地址,pars= "var=0" string ret = "&quo

cad-CAD二次开发如何与Excel之间通信

问题描述 CAD二次开发如何与Excel之间通信 AutoCad中利用Ole已经包含了导入Excel表格功能,但我想自己编写一个小软件导入Excel表格,请问如何利用CAD提供的接口去开发?

ae-AE 二次开发 请问:已经有个feature,怎么找离它最近的点要素?求帮助,急需。新手,求代码

问题描述 AE 二次开发 请问:已经有个feature,怎么找离它最近的点要素?求帮助,急需.新手,求代码 AE+C# 二次开发 请问:已经有个feature,怎么找离它最近的点要素?求帮助,急需.或者说:怎么找距离某个面要素最近的那个点要素.求代码~~ 解决方案 http://bbs.csdn.net/topics/391078057?page=1

微信二次开发问题 无法调用分享至朋友圈的接口

问题描述 微信二次开发问题 无法调用分享至朋友圈的接口 项目使用thinkphp开发 js安全接口之类的已经在公众号里面配置过了 但是没有设置启用服务器配置. 代码是按照微信给的demo的 wx.config()里面开了debug之后是显示ok的 但是微信的接口调用却不能用 其他接口也试过了 $timestamp=time(); $nonceStr='suyano827sa0asd2'; $url="http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]&