【ArcGIS二次开发】鹰眼的实现「建议收藏」

【ArcGIS二次开发】鹰眼的实现「建议收藏」1、添加程序集usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.DataSourcesFile;usingESRI.ArcGIS.Geodatabase;usingESRI.ArcGIS.DataSourcesRaster;usingESRI.ArcGIS.Geometry;usingESRI.ArcGIS.Display;usingESRI.ArcGIS.esriSystem;*出现“命名

大家好,又见面了,我是你们的朋友全栈君。

1、添加程序集

using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesRaster;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;

*若出现“命名空间ESRI.ArcGIS中不存在类型或命名空间”的错误

【ArcGIS二次开发】鹰眼的实现「建议收藏」

解决方法如下:
右击解决方案中的引用,打开添加引用

【ArcGIS二次开发】鹰眼的实现「建议收藏」

选择缺少的程序集,点击确定

【ArcGIS二次开发】鹰眼的实现「建议收藏」

2、添加定义声明变量,添加SynchronizeEagleEye方法、DrawRectangle方法、GetRgbColor方法代码

	//定义声明变量
	IEnvelope pEnv;
private void SynchronizeEagleEye()
{ 
   
    if (EagleEyeMapControl.LayerCount > 0)
    { 
   
        EagleEyeMapControl.ClearLayers();
    }
    //设置鹰眼和主地图的坐标系统一致
    EagleEyeMapControl.SpatialReference = mainMapControl.SpatialReference;
    for (int i = mainMapControl.LayerCount - 1; i >= 0; i--)
    { 
   
        //使鹰眼视图与数据视图的图层上下顺序保持一致
        ILayer pLayer = mainMapControl.get_Layer(i);
        if (pLayer is IGroupLayer || pLayer is ICompositeLayer)
        { 
   
            ICompositeLayer pCompositeLayer = (ICompositeLayer)pLayer;
            for (int j = pCompositeLayer.Count - 1; j >= 0; j--)
            { 
   
                ILayer pSubLayer = pCompositeLayer.get_Layer(j);
                IFeatureLayer pFeatureLayer = pSubLayer as IFeatureLayer;
                if (pFeatureLayer != null)
                { 
   
                    //由于鹰眼地图较小,所以过滤点图层不添加
                    if (pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPoint
                        && pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryMultipoint)
                    { 
   
                        EagleEyeMapControl.AddLayer(pLayer);
                    }
                }
            }
        }
        else
        { 
   
            IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;
            if (pFeatureLayer != null)
            { 
   
                if (pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPoint
                    && pFeatureLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryMultipoint)
                { 
   
                    EagleEyeMapControl.AddLayer(pLayer);
                }
            }
        }
        //设置鹰眼地图全图显示 
        EagleEyeMapControl.Extent = mainMapControl.FullExtent;
        pEnv = mainMapControl.Extent as IEnvelope;
        DrawRectangle(pEnv);
        EagleEyeMapControl.ActiveView.Refresh();
    }
}
//在鹰眼地图上面画矩形框
private void DrawRectangle(IEnvelope pEnvelope)
{ 
   
    //在绘制前,清除鹰眼中之前绘制的矩形框
    IGraphicsContainer pGraphicsContainer = EagleEyeMapControl.Map as IGraphicsContainer;
    IActiveView pActiveView = pGraphicsContainer as IActiveView;
    pGraphicsContainer.DeleteAllElements();
    //得到当前视图范围
    IRectangleElement pRectangleElement = new RectangleElementClass();
    IElement pElement = pRectangleElement as IElement;
    pElement.Geometry = pEnvelope;
    //设置矩形框(实质为中间透明度面)
    IRgbColor pColor = new RgbColorClass();
    pColor = GetRgbColor(255, 0, 0);
    pColor.Transparency = 255;
    ILineSymbol pOutLine = new SimpleLineSymbolClass();
    pOutLine.Width = 2;
    pOutLine.Color = pColor;

    IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
    pColor = new RgbColorClass();
    pColor.Transparency = 0;
    pFillSymbol.Color = pColor;
    pFillSymbol.Outline = pOutLine;
    //向鹰眼中添加矩形框
    IFillShapeElement pFillShapeElement = pElement as IFillShapeElement;
    pFillShapeElement.Symbol = pFillSymbol;
    pGraphicsContainer.AddElement((IElement)pFillShapeElement, 0);
    //刷新
    pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
}
//定义用于获取颜色的GetRgbColor方法
private IRgbColor GetRgbColor(int intR, int intG, int intB)
{ 
   
    IRgbColor pRgbColor = null;
    if (intR < 0 || intR > 255 || intG < 0 || intG > 255 || intB < 0 || intB > 255)
    { 
   
        return pRgbColor;
    }
    pRgbColor = new RgbColorClass();
    pRgbColor.Red = intR;
    pRgbColor.Green = intG;
    pRgbColor.Blue = intB;
    return pRgbColor;
}

*出现“无法嵌入互操作类型”的错误

【ArcGIS二次开发】鹰眼的实现「建议收藏」

解决方法如下:
修改相应程序集的“嵌入互操作类型”属性值,将原来的True改为False

【ArcGIS二次开发】鹰眼的实现「建议收藏」

3、设置MainMapControl控件的OnMapReplaced属性的功能,在OnMapReplaced中添加SynchronizeEagleEye方法

private void MainMapControl_OnMapReplaced(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMapReplacedEvent e)
        { 
   
            SynchronizeEagleEye();
        }

4、设置MainMapControl控件的OnExtentUpdated属性的功能,在OnExtentUpdated中添加DrawRectangle方法

private void MainMapControl_OnExtentUpdated(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnExtentUpdatedEvent e)
        { 
   
            //得到当前视图范围
            pEnv = (IEnvelope)e.newEnvelope;
            DrawRectangle(pEnv);
        }

5、设置EagleEyeMapControl控件的OnMouseDown属性的功能,添加OnMouseDown的左键和右键功能代码

	//定义声明变量
	IPoint pMoveRectPoint;
	bool bCanDrag;
private void EagleEyeMapControl_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{ 
   
    if (EagleEyeMapControl.Map.LayerCount > 0)
    { 
   
        //按下鼠标左键移动矩形框
        if (e.button == 1)
        { 
   
            //如果指针落在鹰眼的矩形框中,标记可移动
            if (e.mapX > pEnv.XMin && e.mapY > pEnv.YMin && e.mapX < pEnv.XMax && e.mapY < pEnv.YMax)
            { 
   
                bCanDrag = true;
            }
            pMoveRectPoint = new PointClass();
            pMoveRectPoint.PutCoords(e.mapX, e.mapY);  //记录点击的第一个点的坐标
        }
        //按下鼠标右键绘制矩形框
        else if (e.button == 2)
        { 
   
            IEnvelope pEnvelope = EagleEyeMapControl.TrackRectangle();

            IPoint pTempPoint = new PointClass();
            pTempPoint.PutCoords(pEnvelope.XMin + pEnvelope.Width / 2, pEnvelope.YMin + pEnvelope.Height / 2);
            mainMapControl.Extent = pEnvelope;
            //矩形框的高宽和数据试图的高宽不一定成正比,这里做一个中心调整
            mainMapControl.CenterAt(pTempPoint);
        }
    }
}

6、设置EagleEyeMapControl控件的OnMouseMove属性的功能,添加OnMouseMove改变鼠标样式的功能代码

private void EagleEyeMapControl_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
{ 
   
    if (e.mapX > pEnv.XMin && e.mapY > pEnv.YMin && e.mapX < pEnv.XMax && e.mapY < pEnv.YMax)
    { 
   
        //如果鼠标移动到矩形框中,鼠标换成小手,表示可以拖动
        EagleEyeMapControl.MousePointer = esriControlsMousePointer.esriPointerHand;
        if (e.button == 2)  //如果在内部按下鼠标右键,将鼠标演示设置为默认样式
        { 
   
            EagleEyeMapControl.MousePointer = esriControlsMousePointer.esriPointerDefault;
        }
    }
    else
    { 
   
        //在其他位置将鼠标设为默认的样式
        EagleEyeMapControl.MousePointer = esriControlsMousePointer.esriPointerDefault;
    }

    if (bCanDrag)
    { 
   
        double Dx, Dy;  //记录鼠标移动的距离
        Dx = e.mapX - pMoveRectPoint.X;
        Dy = e.mapY - pMoveRectPoint.Y;
        pEnv.Offset(Dx, Dy); //根据偏移量更改 pEnv 位置
        pMoveRectPoint.PutCoords(e.mapX, e.mapY);
        DrawRectangle(pEnv);
        mainMapControl.Extent = pEnv;
    }
}

7、设置EagleEyeMapControl控件的OnMouseUp属性的功能,添加OnMouseUp范围变化的功能代码

private void EagleEyeMapControl_OnMouseUp(object sender, IMapControlEvents2_OnMouseUpEvent e)
{ 
   
    if (e.button == 1 && pMoveRectPoint != null)
    { 
   
        if (e.mapX == pMoveRectPoint.X && e.mapY == pMoveRectPoint.Y)
        { 
   
            mainMapControl.CenterAt(pMoveRectPoint);
        }
        bCanDrag = false;
    }
}

8、设置MainMapControl控件的OnAfterScreenDraw属性的功能,添加OnAfterScreenDraw的功能代码及CopyToPageLayout代码

private void CopyToPageLayout()
{ 
   
    IObjectCopy pObjectCopy = new ObjectCopyClass();
    object copyFromMap = mainMapControl.Map;
    object copiedMap = pObjectCopy.Copy(copyFromMap);//复制地图到copiedMap中
    object copyToMap = axPageLayoutControl1.ActiveView.FocusMap;
    pObjectCopy.Overwrite(copiedMap, ref copyToMap); //复制地图
    axPageLayoutControl1.ActiveView.Refresh();
}
private void mainMapControl_OnAfterScreenDraw(object sender, IMapControlEvents2_OnAfterScreenDrawEvent e)
{ 
   
    IActiveView pActiveView = (IActiveView)axPageLayoutControl1.ActiveView.FocusMap;
    IDisplayTransformation displayTransformation = pActiveView.ScreenDisplay.DisplayTransformation;
    displayTransformation.VisibleBounds = mainMapControl.Extent;
    axPageLayoutControl1.ActiveView.Refresh();
    CopyToPageLayout();
}

9、鹰眼成果展示
鼠标移动鹰眼视图内变成手指样式;可在鹰眼视图内左键拖动矩形框、右键画矩形框来改变显示区域

【ArcGIS二次开发】鹰眼的实现「建议收藏」
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163445.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java和Python哪个更适合初学者的问题

    Java和Python哪个更适合初学者的问题我个人不是很喜欢讨论这个问题,为什么呢,每个人都学习能力不一样,你要是不行,哪个对于你也不简单。客观分析,这两种语言都在程序员的工具箱中都占有一席之地。学习哪个并不重要,个人觉得对于入门级同学来说,你要学的是“编程思想的基础知识“,而不是”特定的编程语言“。那这两门语言有区别吗?当然有,对于有一定编程经验的人来说…

    2022年7月7日
    19
  • WinServer2012配置AD域

    WinServer2012配置AD域WinServer2012配置AD域一、修改域控主机网卡IP,配置为静态IP,DNS配置为本机,并修改计算机名修改计算机名后需要重启注:若发现域控主机外部无法ping通请注意修改防火墙配置二、安装AD服务,将主机作为域控主机点击添加功能后,单击下一步随后添加功能组件,根据需求添加,点击下一步等待安装完成安装完成点击关闭安装完成后,点击上方的通知选择将此服务器提升为域控制器选择添加新林,设置好域名后点击下一步设置域还原密码,用于当域主机出现故障

    2022年5月16日
    41
  • 我国人口老龄化预测_中国人口老龄人口比例

    我国人口老龄化预测_中国人口老龄人口比例1、国内人口增速逐步下滑我国人口总量将近14亿,增速持续降低,城镇化率接近60%。建国以来,随着经济社会发展,我国人口总量从1949年的5.4亿人,增长至2018年13.9亿人。从增速来看,70年代人口总量的增速迅速下滑至1.3%-1.5%左右,90年代以来,人口总量增速持续缓慢下滑,近年保持在0.5%左右,但2018年增速进一步降低至0.4%。另一方面,中国城镇化率不断提升,到2018年已经达到59.58%。2018年我国人口总量为13.9亿人,同比增长0.4%,城镇化率59.58%数据来

    2025年9月14日
    23
  • Platform device and platform driver

    Platform device and platform driverPlatformdevice是专门给嵌入式系统设计的设备类型,一般在移植内核到自己的开发板时,基本上注册的所有的设备的类型全是platformdevice。实际上,platform在Linux内核中是以一条总线的身份登场的,要想让这样的总线和设备一起完美的工作,必须首先在系统

    2022年7月24日
    10
  • 激活成功教程版补丁_PyCharm永久激活2021

    激活成功教程版补丁_PyCharm永久激活2021参考https://www.cnblogs.com/pupilheart/p/9734124.html实测可行。——————————————————————————————————2019年01月15日更新最新测试该,博客的激活成功教程文件JetbrainsIdesCrack-3.1-release-sha1.jar,最后激活步骤显示keyisinvalid,测试了几个网站激活码发现均…

    2022年8月27日
    6
  • jvm可达性分析算法_对点网络

    jvm可达性分析算法_对点网络作者:张华发表于:2016-04-05版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99)IP层叫分片,TCP/UDP层叫分段。网卡能做的事(TCP/UDP组包校验和分段,IP添加包头校验与分片)尽量往网卡做,网卡不能做的也尽量迟后分片(发送)或提前合并片(接收)来减少在网络栈中传输和处理的包数目,

    2025年6月14日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号