ArcGIS Engine二次开发——实现卷帘和图层闪烁

GlobeLand30地表覆盖数据:从下载到变化检测的全流程实战指南 地表覆盖数据是记录地球表面森林、水体、农田、城市等地物类型及其空间分布的基础地理信息数据,它通过遥感影像解译技术生成,是理解人类活动与自然环境相互作用的关键数据层。其核心价值在于为城市规划、生态评估、气候变化研究等提供长期、连续、可对比的观测依据。在众多数据产品中,由我国主导研制的GlobeLand30数据集,凭借其30米空间分辨率、2000/2010/2020三期连续观测以及10大类分类体系,已成为全球变化研究领域广泛使用的权威数据源。本文将以GlobeLand30为具体案例,系统阐述其数据获取、预处理、 阅读详情

下面是卷帘和图层闪烁的屏幕截图,下面来讲解一下如何实现卷帘和图层闪烁:


首先需要定义一个成员对象ILayerEffectProperties,这个对象用于维护命令环境,指定卷帘和闪烁的图层;其次我们需要侦听地图的添加和删除图层事件,因此还需要一个ActiveViewEvents事件的侦听对象,如下:

        private ESRI.ArcGIS.Carto.IActiveViewEvents_Event MapActiveViewEvents;
        private ILayerEffectProperties m_LayerEffectProperties;
        private ICommand m_FlickCmd;
为了实现卷帘和闪烁,我们需要一个ComboBox维护一个图层列表,用于选中卷帘和闪烁的图层,也就是我们需要侦听地图的添加和删除图层事件,在这些事件发生时重新加载图层列表。对于地图的侦听事件,我们需要在窗体加载和OnMapReplaced时注册事件响应函数:
            if (MapActiveViewEvents != null)
            {
                MapActiveViewEvents.ItemAdded -= new ESRI.ArcGIS.Carto.IActiveViewEvents_ItemAddedEventHandler(MapActiveViewEvents_ItemAdded);
                MapActiveViewEvents.ItemDeleted -= new ESRI.ArcGIS.Carto.IActiveViewEvents_ItemDeletedEventHandler(MapActiveViewEvents_ItemDeleted);
                MapActiveViewEvents.ItemReordered -= new ESRI.ArcGIS.Carto.IActiveViewEvents_ItemReorderedEventHandler(MapActiveViewEvents_ItemReordered);            
            }
            IMap pMap = wndMap.ActiveView.FocusMap as IMap;
            MapActiveViewEvents = pMap as ESRI.ArcGIS.Carto.IActiveViewEvents_Event;
            MapActiveViewEvents.ItemAdded += new ESRI.ArcGIS.Carto.IActiveViewEvents_ItemAddedEventHandler(MapActiveViewEvents_ItemAdded);
            MapActiveViewEvents.ItemDeleted += new ESRI.ArcGIS.Carto.IActiveViewEvents_ItemDeletedEventHandler(MapActiveViewEvents_ItemDeleted);
            MapActiveViewEvents.ItemReordered += new ESRI.ArcGIS.Carto.IActiveViewEvents_ItemReorderedEventHandler(MapActiveViewEvents_ItemReordered);
            

在这些事件中,我们需要重新加载图层列表到我们的ComboBox里面去:

        void MapActiveViewEvents_ItemReordered(object Item, int toIndex)
        {
            ReLoadLayerList();
        }

        void MapActiveViewEvents_ItemDeleted(object Item)
        {
            ReLoadLayerList();
        }

        void MapActiveViewEvents_ItemAdded(object Item)
        {
            ReLoadLayerList();
        }

        private void ReLoadLayerList()
        {
            wndLayerListImageComboBox.Items.Clear();
            IMap pMap = wndMap.ActiveView.FocusMap;
            for (int i = 0; i < pMap.LayerCount; i++)
            {
                ILayer pLayer = pMap.get_Layer(i);
                int imageIdndex = 0;
                if(pLayer is IGeoFeatureLayer)
                {
                    IGeoFeatureLayer pGeoLayer = pLayer as IGeoFeatureLayer;
                    if(pGeoLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint) imageIdndex =0;
                    else if(pGeoLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolyline) imageIdndex = 1;
                    else if(pGeoLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon) imageIdndex =2;
                }
                else if(pLayer is IRasterLayer) imageIdndex = 3;
                wndLayerListImageComboBox.Items.Add(new DevExpress.XtraEditors.Controls.ImageComboBoxItem(pLayer.Name, pLayer, imageIdndex));                
            }  
        }

完成这些内容以后,我们还需要在每次选择卷帘和闪烁图层后,把选中的图层赋给LayerEffectProperties对象:

        private void wndLayerListImageComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            DevExpress.XtraEditors.ImageComboBoxEdit edit = sender as DevExpress.XtraEditors.ImageComboBoxEdit;
            if (edit.Value != null && edit.Value is ILayer)
            { 
                ILayer pLayer = edit.Value as ILayer;
                m_LayerEffectProperties.SwipeLayer = pLayer;
                m_LayerEffectProperties.FlickerLayer = pLayer;
                m_LayerEffectProperties.TransparencyLayer = pLayer;
            }           
        }	

之后,就是工具响应了,具体如下:

        /// <summary>
        /// 卷帘工具
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void wndBtnLayerSwipe_ItemClick(object sender, ItemClickEventArgs e)
        {
            ICommand pCmd = new ControlsMapSwipeTool();
            //只有MapControl支持卷帘,PageLayout不可以
            if (wndTabMainView.SelectedTabPage == wndTabPageMapView)
            {
                pCmd.OnCreate(wndMap.Object);
                wndMap.CurrentTool = pCmd as ITool;
            }
        }

        /// <summary>
        /// 图层闪烁频率
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void wndLayerFlickRateSpinEdit_EditValueChanged(object sender, EventArgs e)
        {
            if (m_LayerEffectProperties != null)
            {
                DevExpress.XtraEditors.SpinEdit edit = sender as DevExpress.XtraEditors.SpinEdit;
                int rate = int.Parse(edit.Value.ToString());
                m_LayerEffectProperties.FlickerRate = rate;
            }
        }
对于闪烁,这里一定要注意的一点是,一定要把这个命令声明为成员对象,否则会因为这个Command被析构而出现图层只会闪几下就不闪了的现象;另外还需要把它作为Tool设置给地图的CurrentTool,否则在鼠标点击地图或者移动时也会发生地图停止闪烁的问题。
        /// <summary>
        /// 图层闪烁
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void wndBtnLayerFlick_ItemClick(object sender, ItemClickEventArgs e)
        {
            if (m_FlickCmd != null) Marshal.ReleaseComObject(m_FlickCmd);
            m_FlickCmd = new ControlsMapFlickerCommand();
            if (wndTabMainView.SelectedTabPage == wndTabPageMapView)
            {
                m_FlickCmd.OnCreate(wndMap.Object);
                wndMap.CurrentTool = m_FlickCmd as ITool;   //设置为当前的Tool,否则移动鼠标就会使地图停止闪烁
                m_FlickCmd.OnClick();
            }            
        }
最后补充一点操作技巧,当地图在卷帘工具下,按住Ctr或者Shift键,就可以实现类似ENVI的图层闪烁功能,这个小技巧你知道吗?
ArcGIS Engine10.0轻松入门级教程(4)——基本功能开发 1地图编辑功能   地图编辑功能涉及到比较复杂的地图与鼠标的交互以及事件的响应,ArcGIS提供了强大的地图编辑的相关功能。本节我们将尝试实现一些简单的地图编辑功能,包括点、线、面要素形状的创建和移动。通过本节希望你能掌握ArcEngine实现地图编辑的机制以及常用的地图编辑的接口。     新建一个C#.Net项目,项目名称为MapEdit,添加MapControlLicenceContro 阅读详情

相关推荐

ArcGIS,Envi软件中的卷帘工具使用及对比

一、ArcGIS软件中的卷帘工具: 右击工具栏,添加工具条Effects,在下拉列表框中选择上面的图层数据,然后点击卷帘按钮即可实现上下左右卷帘效果,如下图所示: 二、Envi软件(5.0及以上版本)中的卷帘工具: 点击菜单Display→Portal(或者点击工具栏中的Portal按钮),打开透视窗口,拖动透视窗口即可实现卷

智慧空间实验室 1万+

自制卷帘工具

先上代码: private void Form1_Load(object sender, EventArgs e) { axMapControl1.LoadMxFile(@"C:\Users\zhangyang\Desktop\无标题.mxd"); axMapControl1.OnMouseMove += AxM...

jiushidt的专栏 978

ArcEngine实现Swipe卷帘功能

ArcEngine+C#实现ArcGIS的Swipe卷帘功能

显示和改写Layer Properties

在ArcGIS Engine中,显示和改写Layer Properties. 1. 显示图层名称, 最小\最大显示比例尺(IFeatureLayer.Name, .MaximumScale, .MinimumScale),图层透明度(Transparency)等; 图层透明度设置方法:定义ILayerEffects 类型变量,然后获得图层,然后设置,更新,完成图层的透明度设置。

freeWayWalker的专栏 5622

ArcEngine实现卷帘功能

ArcEngine+C#实现ArcGIS的Swipe卷帘功能 插件式DLL使用方便,直接调用

arcgis for flex实现的地图卷帘效果

基于arcgis for flex实现的地图卷帘特效,所有地图采用arcgis在线地图服务,只是用作效果切换

AE | 地图及相关对象

目录   地图对象 IMAP IActiveView IActiveViewEvents IGraphicsContainer IMapBookmark ITableCollection 地图对象的获取 图层对象 ILAYER IFeatureLayer2 IGeoFeaturelayer IGeoDataset IFeatureSelection ScreenDi...

weixin_41340063的博客 749

机载电脑与飞控串口通信(实测读取飞控IMU数据)《一、香橙派5max启动串口UART通信与飞控板通信,一次必通!》《二、allspark1与PIX6C通信踩坑及出坑》《三、orinnx载板与飞控通信》

机载电脑与飞控串口通信(实测读取飞控IMU数据)《一、香橙派5max启动串口UART通信与雷迅v5nano飞控板通信,一次必通!》《二、阿木机载电脑allspark1与PIX6C通信踩坑及出坑》,还有如何打开飞控串口以及如何提高飞控IMU频率。

2402_82745259的博客 3469

ArcGis Engine 基本工具 代码意思

/// /// 平移工具 /// /// public static void ToolPan (ESRI.ArcGIS.Controls.AxMapControl pMapControl) { ICommand pCmd = new ControlsMapPanToolClass()

小道 1590

基于决策树的英雄联盟比赛胜负预测(含完整代码)

在代码中设置随机种子(例如 RANDOM_SEED = 2024)的主要目的是为了确保每次运行代码时,随机过程的结果是一致的。通过绘制不同参数组合下的准确率图,直观地展示了参数对模型性能的影响,帮助读者更好地理解和选择合适的参数。通过设置相同的随机种子(伪随机数),可以确保每次运行代码时,随机数生成器生成的随机数序列是相同的。如果在开发过程中遇到问题,设置固定的随机种子可以帮助你更容易地定位问题,因为每次运行代码时的数据和结果都是一样的。在科学研究和实验中,结果的可重复性是非常重要的。

oisflo的博客 1919

Oracle数据库的内存管理优化技巧

Oracle数据库作为企业级数据库管理系统,广泛应用于各种业务场景。内存管理是Oracle数据库性能优化的关键环节,合理的内存管理可以显著提高数据库的响应速度和吞吐量。本文的目的是深入探讨Oracle数据库内存管理的优化技巧,涵盖了系统全局区(SGA)和程序全局区(PGA)的管理、内存分配算法、内存参数调整等方面。通过详细的讲解和实际案例分析,帮助读者掌握优化Oracle数据库内存使用的方法,提高数据库的性能和稳定性。

2502_91592937的博客 996

【ArcGIS二次开发】Engine界面搭建

文章目录一、新建窗体项目Windows Appplication(Engine)二、添加menuStrip、statusStrip和ToolbarControl控件,并设置相应的Dock属性三、用SplitContainer控件把显示区域分成三部分,并设置splitContatiner1的Orientation属性为Horizontal四、添加TabControl控件①添加TabControl控件到splitContatiner1.Panel1,并设置Dock属性为Fill②设置TabPages属性,添加一

网页设计作业、webgis作业承接 2680

告别License烦恼:手把手教你用VS Code+Cppcheck搭建免费的MISRA-C代码检查环境

本文详细介绍了如何使用VS Code和开源工具Cppcheck搭建免费的MISRA-C代码检查环境,帮助开发者规避商业工具的高额License费用。通过四步环境搭建和实战技巧,实现高效的代码静态检查,提升嵌入式开发的安全性和可靠性。

weixin_42523326的博客 248

关于MapControl和Map添加事件监听无效的问题

用9.3做项目的时候,发现Map对象IActiveViewEvents接口中的事件时而有效,时而无效,异常神奇,仔细研究,终于发现原因。 在对地图事件中监听中,一般用到两个接口,MapControl的IMapControlEvents2和Map的IActiveViewEvents接口,这两个接口中有相同的方法,我以为使用方法差不多,后来发现不然。IMapControlEvents2是地图控件的事

FlyingGIS 3169

【win11+vs 2017+OpenCV4.5.5+Qt5.12配置】详细安装过程+小问题解决

由于Qt5无法与最新的vs2022兼容,扩展工具中一直显示不可用,所以将vs降级成vs2017。在安装Qt的过程中,会选择安装Qt套件,其中就的MCVS 2017,说明vs2017是与qt兼容的。当然也可以用qt creator这一原生IDE。OpenCV版本目前是最新的4.8.0,使用过程中没有什么问题,但是还是安装低版本大概率避免一些玄学问题。

qq_45306739的博客 3350

第21章 分层架构软件测试

技术人员和客户代表对代码服务相关的技术进行详细的交流,由此确定代码审计的方案(哪些代码要审计、用什么方式审计、审计的时间、审计的要求等)代码审计报告提交和沟通之后,跟开发人员针对代码审查发现的问题进行修改,然后代码审查人员进行回归的检查,然后提交复查的报告;本层不需要了解其它层的实现细节,只需要考虑与本层相关的两层之间的接口和调用的情况。然后对客户要求的功能点进行人工的代码审查,对源代码的扫描结果进行人工的分析和确认;结合自动化扫描的结果和人工审查的结果生成测试对象的代码审查报告,最后提交给客户;

李黏黏的博客 3270

ICommad中如何监听Map的onAfterDraw事件

(IActiveViewEvents_Event)(pMap).OnAfterDraw+=

炘的专栏 864

windows 配置 libxml2

路径:\libiconv-1.9.2-1-src.zip\src\libiconv\1.9.2\libiconv-1.9.2\include\。执行完后,在当前win32目录中会生成了一个bin.msvc目录,其中就有开发需要的libxml2.lib和libxml2.dll文件。将 libiconv.la 复制到 新建的 lib 目录,并将其改名为 iconv.lib。路径:libiconv-1.9.2-1-bin.zip\lib\。将如下的 iconv.h 复制到新建的 include 目录。

SHELLCODE_8BIT的博客 3886

ArcEngine IMap接口

使用IMap接口显示各种数据源的数据。IMap接口的成员ActiveGraphicsLayer:活动图形图层,如果没有将创建一个基本memory graphics layer。AddLayer:向地图中添加单个图层。AddLayers:向地图中添加多个图层。AddMapSurround:向地图中添加map surround。AnnotationEngine:地图使用的注记(标签)引擎。AreaOf...

weixin_33872660的博客 529

【Android面试八股文】Android Application为什么是单例?

这道题相对简单,就是考察大家是否了解application的创建流程。的实例,它用来存储和处理整个全局变量的一些事情,它同时还是一个。为空的时候,才会创建,从而保证了它是一个单例对象。一样有自己的生命周期,但是它并没有那么复杂,因为。对象的创建过程,找出它为什么是单例的原因。全局进行一些配置,比如配置插件。的时候才会创建,所以说可以在。凭什么是单例,我们查看下。启动的时候都会创建一个。是怎么一步步创建的。是一个单例,即每一个。

字节卷动 531

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ArcEngine二次开发界面基本设置

一、界面基本设置 1.在form窗体中添加菜单栏和状态栏控件 2.添加license和工具栏控件, 3.设置工具栏的Dock属性 4.添加拆分器控件 5.在拆分器的Panel1中再添加一个拆分器控件(用于分隔图层控件和鹰眼) 6.设置它的Orientation属性 7.在拆分器的右边添加一个...

胡克林的博客 9451

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

arcgis之卷帘操作

自定义--工具条--效果--卷帘

pyy的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

要素选择变化事件 IActiveViewEvents_SelectionChanged

void IDockableWindowDef.OnCreate(object hook) { m_application = hook as IApplication; m_hookHelper = new HookHelperClass(); m_hookHelp...

weixin_30444105的博客 601

ImageComboBox

<br />--Class:NativeMethods.vb--<br />Imports System.Collections.Generic<br />Imports System.Text<br />Imports System.Runtime.InteropServices<br />Imports System.Drawing<br />Namespace Demo<br />    Friend Class NativeMethods<br />#Region "WindowsMessage"<

wodexinlei的专栏 1005

地图卷帘实现——参考ArcGIS API

添加点、线、面图层 参考教程:ArcGIS API for Javascript 本示例参考:Add Layers To 2D Map 编辑软件:Hbuilder 功能 :鼠标在地图上移动,实现两幅地图的卷帘效果。 【

彩虹的部落 3384

IActiveView接口

IActiveView:    该接口在ArcMap和管理所有主要应用程序的窗口绘制操作。使用该接口可以改变视图的范围,刷新视图。    IActiveView的PartialRefresh(esriViewGeography, pLayer, null)用于刷新指定图层:    IActiveView的PartialRefresh(esriViewGeography, null, null

yulongguiziyao的专栏 4099
上一篇: IRasterStretch2接口的StretchStats属性的真实面目是什么
下一篇: MODIS MCD12Q1数据批量提取
深蓝静音
博客等级 码龄17年 263粉丝 68原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深蓝静音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值