以Graphicslayer为管理组来管理Element.

简介:

转自原文 以Graphicslayer为管理组来管理Element.

前言

在AE开发过程中,我们经常使用Element(元素)。它的出现让地图与用户之间的交互增加了不少的效果。在地图上,可以通过各种element元素来表现我们需要的效果.例如高亮显示中用到element比较频繁.往往需要往地图中添加一个element来显示效果。当在地图上element越来越多时,而且还是通过不同的功能添加进来的,那么,这么多而复杂的element 就需要用一种管理方法来进行有序管理,让element有他的归属。如何管理呢? 
其一: 使用IGroupElement.将同一类或功能相似的element都添加到IGroupElement中.以Group的形式来管理, 删除时,只需删除IGroupElement即可.这个管理的好处在于当需要操作多个相近的element时,不需要逐一地对每一个element进行操作。例如,删除一批有查询得到并用element高亮显示房屋集,只需删除它所在的Group组就可以了。

本文在这里探讨另一种管理方法-以Graphicslayer为管理组来管理Element

在ArcGIS 中,Graphicslayer其实也是管理element的容器. 在ArcMap中,所有的地图图元(graphic element) 都是被保存在graphicslayer中.为了管理所有的graphics element,地图(map)有一个CompositeGraphicslayer对象.这CompositeGraphicslayer继承自ICompositeGraphicslayer接口并管理着一系列graphicslayer.ICompositeGraphicslayer提供一些对graphicslayer的基本操作,例如创建,查找,删除.此外,还有Count和Layer 属性 .CompositeGraphicsLayer 不仅仅管理着一系列的graphicslayer,它本身也是一个graphicslayer.这就意味着CompositeGraphicsLayer 自己本身拥有一个存储graphics的容器(Container).它提供的graphicslayer 叫"Basic Graphics Layer".这个"Basic Graphics Layer"是默认的graphicslayer,不能被删除.

通常,我们在开发过程中,对element的添加/删除用的最多的是就是IGraphicsContaner.通过该接口的AddElement方法将用户需要在地图表达的符号(Element)展示在地图之上.这里用IGraphicsContaner. AddElement方法添加的elment也是存储在一个默认的Graphicslayer中,这个Graphicslayer就是BaseGraphicslayer,这里的BaseGraphicslayer是一个ICompositeGraphicslayer的一个实例.因此,既然BaseGraphicslayer实现了ICompositeGraphicslayer接口,在管理地图中的element时,也可以以层的方式来管理--通过QI到ICompositeGraphicslayer接口,为我们的业务i添加我们所需要的graphicslayer到BaseGraphicslayer中.例如,为某一业务中需要用到的element单独创建一个Graphicslayer,此Graphicslayer专门用于管理该业务中使用到的element. 这样,不同业务中使用到的element相互独立,不受影响. 当需要删除某一业务中的element,只需将存储这些element的graphicslayer删除即可,不会影响到其他业务中的element.

1.如何添加子GraphicsLayer:

复制代码
/// </summary>
/// <param name="subgraphicsLayername">图层名称唯一</param>
/// <returns></returns>
public IGraphicsLayer AddSubGraphicsLayer(IMap map, string subgraphicsLayername)
{
    ICompositeGraphicsLayer pCompositeGLayer = map.BasicGraphicsLayer as ICompositeGraphicsLayer;
    IGraphicsLayer pGLayer = null;
    try
    {
        //查找是否已存在,如果不存在,跳转到catch内容.
        //如果查到不到,说明集合中并没有指定名称的graphicslayer
        pGLayer = pCompositeGLayer.FindLayer(subgraphicsLayername);
    }
    catch
    {
        //若不存在,则添加一个指定名称的GraphicsLayer
        pGLayer = pCompositeGLayer.AddLayer(subgraphicsLayername, null);
    }

    return pGLayer;
}
复制代码

 

通过以上代码得到的是一个IGraphicslayer 对象, 开发人员可以使用IGraphicsContainer g = graphicslayer as IGraphicsContainer;获得IGraphicsContainer 对象,如果要添加element,则使用我们常用的IGraphicsContainer.AddElement()方法. 此时,该方法将element添加到了IGraphicslayer 对象中.

2.若要清除元素,则可以用如下代码:

 

复制代码
try
{
    IGraphicsContainer g = graphicslayer as IGraphicsContainer;
    //删除此graphicslayer中的所有元素
    g.DeleteAllElements();
    //刷新
    activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);

    //从ICompositeGraphicsLayer中移除,也就是从IMap.BaseGraphicslayer中移除
    ICompositeGraphicsLayer pCompositeGLayer = m_Env.m_cAxMapEx.Map.BasicGraphicsLayer as ICompositeGraphicsLayer;
    pCompositeGLayer.DeleteLayer((graphicslayer as ILayer).Name);

}
catch
{ }
复制代码

 

 

 

代码中"g.DeleteAllElements()"方法只会删除指定Graphicslayer中的所有要素,如果我们为其他业务的element同样创建了属于他们自己的graphicslayer, 删除本业务中的element是不会影响到其他业务的element,这就实现了对element的有效控制.

总结一下:管理element有很多方法,仁者见仁,这里只是探讨了一种方法,个人觉得还是比较好用的,贴出来跟大家交流一下. 呵呵!

 

try

{

    IGraphicsContainer g = graphicslayer as IGraphicsContainer;

    //删除此graphicslayer中的所有元素

    g.DeleteAllElements();

    //刷新

    activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);

 

    //ICompositeGraphicsLayer中移除,也就是从IMap.BaseGraphicslayer中移除

    ICompositeGraphicsLayer pCompositeGLayer = m_Env.m_cAxMapEx.Map.BasicGraphicsLayer as ICompositeGraphicsLayer;

    pCompositeGLayer.DeleteLayer((graphicslayer as ILayer).Name);

 

}

catch

{ }

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。



    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/6262447.html ,如需转载请自行联系原作者

相关文章
|
并行计算 调度 Windows
R语言- parallel::mclapply 并行化计算任务
R语言中的 parallel::mclapply 是一个用于在多核CPU上实现并行计算的方法。它是lapply函数的并行版本,可以在多个处理器核心上同时运行lapply函数。mclapply函数的语法与lapply函数类似,但它可以指定要使用的处理器核心数量,从而提高计算速度。
1587 0
|
人工智能 达摩院 算法
达摩院高级算法专家为你揭秘人工智能
为你揭开阿里大牛的神秘面纱 学长学姐茶话会】菲莹 达摩院高级算法专家
达摩院高级算法专家为你揭秘人工智能
|
Shell Python C++
|
IDE Java 开发工具
|
存储 SQL Oracle
理解ORACLE 字符集【转】
一、引言     ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储、处理和检索数据。
1171 0
|
4天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
15天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1307 5