zoukankan      html  css  js  c++  java
  • 以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

    { }

  • 相关阅读:
    了解 NoSQL 的必读资料
    关于什么时候用assert(断言)的思考
    这次见到了一些大侠
    NetBeans 时事通讯(刊号 # 87 Jan 12, 2010)
    动态链接库dll,静态链接库lib, 导入库lib
    新女性十得 写得了代码,查得出异常
    记录系统乱谈
    新女性十得 写得了代码,查得出异常
    fullpage.js禁止滚动
    RunningMapReduceExampleTFIDF hadoopclusternet This document describes how to run the TFIDF MapReduce example against ascii books. This project is for those who wants to experiment hadoop as a skunkworks in a small cluster (110 nodes) Google Pro
  • 原文地址:https://www.cnblogs.com/arxive/p/6262447.html
Copyright © 2011-2022 走看看