C# ArcEngine二次開發之動態圖層


  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);
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM