使用动态图层

使用动态图层
动态图层是一个自定义的图层,当我们定义了这个动态图层之后,他就和一个普通的图层一样,需要添加到一个地图中,然后我们就可以在上面绘制符号和图形等,要使用一个动态图层,按下面的步骤就可以完成:
1开启动态显示功能;
2 创建自定义的动态图层并重写相关的绘图方法(上面提到的第一种方式);
3在Map中添加自定义的动态图层;
4 实时数据的传递.
开启动态地图功能
  1. void InitMap()
  2. {
  3.  
  4.  
  5. IAGSServerObjectName pServerObjectName = GetMapServer("http://services.arcgisonline.com/ArcGIS/services", "ESRI_Imagery_World_2D", false);
  6. IName pName = (IName)pServerObjectName;
  7. IAGSServerObject pServerObject = (IAGSServerObject)pName.Open();
  8. IMapServer pMapServer = (IMapServer)pServerObject;
  9.  
  10. ESRI.ArcGIS.Carto.IMapServerLayer pMapServerLayer = new ESRI.ArcGIS.Carto.MapServerLayerClass();
  11.  
  12. pMapServerLayer.ServerConnect(pServerObjectName, pMapServer.DefaultMapName);
  13.  
  14. axMapControl1.AddLayer(pMapServerLayer as ILayer);
  15.  
  16. axMapControl1.Refresh();
  17.  
  18. pActvie = axMapControl1.Map as IActiveView;
  19.  
  20. IDynamicMap pDynamicMap = pActvie.FocusMap as IDynamicMap;
  21.  
  22. pDynamicMap.DynamicMapEnabled = true;
  23.  
  24. pDynamicMap.DynamicDrawRate = 15;
  25.  
  26.  
  27. }
复制代码

定义自定义的动态图层并重写DrawDynamicLayer方法
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Drawing;
  5. using System.Timers;
  6.  
  7. using ESRI.ArcGIS.ADF;
  8. using ESRI.ArcGIS.ADF.Connection.Local;
  9. using ESRI.ArcGIS.ADF.BaseClasses;
  10. using ESRI.ArcGIS.Geodatabase;
  11. using ESRI.ArcGIS.Geometry;
  12. using ESRI.ArcGIS.Carto;
  13. using ESRI.ArcGIS.Display;
  14. using ESRI.ArcGIS.SystemUI;
  15.  
  16. namespace QARFlight
  17. {
  18.     public sealed class FlightDynamicLayer : BaseDynamicLayer
  19.     {
  20.         public bool m_bOnce = true;
  21.         private IDynamicGlyph m_myGlyph = null;
  22.         IDynamicGlyph m_lineGlyph = null;
  23.         private IDynamicSymbolProperties2 m_dynamicSymbolProps = null;
  24.  
  25.         private IDynamicSymbolProperties2 m_ldynamicSymbolProps = null;
  26.         private IPoint m_point = null;
  27.         private Timer m_updateTimer = null;
  28.  
  29.         public double Course;
  30.  
  31.         public FlightDynamicLayer()
  32.             : base()
  33.         {
  34.             base.m_sName = "My Dynamic layer";
  35.             m_updateTimer = new Timer(10);
  36.             m_updateTimer.Enabled = false;
  37.             m_updateTimer.Elapsed += new ElapsedEventHandler(OnTimerElapsed);
  38.         }
  39.  
  40.         public void Draw(IPoint pPoint)
  41.         {
  42.             this.m_point = pPoint;
  43.         }
  44.  
  45.         IPointCollection pPointCollection;
  46.         /// <summary>
  47.         /// 更新飞机的位置和姿态
  48.         /// </summary>
  49.         /// <param name="x"></param>
  50.         /// <param name="y"></param>
  51.         /// <param name="Course"></param>
  52.         public void Update(double x, double y, double Course)
  53.         {
  54.  
  55.             if (this.m_point == null)
  56.             {
  57.                 m_point = new PointClass();
  58.  
  59.                 pPointCollection = new PolylineClass() as IPointCollection;
  60.  
  61.  
  62.             }
  63.             this.m_point.X = x;
  64.  
  65.             this.m_point.Y = y;
  66.             this.Course = Course;
  67.  
  68.             pPointCollection.AddPoint(this.m_point);
  69.         }
  70.  
  71.         /// <summary>
  72.         /// 获取线的渲染符号
  73.         /// </summary>
  74.         /// <param name="rgbColor"></param>
  75.         /// <param name="inWidth"></param>
  76.         /// <param name="inStyle"></param>
  77.         /// <returns></returns>
  78.         public ESRI.ArcGIS.Display.ISimpleLineSymbol GetSimpleLineSymbol(ESRI.ArcGIS.Display.IRgbColor rgbColor, System.Double inWidth, ESRI.ArcGIS.Display.esriSimpleLineStyle inStyle)
  79.         {
  80.             if (rgbColor == null)
  81.             {
  82.                 return null;
  83.             }
  84.  
  85.             ESRI.ArcGIS.Display.ISimpleLineSymbol simpleLineSymbol = new ESRI.ArcGIS.Display.SimpleLineSymbolClass();
  86.             simpleLineSymbol.Style = inStyle;
  87.             simpleLineSymbol.Color = rgbColor;
  88.             simpleLineSymbol.Width = inWidth;
  89.  
  90.             return simpleLineSymbol;
  91.         }
  92.  
  93.         public override void DrawDynamicLayer(esriDynamicDrawPhase DynamicDrawPhase, IDisplay Display, IDynamicDisplay DynamicDisplay)
  94.         {
  95.             if (DynamicDrawPhase != esriDynamicDrawPhase.esriDDPImmediate)
  96.                 return;
  97.  
  98.             if (!m_bValid || !m_visible)
  99.                 return;
  100.  
  101.             IEnvelope visibleExtent = Display.DisplayTransformation.FittedBounds;
  102.  
  103.             IDynamicGlyphFactory dynamicGlyphFactory = null;
  104.  
  105.  
  106.             if (m_bOnce)
  107.             {
  108.                dynamicGlyphFactory = DynamicDisplay.DynamicGlyphFactory;
  109.                 m_dynamicSymbolProps = DynamicDisplay as IDynamicSymbolProperties2;
  110.  
  111.                 m_ldynamicSymbolProps = DynamicDisplay as IDynamicSymbolProperties2;
  112.                 IDynamicGlyphFactory2 dynamicGlyphFactory2 = dynamicGlyphFactory as IDynamicGlyphFactory2;
  113.  
  114.  
  115.                 IPictureMarkerSymbol pPicture = new PictureMarkerSymbolClass();
  116.  
  117.                 if (this.Course < 0)
  118.                 {
  119.                     this.Course = Math.Abs(this.Course);
  120.                 }
  121.  
  122.                 pPicture.Angle = Course;
  123.                 pPicture.Size = 46;
  124.  
  125.                 pPicture.BitmapTransparencyColor = ESRI.ArcGIS.ADF.Connection.Local.Converter.ToRGBColor(Color.FromArgb(255, 255, 255)) as IColor;
  126.  
  127.                 pPicture.CreateMarkerSymbolFromFile(esriIPictureType.esriIPictureBitmap, @".\plane.bmp");
  128.  
  129.               m_myGlyph = dynamicGlyphFactory.CreateDynamicGlyph(pPicture as ISymbol);
  130.  
  131.  
  132.  
  133.                 m_updateTimer.Enabled = true;
  134.  
  135.                 m_bOnce = false;
  136.  
  137.                 ISimpleLineSymbol pSimpleLineSym = GetSimpleLineSymbol(ESRI.ArcGIS.ADF.Connection.Local.Converter.ToRGBColor(Color.FromArgb(0, 255, 0)) as IRgbColor, 2, esriSimpleLineStyle.esriSLSSolid);
  138.                  m_lineGlyph = dynamicGlyphFactory.CreateDynamicGlyph((ISymbol)pSimpleLineSym);
  139.  
  140.             }
  141.  
  142.             m_dynamicSymbolProps.set_DynamicGlyph(esriDynamicSymbolType.esriDSymbolMarker, m_myGlyph);
  143.             m_dynamicSymbolProps.SetScale(esriDynamicSymbolType.esriDSymbolMarker, 1.0f, 1.0f);
  144.             m_dynamicSymbolProps.set_RotationAlignment(esriDynamicSymbolType.esriDSymbolMarker, esriDynamicSymbolRotationAlignment.esriDSRAScreen);
  145.             DynamicDisplay.DrawMarker(m_point);
  146.  
  147.  
  148.  
  149.  
  150.             if (pPointCollection.PointCount > 1)
  151.             {
  152.                 m_ldynamicSymbolProps.set_DynamicGlyph(esriDynamicSymbolType.esriDSymbolLine, m_lineGlyph);
  153.                             m_ldynamicSymbolProps.SetScale(esriDynamicSymbolType.esriDSymbolLine, 1.0f, 1.0f);
  154.  
  155.                 DynamicDisplay.DrawPolyline(pPointCollection);
  156.             }
  157.   //绘制完毕
  158.             base.m_bIsImmediateDirty = false;
  159.         }
  160.  
  161.         void OnTimerElapsed(object sender, ElapsedEventArgs e)
  162.         {
  163.             //确保下一个绘图周期
  164.             base.m_bIsImmediateDirty = true;
  165.         }
  166.     }
  167. }
复制代码



加载动态图层
  1. FlightDynamicLayer pFlightLayer = new FlightDynamicLayer();
  2.  
  3.  
  4. Global.MainForm.pActvie.FocusMap.AddLayer(pFlightLayer as ILayer);
  5.  
  6. 动态绘制数据
  7.                 pFlightLayer.Update(point.X, point.Y, Course);
  8.  
  9.  
  10.  
  11. public IAGSServerObjectName GetMapServer(string pHostOrUrl, string pServiceName, bool pIsLAN)
  12.         {
  13.  
  14.  
  15.             //设置连接属性
  16.             IPropertySet pPropertySet = new PropertySetClass();
  17.             if (pIsLAN)
  18.                 pPropertySet.SetProperty("machine", pHostOrUrl);
  19.             else
  20.                 pPropertySet.SetProperty("url", pHostOrUrl);
  21.  
  22.             //打开连接
  23.  
  24.             IAGSServerConnectionFactory pFactory = new AGSServerConnectionFactory();
  25.             IAGSEnumServerObjectName pServerObjectNames = pConnection.ServerObjectNames;
  26.             pServerObjectNames.Reset();
  27.             IAGSServerObjectName ServerObjectName = pServerObjectNames.Next();
  28.             while (ServerObjectName != null)
  29.             {
  30.                 if ((ServerObjectName.Name.ToLower() == pServiceName.ToLower()) &&
  31.                     (ServerObjectName.Type == "MapServer") )
  32.                 {
  33.  
  34.                     break;
  35.                 }
  36.                 ServerObjectName = pServerObjectNames.Next();
  37.             }
  38.  
  39.             //返回对象
  40.             return ServerObjectName;
  41.         }
复制代码

你可能感兴趣的:(使用动态图层)