ArcEngine利用动态图层实现数据的实时显示
更新时间:2023-09-15 20:14:01 阅读量: 高中教育 文档下载
利用动态图层实现数据的实时显示
本帖最后由 sishui198 于 2011-8-25 09:04 编辑
前言
不刷新地图而能让数据实时显示,这在ArcGIS中已经不在是一个困扰我们的难题,在ArcGIS Engine的开发过程中,每一次更新数据后都需要刷新才能,更改大量数据并不断的刷新,让用户在静静的等待,这不是很痛苦吗?为此ArcGIS提供了一个动态图层,专门用于解决这
样问题。
ArcGIS 显示子系统管理着要素的显示和刷新,异步刷新显示和大量数据的渲染使得CPU的利用率增大,这可能导致显示延迟等问题.我们看一下ArcGIS 显示子系统的结构图,从这张
图我们更能清楚的看到ArcGIS的显示原理:
动态显示技术将渲染大量的数据从CPU端移动到了显卡上,利用了显卡的性能,这明显提高了显示性能.动态显示技术提供同步显示机制使得大量的动态数据以及高频率刷新的操作
可以在瞬间完成,下面的图详细的揭示了动态显示技术的逻辑:
动态图层介绍
动态图层是一个自定义图层,因此至少应该继承ILayer,IDynamiclayer和IGeoDataset这三个接口,好在Esri提供了一个BaseDynamicLayer这个抽象类,该接口已经继承了我们
所说的相关接口,因此我们只需要在实现动态图层的时候继承该类就行.
和动态显示相关的接口
在了解了动态显示原理之后,我们看下ArcGIS Engine为动态显示,提供了那些接口,以下是
主要的相关接口
l IDynamicMap—该接口提供Enable属性用来控制动态显示是否可用,这个接口和我们地图是一一对应的.但我们要使用动态图层的时候,必须用该接口开启动态显示功能,也就是
Enable属性设置为true。
l IDynamicLayer—该接口和Ialyer以及IGeoDataset接口写作完成动态显示,也就是符号
的绘制等,此接口提供了自定义图层动态显示内容的机制 l IDynamicScreenDisplay—该接口控制是否启用动态显示
l IDynamicGlyph—这个接口用来处理资源,这些资源可以是线,点,文本,这些资源作为符号
将被动显示。
l IDynamicGlyphFactory—该接口用来管理动态符号,用此接口可以创建,删除动态符号,这
些符号就是我们上面所提到的IDynamicGlyph的内容
l IDynamicSymbolProperties—该接口用来管理显示符号的大小,比例尺,颜色等. l IDynamicDisplay— IDynamicDisplay提供了在地图上描绘几何图形的绘图机制,并且提
供了访问动态符号工厂对象.在地图上绘制不同的几何图形,该接口和
IDynamicSymbolProperties接口协同,使用IDynamicSymbolProperties来设置的动态符号,
然后使用IDynamicDisplay绘制形状。IDynamicDisplay接口其实是下面几何绘图回调函数的参数IDynamicLayer.DrawDynamicLayer; IDynamicMapEvents.BeforeDynamicDraw;
IDynamicMapEvents.AfterDynamicDraw.
动态绘制模式
动态图层有两种绘制模式,如下:
· 重写 IDynamicLayer.DrawDynamicLayer方法
· 通过动态地图的事件:
IDynamicMapEvents.BeforeDynamicDraw IDynamicMapEvents.AfterDynamicDraw
绘图选择 · 使用动态显示API · 使用OPengl API
绘制动态图层
动态图层,有两种不同的绘图方式,因此有两个绘图阶段 :立即阶段和编译阶段。在每一个阶段,每产生一组新的绘制命令,DrawDynamicLayer方法需要遍历图层的底层数据结构,并为每个项目生成相应的绘图命令,在编译阶段的绘图命令被编译成内部专用的一个清单
列表。
每一个绘图周期内,动态地图检查每个动态层的状态。如果一个动态层需要重新绘制(动态
图层需要重新生成新的绘图命令),动态地图根据相应的绘图阶段调用动态层的DrawDynamicLayer方法,为动态层将产生一套新的绘图命令。如果有多于一个需要重新生成
绘图命令的动态图层,则整个动态显示需要重新绘制。
动态图层是主动显示方式,也就是说他有一个固定的绘图周期,在每一个绘图周期内,都会检查动态图层的ditry 属性,如果有一个动态图层是dity的,那么都会在所有的动态图
层上绘制。动态图层主要有以下两个阶段
· Immediate—不存储绘图命令. 如果它报告其当前的阶段是脏,在这种情况下,绘制命令,
将立即执行
· Compiled—在一个清单中存储绘图命令. 动态显示将使用这个清单列表绘图,当dity 改变了这个清单列表就重新创建。在编译阶段,如果它报告编译阶段是脏的并且它重新编译的速度间隔已经过去了,当这连个条件同时满足的时候,将重新编译显示列表和动态层的
绘图命令。
动态图层绘制需要实现下面的方法和熟悉:
DrawDynamicLayer
在一个给定的阶段向具体的设备绘制图层.
DynamicLayerDirty
指示动态图层从上一个指定的绘制阶段是否发生改变
DynamicRecompileRate
重新编译速率是在编译阶段调用绘图方法的时间间隔。
当重新绘制的时候,动态显示遍历动态图层并按照下面的步骤
· 通过检查立即阶段的DynamicLayerDirty以重新编译是否需要,如果任何一个动态图层在理解阶段设置了ditry标志,所有的动态图层都会在立即阶段调用DrawDynamicLayer方
法
· 在立即阶段直接调用DrawDynamicLayer方法
· 通过检查编译阶段的DynamicLayerDirty和DynamicRecompileRate属性确定编译是不
是需要
· 如果需要的话,在编译阶段通过调用DrawDynamicLayer方法重新编译这个图层
· 在编译阶段通过显示裂变绘图
使用动态图层
动态图层是一个自定义的图层,当我们定义了这个动态图层之后,他就和一个普通的图层一样,需要添加到一个地图中,然后我们就可以在上面绘制符号和图形等,要使用一个动
态图层,按下面的步骤就可以完成:
1开启动态显示功能;
2 创建自定义的动态图层并重写相关的绘图方法(上面提到的第一种方式);
3在Map中添加自定义的动态图层;
4 实时数据的传递. 开启动态地图功能 void InitMap()
{
IAGSServerObjectName pServerObjectName =
GetMapServer(\http://services.arcgisonline.com/ArcGIS/services\
\IName pName = (IName)pServerObjectName;
IAGSServerObject pServerObject = (IAGSServerObject)pName.Open();
IMapServer pMapServer = (IMapServer)pServerObject;
ESRI.ArcGIS.Carto.IMapServerLayer 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 as IDynamicMap;
pDynamicMap.DynamicMapEnabled = true;
pDynamicMap.DynamicDrawRate = 15;
}
定义自定义的动态图层并重写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.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.SystemUI;
namespace QARFlight
{
public sealed class FlightDynamicLayer : BaseDynamicLayer
{
public bool m_bOnce = true;
private IDynamicGlyph m_myGlyph = null;
IDynamicGlyph 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_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;
///
///
///
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 = x;
this.m_point.Y = y; this.Course = Course;
pPointCollection.AddPoint(this.m_point);
}
///
///
///
///
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.Display.SimpleLineSymbolClass();
simpleLineSymbol.Style = inStyle; simpleLineSymbol.Color = rgbColor; simpleLineSymbol.Width = inWidth;
return simpleLineSymbol;
}
public override void DrawDynamicLayer(esriDynamicDrawPhase DynamicDrawPhase,
IDisplay Display, IDynamicDisplay DynamicDisplay)
{
if (DynamicDrawPhase != 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 = DynamicDisplay as IDynamicSymbolProperties2;
m_ldynamicSymbolProps = DynamicDisplay as IDynamicSymbolProperties2; IDynamicGlyphFactory2 dynamicGlyphFactory2 = dynamicGlyphFactory as
IDynamicGlyphFactory2;
IPictureMarkerSymbol pPicture = new PictureMarkerSymbolClass();
if (this.Course < 0)
{
this.Course = Math.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,
@\
m_myGlyph = dynamicGlyphFactory.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_lineGlyph = 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(esriDynamicSymbolType.esriDSymbolMa
rker, 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;
} } }
加载动态图层
FlightDynamicLayer pFlightLayer = new FlightDynamicLayer();
Global.MainForm.pActvie.FocusMap.AddLayer(pFlightLayer as ILayer);
动态绘制数据
pFlightLayer.Update(point.X, point.Y, Course);
public IAGSServerObjectName GetMapServer(string pHostOrUrl, string pServiceName,
bool pIsLAN)
{
//设置连接属性
IPropertySet pPropertySet = new PropertySetClass();
if (pIsLAN)
pPropertySet.SetProperty(\
else
pPropertySet.SetProperty(\
//打开连接
IAGSServerConnectionFactory pFactory = new AGSServerConnectionFactory(); IAGSEnumServerObjectName pServerObjectNames = pConnection.ServerObjectNames;
pServerObjectNames.Reset();
IAGSServerObjectName ServerObjectName = pServerObjectNames.Next();
while (ServerObjectName != null)
{
if ((ServerObjectName.Name.ToLower() == pServiceName.ToLower()) &&
(ServerObjectName.Type == \
{ break; }
ServerObjectName = pServerObjectNames.Next();
} //返回对象
return ServerObjectName;
}
结合赖晓辉同学的上次的那个飞机飞行的,我将这个动态图层添加进去实现了飞机飞行三
维轨迹和二维轨迹的同步,效果如下:
正在阅读:
东财随机-企业战略管理(含答案)解读05-29
2013年如何学习房地产经纪人《基本制度与政策》科目每日一讲(603-24
宁艾小学基本情况督导检查汇报材料03-08
旅游企业成功案例分析大集合02-20
《魅力四射》观后感精选10篇12-12
公共危机管理理论06-02
徒手心肺复苏术操作方法图示( 思齐友情制作)(下)06-06
中牟县城区解放路青年路街区拆迁补偿安置03-14
- 上海大众、一汽大众、东风日产车型与VIN代号对照表
- 第2章服装原型及原型制作
- 江苏省工商行政管理系统经济户口管理办法及四项制度
- 纪检监察业务知识试题2
- 传感器综合题答案
- 北京第二外国语学院翻硕招生人数及学费
- 初三新编英语教材下册
- 公司庆中秋、迎国庆联欢会客串词
- 向区委常委会汇报安全生产工作材料
- 2006年GCT英语模拟试题(三)及答案解析
- 经济法概念的早期使用
- 我爱做家务课堂教学设计
- 学校安全工作月报表、消防安全排查表、消防隐患排查台账
- 成本会计毕业论文
- 班级文化建设论文
- 2018年天津市高考文科试题与答案汇总(Word版) - 图文
- 铁路论文
- 2017年嵌入式系统设计师考试时间及地点
- 1.111--灾害与突发公共卫生事件应急预案
- 起爆点主图 注意买入 拉升 逃顶源码指标通达信指标公式源码
- 实时
- ArcEngine
- 利用
- 实现
- 动态
- 数据
- 显示
- 2015年天原杯化学复赛试题
- 植物生理学全课程讲义
- 语文湘教版六年级下册《风雪重围》第2课时教案
- 浅谈山西潞安集团资本运营
- 2014-2015学年新人教版小学数学五年级下第三次月考试卷2(带解析)
- 生物制药工艺学复习题
- 球与各种几何体切、接问题专题(一)
- 室分成品保护方案、措施待完善20160615 - 图文
- GolGohar Iron Ore Co - 图文
- 08-32拨道 系统调试
- 北京市家庭居室装饰装修工程参考价格说明
- 水质分析题库
- 煤矿开采技术毕业论文 - --如何运用科学技术提高采矿方法创效益
- WY9故障录波103规约组网操作流程
- 年产30万吨选矿技改扩建融资投资立项项目可行性研究报告(非常详细)
- Excel实现自动计提固定资产累计折旧
- PLC+小区照明组态+控制系统
- GDFJ012广东省建筑业施工项目参加工伤保险登记表
- 学校防空演练方案(示例)
- 2018年宁夏回族自治区中考语文试题及参考答案(WORD版)