ArcGIS Engine 开发 (五)鹰眼功能的实现,将图像元素(element)显示在视图上的步骤

ArcGIS Engine 基于C#的开发

  • (一)基本界面的搭建
    * 无法嵌入互操作类型的问题的解决
    *COM技术中的IUnknown接口和QueryInterface

  • (二)打开,保存,另存为功能

  • (三)鹰眼功能


界面

之前在界面的左下角加了一个小的mapControl这个就是用来显示鹰眼视图的,如图:
ArcGIS Engine 开发 (五)鹰眼功能的实现,将图像元素(element)显示在视图上的步骤_第1张图片

思路

关键有两点:
1,主控件axMapControl1和鹰眼控件axMapControl2数据的共享(保持一致);
2,如何绘制鹰眼控件中的显示方框,然后让主视图的显示范围根据鹰眼视图中的显示方框发生相应变化。

主要用到的接口

IEnvelope:IEnvelope是指地物的外接矩形;
IGraphicsContainer:Map 对象通过 IGraphicsContainer 接口来管理这些元素对象。
IElement:地图除了地理数据外,还可以拥有元素(Element),主要分为:图形元素(graphic element)和框架元素(frame element)


主控件axMapControl1和鹰眼控件axMapControl2数据的共享

        /// 
        /// 地图发生改变事件
        /// 
        /// 
        /// 
        private void axMapControl1_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e)
        {
            if (axMapControl1.LayerCount > 0)
            {
                for (int i = 0; i <= axMapControl1.Map.LayerCount - 1; ++i)
                {
                    axMapControl2.Map.AddLayer(axMapControl1.Map.get_Layer(i));
                }
                axMapControl2.Extent = axMapControl1.FullExtent;//设置鹰眼视图为全局视图
                axMapControl2.Refresh();
            }
        }

鼠标在鹰眼视图上的点击和移动事件

过程为先实例一个point对象,然后将当前鹰眼视图的mapX,Y坐标通过PutCoords方法对point对象进行赋值,然后再调用axMapControlCenterAt方法改变主视图的显示范围。

        /// 
        /// 鹰眼视图上鼠标点击事件
        /// 
        /// 
        /// 
        private void axMapControl2_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
        {
            if (axMapControl2.Map.LayerCount > 0)
            {
                if (e.button == 1)//左键将所点击的位置,设置为主视图的中心
                {
                    IPoint pPoint = new PointClass();
                    pPoint.PutCoords(e.mapX, e.mapY);//设置point对象的坐标
                    axMapControl1.CenterAt(pPoint);
                    axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
                }
                else if (e.button == 2)//右键拉框范围设置为主视图显示范围
                {
                    IEnvelope pEnv = axMapControl2.TrackRectangle();//获得拉框的范围
                    axMapControl1.Extent = pEnv;
                    axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
                }
            }

        }
        /// 
        /// 鹰眼视图上鼠标移动事件
        /// 
        /// 
        /// 
        private void axMapControl2_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e)
        {
            if (e.button == 1)//左键点击移动,俩个视图联动
            {
                IPoint pPoint = new PointClass();
                pPoint.PutCoords(e.mapX, e.mapY);
                axMapControl1.CenterAt(pPoint);
                axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
            }
        }

主视图视图范围变化,对鹰眼视图进行画框

        /// 
        /// 主窗体视图范围变化
        /// 
        /// 
        /// 
        private void axMapControl1_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e)
        {
            //获得当前地图视图的外包矩形
            IEnvelope pEnvelope = (IEnvelope)e.newEnvelope;
            //获得GraphicsContainer对象
            IGraphicsContainer pGraphicsContainer = axMapControl2.Map as IGraphicsContainer;

            IActiveView pActiveView = pGraphicsContainer as IActiveView;
            //清除对象中的所有图形元素
            pGraphicsContainer.DeleteAllElements();
            
            //获得矩形图形元素
            IRectangleElement pRectangleEle = new RectangleElementClass();
            IElement pElement = pRectangleEle as IElement;
            pElement.Geometry = pEnvelope;
           
            //设置FillShapeElement对象的symbol
            IFillShapeElement pFillShapeEle = pElement as IFillShapeElement;
            pFillShapeEle.Symbol = getFillSymbol();
            //进行填充
            pGraphicsContainer.AddElement((IElement)pFillShapeEle, 0);
            //刷新视图
            pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
        }
        /// 
        /// 获得鹰眼视图显示方框的symbol
        /// 
        /// 
        private IFillSymbol getFillSymbol()
        {
            //矩形框的边界线颜色
            IRgbColor pColor = new RgbColorClass();
            pColor.Red = 255;
            pColor.Green = 0;
            pColor.Blue = 0;
            pColor.Transparency = 255;
            //边界线
            ILineSymbol pOutline = new SimpleLineSymbolClass();
            pOutline.Width = 3;
            pOutline.Color = pColor;
            //symbol的背景色
            pColor = new RgbColorClass();
            pColor.Red = 255;
            pColor.Green = 0;
            pColor.Blue = 0;
            pColor.Transparency = 0;
            //获得显示的图形元素
            IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
            pFillSymbol.Color = pColor;
            pFillSymbol.Outline = pOutline;
            return pFillSymbol;
        }

重点:
将图像元素显示在视图上一般的步骤为:

1. 产生一个新的元素对象(element);

主要分为:图形元素(graphic element)和框架元素(frame element),这里的鹰眼视图中添加的元素为矩形图形元素,通过

IRectangleElement pRectangleEle = new RectangleElementClass();
IElement pElement = pRectangleEle as IElement;

实例RectangleElement对象,然后再跳转到RectangleElementClass实现的IElement接口上。

2.确定元素(element)显示时使用的Symbol(符号)和Geometry(几何形体对象);

这里Geometry(几何形体对象)比较好确定通过事件参数,然后调用其属性直接获得其外包矩形

IEnvelope pEnvelope = (IEnvelope)e.newEnvelope;
pElement.Geometry = pEnvelope;

但是要注意的是设置Symbol(符号)属性却不属于IElement接口的范畴,它属于IFillShapeElement接口的规范内容所有要先由IElement接口跳转到IFillShapeElement接口,然后再将getFillSymbol()方法获取到的Symbol(符号)赋值给该对象。

IFillShapeElement pFillShapeEle = pElement as IFillShapeElement;
 pFillShapeEle.Symbol = getFillSymbol();

3.使用IGraphicsContainer.AddElement把元素添加到视图中去;
之前在主要使用到的接口中说到我们通过GraphicsContainer对象来管理元素对象,我们可以通过IMap接口跳转到该接口

IGraphicsContainer pGraphicsContainer = axMapControl2.Map as IGraphicsContainer;

然后可以通过该对象清除图形元素:

pGraphicsContainer.DeleteAllElements();

最后将获得的元素(element),添加到视图中去

pGraphicsContainer.AddElement((IElement)pFillShapeEle, 0);

4.刷新视图,让添加的元素可以显示出来。
通过axMapControlIActiveViewPartialRefresh方法进行刷新

axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);

或者通过接口跳转到IActiveView

IActiveView pActiveView = pGraphicsContainer as IActiveView;
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);

其中esriViewDrawPhase.esriViewGraphics为枚举值表示绘制注释。

你可能感兴趣的:(C#,ArcGIS,Engine,GIS二次开发,Arcgis二次开发入门)