前言
在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:
添加子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.若要清除元素,則可以用如下代碼:
移除GraphicsLayer中的所有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
{ }
代碼中"g.DeleteAllElements()"方法只會刪除指定Graphicslayer中的所有要素,如果我們為其他業務的element同樣建立了屬於他們自己的graphicslayer, 刪除本業務中的element是不會影響到其他業務的element,這就實現了對element的有效控制.
總結一下:管理element有很多方法,仁者見仁,這裡只是探討了一種方法,個人覺得還是比較好用的,貼出來跟大家交流一下. 呵呵,