转自原文 以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

{ }

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}

以Graphicslayer为管理组来管理Element.的更多相关文章

  1. 使用本地服务器组来管理局域网或公网上的SQLSERVER

    使用本地服务器组来管理局域网或公网上的SQLSERVER 测试的两台机器 Windows7 64位   SQLSERVER2005 SP5 Windows7 64位   SQLSERVER2012 S ...

  2. Linux用户和组的管理操作

    用户和组的管理操作 命令中涉及的单词和简写: 用户:user:组:group : 增加:add :  修改:modify  mod ;  删除 : delete  del 增加用户     /etc/ ...

  3. 在win2008 r2主域控制域上打开“组策略管理”报错“未打开组策略对对象。你可能没有合适的权限”

    在win2008 r2主域控制域上打开“组策略管理”报错“未打开组策略对对象.你可能没有合适的权限” 打开组策略管理其它选项提示:找不到指定路径.之前做过的操作:取消域控主机上的共享目录sysvol和 ...

  4. Linux系统下用户与组的管理

    Linux系统下用户与组的管理 一.用户及组基本概述 Linux 系统上,用户管理是基于用户名和密码的方式进行资源的分配. 1.uid(用户身份标识) (1)root用户 uid为0 (2)普通用户: ...

  5. # openVPN+LDAP AD认证,组权限管理

    # openVPN+LDAP AD认证,组权限管理 原创内容http://www.cnblogs.com/elvi/p/7661178.html # openVPN+LDAP AD认证,组权限管理 # ...

  6. Linux第四节 组管理、用户管理、权限管理 / chmod /chown / umask / vim

    三期第三讲1.组管理/用户管理(重要文件系统会实时备份 file-) vim/etc/group: 组管理文件://组名:密码控位键:组id:成员 vim/etc/gshadow:组密码管理文件:// ...

  7. LINUX 学习笔记 账号与群组的管理

    LINUX 账号与群组的管理 UID:UserID 保存文件:/etc/passwd GID:GroupID 保存文件:/etc/group /etc/passwd 文件结构 一行代表一个账号,里面还 ...

  8. Linux基础命令---管理组gpasswd

    gpasswd gpasswd指令用来管理组文件“/etc/group”和“/etc/gshadow”,每个组可以设置管理员.组员.密码.系统管理员可以使用-A选项定义组管理员,使用-M选项定义成员. ...

  9. 用户管理_组管理_权限管理.ziw

    2017年1月10日, 星期二 用户管理_组管理_权限管理 用户管理: useradd, userdel, usermod, passwd, chsh, chfn, finger, id, chage ...

随机推荐

  1. div的标准盒模型和怪异盒模型

    (1)标准盒模型 标准盒模型宽高不会被padding和margin撑开 (2)怪异盒模型 怪异盒模型宽高会被padding和margin撑开

  2. git还原文件

    http://jingyan.baidu.com/album/e4511cf33479812b855eaf67.html

  3. 51NOD——T 1079 中国剩余定理

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1079 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难 ...

  4. ListView-divider 分割线的设置

    1.去掉分割线 android:divider="@null" 2.设置分割线颜色跟宽度 android:divider="#19000000" android ...

  5. 如何使用echo.js实现图片的懒加载(整理)

    如何使用echo.js实现图片的懒加载(整理) 一.总结 一句话总结:a.在img标签中添加data-echo属性加载真实图片:<img class="loading" sr ...

  6. 循环体(for/while)循环变量的设置

    1. 求滑动(移动)平均(moving average) double partialSum = 0; for (int i = 0; i < M-1; ++i) partialSum += A ...

  7. 每日技术总结:encodeURI,encodeURIComponent,toFixed

    1. encodeURI(URIstring) encodeURI()函数可把字符串作为URI进行编码 encodeURI("http://www.w3school.com.cn" ...

  8. hibernate hbm.xml配置映射

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. python3 分解质因数

    python3 分解质因数 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuhung Wan num = int(input(&quo ...

  10. Redis实现Mybatis的二级缓存

    一.Mybatis的缓存 通大多数ORM层框架一样,Mybatis自然也提供了对一级缓存和二级缓存的支持.一下是一级缓存和二级缓存的作用于和定义. 1.一级缓存是SqlSession级别的缓存.在操作 ...