ArcGisEngine利用动态图层实现数据的实时显示(监控)_第1页
ArcGisEngine利用动态图层实现数据的实时显示(监控)_第2页
ArcGisEngine利用动态图层实现数据的实时显示(监控)_第3页
ArcGisEngine利用动态图层实现数据的实时显示(监控)_第4页
ArcGisEngine利用动态图层实现数据的实时显示(监控)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、利用动态图层实现数据的实时显示2011-09-20 10:47:29 作者:刘宇 浏览:188评论:1微博:1.1 前言不刷新地图而能让数据实时显示,这在ArcGIS中已经不在是一个困扰我们的难题,在ArcGIS Engine的开发过程中,每一次更新数据后都需要刷新才能,更改大量数据并不断的刷新,让用户在静静的等待,这不是很痛苦吗?为此ArcGIS提供了一个动态图层,专门用于解决这样问题。ArcGIS 显示子系统管理着要素的显示和刷新,异步刷新显示和大量数据的渲染使得CPU的利用率增大,这可能导致显示延迟等问题.我们看一下ArcGIS 显示子系统的结构图,从这张图我们更能清楚的看到ArcGIS

2、的显示原理:动态显示技术将渲染大量的数据从CPU端移动到了显卡上,利用了显卡的性能,这明显提高了显示性能.动态显示技术提供同步显示机制使得大量的动态数据以及高频率刷新的操作可以在瞬间完成,下面的图详细的揭示了动态显示技术的逻辑:1.2 动态图层介绍动态图层是一个自定义图层,因此至少应该继承ILayer,IDynamiclayer和IGeoDataset这三个接口,好在Esri提供了一个BaseDynamicLayer这个抽象类,该接口已经继承了我们所说的相关接口,因此我们只需要在实现动态图层的时候继承该类就行.1.3 和动态显示相关的接口在了解了动态显示原理之后,我们看下ArcGIS Engi

3、ne为动态显示,提供了那些接口,以下是主要的相关接口:l IDynamicMap该接口提供Enable属性用来控制动态显示是否可用,这个接口和我们地图是一一对应的.但我们要使用动态图层的时候,必须用该接口开启动态显示功能,也就是Enable属性设置为true。l IDynamicLayer该接口和Ialyer以及IGeoDataset接口写作完成动态显示,也就是符号的绘制等,此接口提供了自定义图层动态显示内容的机制l IDynamicScreenDisplay该接口控制是否启用动态显示l IDynamicGlyph这个接口用来处理资源,这些资源可以是线,点,文本,这些资源作为符号将被动显示。l

4、 IDynamicGlyphFactory该接口用来管理动态符号,用此接口可以创建,删除动态符号,这些符号就是我们上面所提到的IDynamicGlyph的内容l IDynamicSymbolProperties该接口用来管理显示符号的大小,比例尺,颜色等.l IDynamicDisplay IDynamicDisplay提供了在地图上描绘几何图形的绘图机制,并且提供了访问动态符号工厂对象.在地图上绘制不同的几何图形,该接口和IDynamicSymbolProperties接口协同,使用IDynamicSymbolProperties来设置的动态符号,然后使用IDynamicDisplay绘制形

5、状。IDynamicDisplay接口其实是下面几何绘图回调函数的参数IDynamicLayer.DrawDynamicLayer; IDynamicMapEvents.BeforeDynamicDraw; IDynamicMapEvents.AfterDynamicDraw.1.4 动态绘制模式动态图层有两种绘制模式,如下:· 重写 IDynamicLayer.DrawDynamicLayer方法 · 通过动态地图的事件: IDynamicMapEvents.BeforeDynamicDraw IDynamicMapEvents.AfterDynamicDraw 1.5

6、绘图选择·使用动态显示API·使用OPengl API1.6 绘制动态图层动态图层,有两种不同的绘图方式,因此有两个绘图阶段 :立即阶段和编译阶段。在每一个阶段,每产生一组新的绘制命令,DrawDynamicLayer方法需要遍历图层的底层数据结构,并为每个项目生成相应的绘图命令,在编译阶段的绘图命令被编译成内部专用的一个清单列表。每一个绘图周期内,动态地图检查每个动态层的状态。如果一个动态层需要重新绘制(动态图层需要重新生成新的绘图命令),动态地图根据相应的绘图阶段调用动态层的DrawDynamicLayer方法,为动态层将产生一套新的绘图命令。如果有多于一个需要重新生成

7、绘图命令的动态图层,则整个动态显示需要重新绘制。动态图层是主动显示方式,也就是说他有一个固定的绘图周期,在每一个绘图周期内,都会检查动态图层的ditry 属性,如果有一个动态图层是dity的,那么都会在所有的动态图层上绘制。动态图层主要有以下两个阶段:Immediate不存储绘图命令. 如果它报告其当前的阶段是脏,在这种情况下,绘制命令,将立即执行Compiled在一个清单中存储绘图命令. 动态显示将使用这个清单列表绘图,当dity 改变了这个清单列表就重新创建。在编译阶段,如果它报告编译阶段是脏的并且它重新编译的速度间隔已经过去了,当这连个条件同时满足的时候,将重新编译显示列表和动态层的绘图

8、命令。动态图层绘制需要实现下面的方法和熟悉:DrawDynamicLayer 在一个给定的阶段向具体的设备绘制图层.DynamicLayerDirty 指示动态图层从上一个指定的绘制阶段是否发生改变 DynamicRecompileRate 重新编译速率是在编译阶段调用绘图方法的时间间隔。当重新绘制的时候,动态显示遍历动态图层并按照下面的步骤:通过检查立即阶段的DynamicLayerDirty以重新编译是否需要,如果任何一个动态图层在理解阶段设置了ditry标志,所有的动态图层都会在立即阶段调用DrawDynamicLayer方法在立即阶段直接调用DrawDynamicLayer方法通过检查

9、编译阶段的DynamicLayerDirty和DynamicRecompileRate属性确定编译是不是需要如果需要的话,在编译阶段通过调用DrawDynamicLayer方法重新编译这个图层在编译阶段通过显示裂变绘图1.7 使用动态图层动态图层是一个自定义的图层,当我们定义了这个动态图层之后,他就和一个普通的图层一样,需要添加到一个地图中,然后我们就可以在上面绘制符号和图形等,要使用一个动态图层,按下面的步骤就可以完成:1开启动态显示功能;2 创建自定义的动态图层并重写相关的绘图方法(上面提到的第一种方式);3在Map中添加自定义的动态图层;4 实时数据的传递.1.7.1 开启动态地图功能v

10、oid InitMap()IAGSServerObjectName pServerObjectName = GetMapServer(" "ESRI_Imagery_World_2D", false);IName pName = (IName)pServerObjectName;IAGSServerObject pServerObject = (IAGSServerObject)pName.Open();IMapServer pMapServer = (IMapServer)pServerObject;ESRI.ArcGIS.Carto.IMapServerLay

11、er pMapServerLayer = new ESRI.ArcGIS.Carto.MapServerLayerClass();pMapServerLayer.ServerConnect(pServerObjectName, pMapServer.DefaultMapName);axMapControl1.AddLayer(pMapServerLayer as ILayer);axMapControl1.Refresh();pActvie = axMapControl1.Map as IActiveView;IDynamicMap pDynamicMap = pActvie.FocusMap

12、 as IDynamicMap;pDynamicMap.DynamicMapEnabled = true;pDynamicMap.DynamicDrawRate = 15;1.7.2 定义自定义的动态图层并重写DrawDynamicLayer方法using System;using System.Collections.Generic;using System.Text;using System.Drawing;using System.Timers;using ESRI.ArcGIS.ADF;using ESRI.ArcGIS.ADF.Connection.Local;using ESRI.

13、ArcGIS.ADF.BaseClasses;using ESRI.ArcGIS.Geodatabase;using ESRI.ArcGIS.Geometry;using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Display;using ESRI.ArcGIS.SystemUI;namespace QARFlightpublic sealed class FlightDynamicLayer : BaseDynamicLayerpublic bool m_bOnce = true;private IDynamicGlyph m_myGlyph = null;I

14、DynamicGlyph m_lineGlyph = null;private IDynamicSymbolProperties2 m_dynamicSymbolProps = null;private IDynamicSymbolProperties2 m_ldynamicSymbolProps = null;private IPoint m_point = null;private Timer m_updateTimer = null;public double Course;public FlightDynamicLayer(): base()base.m_sName = "M

15、y Dynamic layer"m_updateTimer = new Timer(10);m_updateTimer.Enabled = false;m_updateTimer.Elapsed += new ElapsedEventHandler(OnTimerElapsed);public void Draw(IPoint pPoint)this.m_point = pPoint;IPointCollection pPointCollection;/<summary>/更新飞机的位置和姿态/</summary>/<param name="x

16、"></param>/<param name="y"></param>/<param name="Course"></param>public void Update(double x, double y, double Course)if (this.m_point = null)m_point = new PointClass();pPointCollection = new PolylineClass() as IPointCollection;this.m_point.X

17、 = x;this.m_point.Y = y;this.Course = Course;pPointCollection.AddPoint(this.m_point);/<summary>/获取线的渲染符号/</summary>/<param name="rgbColor"></param>/<param name="inWidth"></param>/<param name="inStyle"></param>/<returns&

18、gt;</returns>public ESRI.ArcGIS.Display.ISimpleLineSymbol GetSimpleLineSymbol(ESRI.ArcGIS.Display.IRgbColor rgbColor, System.Double inWidth, ESRI.ArcGIS.Display.esriSimpleLineStyle inStyle)if (rgbColor = null)return null;ESRI.ArcGIS.Display.ISimpleLineSymbol simpleLineSymbol = new ESRI.ArcGIS.

19、Display.SimpleLineSymbolClass();simpleLineSymbol.Style = inStyle;simpleLineSymbol.Color = rgbColor;simpleLineSymbol.Width = inWidth;return simpleLineSymbol;public override void DrawDynamicLayer(esriDynamicDrawPhase DynamicDrawPhase, IDisplay Display, IDynamicDisplay DynamicDisplay)if (DynamicDrawPha

20、se != esriDynamicDrawPhase.esriDDPImmediate)return;if (!m_bValid | !m_visible)return;IEnvelope visibleExtent = Display.DisplayTransformation.FittedBounds;IDynamicGlyphFactory dynamicGlyphFactory = null;if (m_bOnce)dynamicGlyphFactory = DynamicDisplay.DynamicGlyphFactory;m_dynamicSymbolProps = Dynami

21、cDisplay as IDynamicSymbolProperties2;m_ldynamicSymbolProps = DynamicDisplay as IDynamicSymbolProperties2;IDynamicGlyphFactory2 dynamicGlyphFactory2 = dynamicGlyphFactory as IDynamicGlyphFactory2;IPictureMarkerSymbol pPicture = new PictureMarkerSymbolClass();if (this.Course < 0)this.Course = Math

22、.Abs(this.Course);pPicture.Angle = Course;pPicture.Size = 46;pPicture.BitmapTransparencyColor = ESRI.ArcGIS.ADF.Connection.Local.Converter.ToRGBColor(Color.FromArgb(255, 255, 255) as IColor;pPicture.CreateMarkerSymbolFromFile(esriIPictureType.esriIPictureBitmap, ".plane.bmp");m_myGlyph = d

23、ynamicGlyphFactory.CreateDynamicGlyph(pPicture as ISymbol);m_updateTimer.Enabled = true;m_bOnce = false;ISimpleLineSymbol pSimpleLineSym = GetSimpleLineSymbol(ESRI.ArcGIS.ADF.Connection.Local.Converter.ToRGBColor(Color.FromArgb(0, 255, 0) as IRgbColor, 2, esriSimpleLineStyle.esriSLSSolid);m_lineGlyp

24、h = dynamicGlyphFactory.CreateDynamicGlyph(ISymbol)pSimpleLineSym);m_dynamicSymbolProps.set_DynamicGlyph(esriDynamicSymbolType.esriDSymbolMarker, m_myGlyph);m_dynamicSymbolProps.SetScale(esriDynamicSymbolType.esriDSymbolMarker, 1.0f, 1.0f);m_dynamicSymbolProps.set_RotationAlignment(esriDynamicSymbol

25、Type.esriDSymbolMarker, esriDynamicSymbolRotationAlignment.esriDSRAScreen);DynamicDisplay.DrawMarker(m_point);if (pPointCollection.PointCount > 1)m_ldynamicSymbolProps.set_DynamicGlyph(esriDynamicSymbolType.esriDSymbolLine, m_lineGlyph);m_ldynamicSymbolProps.SetScale(esriDynamicSymbolType.esriDSymbolLine, 1.0f, 1.0f);DynamicDisplay.DrawPolyline(pPointCollection);/绘制完毕base.m_bIsImmediateDirty = false;void OnTimerElapsed(object sender, ElapsedEventArgs e)/确保下一个绘图周期base.m_bIsImmediateDirty = true;1.7.3 加载动态图层FlightDynamicLayer pFlightLayer = new FlightDynamicLayer();Global.MainForm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论