ArcEngine搭載C#進行GIS的二次開發,關於目標顯示的問題,由於考慮到設置定時器刷新目標位置和方向,因此在顯示圖層上采用的是動態圖層DynamicLayer,主要用到的dll文件是ESRI.ArcGIS.ADF.BaseClasses,通過繼承BaseDynamicLayer設計一個自己的動態圖層基類,這樣在加載其他圖層時可以很方便的調用。先上基類的代碼
using ESRI.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.Geometry; using System; using System.Windows.Forms; namespace GIS { public abstract class myDynamicLayer : BaseDynamicLayer { protected IDynamicGlyph DynamicGlyph; private readonly Timer timer = new Timer(); private bool isUpdate; public IColor TransparenyColor { get; set; } public int Level { get; set; } public double Scale { get { return MapElement.GetScale(Level); } } public IPoint MouseMvePoint { get; set; } public string LayerName { get { return m_sName; } set { m_sName = value; } } public int TimerInterval { get { return timer.Interval; } set { timer.Enabled = false; timer.Interval = value; timer.Enabled = true; } } public void BeginUpdate() { isUpdate = true; } public void EndUpdate() { isUpdate = false; } protected FisDynamicLayer() { Level = 11; timer.Interval = 15; timer.Tick += timer_Tick; timer.Enabled = true; TransparenyColor = MapElement.SetColor(255, 255, 255, 64); } public override void DrawDynamicLayer(esriDynamicDrawPhase DynamicDrawPhase, IDisplay Display, IDynamicDisplay DynamicDisplay) { if (!m_bIsImmediateDirty) return; if (DynamicDrawPhase != esriDynamicDrawPhase.esriDDPImmediate) { return; } if (!m_bValid || !m_visible) { return; } if (isUpdate) { return; } IDynamicSymbolProperties2 DynamicSymbolProps = DynamicDisplay as IDynamicSymbolProperties2; IDynamicGlyphFactory2 DynamicGlyphFactory2 = DynamicDisplay.DynamicGlyphFactory as IDynamicGlyphFactory2; if (DynamicSymbolProps == null || DynamicGlyphFactory2 == null) { return; } DrawDynamicLayerEx(DynamicDisplay, DynamicGlyphFactory2, DynamicSymbolProps); m_bIsImmediateDirty = false; } private void timer_Tick(object sender, EventArgs e) { if (!m_bIsImmediateDirty) m_bIsImmediateDirty = true; } } }
此外需要在動態圖層基類中創建一個abstract方法以方便繼承時寫入不同圖層的需要
public abstract void DrawDynamicLayerEx(IDynamicDisplay DynamicDisplay, IDynamicGlyphFactory2 DynamicGlyphFactory2, IDynamicSymbolProperties2 DynamicSymbolProps);
這樣你就有了一個可以繼承的動態圖層基類了,生成新圖層時重寫上面的抽象方法即可,例如:
public override void DrawDynamicLayerEx(IDynamicDisplay DynamicDisplay, IDynamicGlyphFactory2 DynamicGlyphFactory2, IDynamicSymbolProperties2 DynamicSymbolProps) { if (MouseMvePoint == null) { return; } if (!IsClicked) { return; } if (pPointCollection.PointCount > 1) { pPointCollection.RemovePoints(0, pPointCollection.PointCount); } if (pPointCollection.PointCount > 0) { if (IsMoved) { Radius = CircleRadius(pPointCollection.Point[0], MouseMvePoint); } points = CirclePointCollection(pPointCollection.Point[0], Radius, 80); } DynamicSymbolProps.SetScale(esriDynamicSymbolType.esriDSymbolMarker, 6.0f, 6.0f); DynamicSymbolProps.SetColor(esriDynamicSymbolType.esriDSymbolMarker, 255.0f, 0.0f, 0.0f, 1.0f); DynamicDisplay.DrawMarker(CenterPoint); DynamicSymbolProps.SetScale(esriDynamicSymbolType.esriDSymbolMarker, 1.0f, 1.0f); DynamicSymbolProps.SetColor(esriDynamicSymbolType.esriDSymbolMarker, 255.0f, 0.0f, 0.0f, 1.0f); DynamicDisplay.DrawPolyline(points); DynamicSymbolProps.SetScale(esriDynamicSymbolType.esriDSymbolMarker, 1.0f, 1.0f); DynamicSymbolProps.SetColor(esriDynamicSymbolType.esriDSymbolMarker, 255.0f, 0.0f, 0.0f, 0.5f); DynamicDisplay.DrawPolygon(points); }