ArcGisEngine利用动态图层实现数据的实时显示监控Word文档下载推荐.docx
- 文档编号:21950258
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:10
- 大小:40.99KB
ArcGisEngine利用动态图层实现数据的实时显示监控Word文档下载推荐.docx
《ArcGisEngine利用动态图层实现数据的实时显示监控Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ArcGisEngine利用动态图层实现数据的实时显示监控Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
●IDynamicSymbolProperties—该接口用来管理显示符号的大小,比例尺,颜色等.
●IDynamicDisplay—IDynamicDisplay提供了在地图上描绘几何图形的绘图机制,并且提供了访问动态符号工厂对象.在地图上绘制不同的几何图形,该接口和IDynamicSymbolProperties接口协同,使用IDynamicSymbolProperties来设置的动态符号,然后使用IDynamicDisplay绘制形状。
IDynamicDisplay接口其实是下面几何绘图回调函数的参数IDynamicLayer.DrawDynamicLayer;
IDynamicMapEvents.BeforeDynamicDraw;
IDynamicMapEvents.AfterDynamicDraw.
1.4动态绘制模式
动态图层有两种绘制模式,如下:
∙重写IDynamicLayer.DrawDynamicLayer方法
∙通过动态地图的事件:
IDynamicMapEvents.BeforeDynamicDraw
IDynamicMapEvents.AfterDynamicDraw
1.5绘图选择
·
使用动态显示API
使用OPenglAPI
1.6绘制动态图层
动态图层,有两种不同的绘图方式,因此有两个绘图阶段:
立即阶段和编译阶段。
在每一个阶段,每产生一组新的绘制命令,DrawDynamicLayer方法需要遍历图层的底层数据结构,并为每个项目生成相应的绘图命令,在编译阶段的绘图命令被编译成内部专用的一个清单列表。
每一个绘图周期内,动态地图检查每个动态层的状态。
如果一个动态层需要重新绘制(动态图层需要重新生成新的绘图命令),动态地图根据相应的绘图阶段调用动态层的DrawDynamicLayer方法,为动态层将产生一套新的绘图命令。
如果有多于一个需要重新生成绘图命令的动态图层,则整个动态显示需要重新绘制。
动态图层是主动显示方式,也就是说他有一个固定的绘图周期,在每一个绘图周期内,都会检查动态图层的ditry属性,如果有一个动态图层是dity的,那么都会在所有的动态图层上绘制。
动态图层主要有以下两个阶段:
Immediate—不存储绘图命令.如果它报告其当前的阶段是脏,在这种情况下,绘制命令,将立即执行
Compiled—在一个清单中存储绘图命令.动态显示将使用这个清单列表绘图,当dity改变了这个清单列表就重新创建。
在编译阶段,如果它报告编译阶段是脏的并且它重新编译的速度间隔已经过去了,当这连个条件同时满足的时候,将重新编译显示列表和动态层的绘图命令。
动态图层绘制需要实现下面的方法和熟悉:
DrawDynamicLayer
在一个给定的阶段向具体的设备绘制图层.
DynamicLayerDirty
指示动态图层从上一个指定的绘制阶段是否发生改变
DynamicRecompileRate
重新编译速率是在编译阶段调用绘图方法的时间间隔。
当重新绘制的时候,动态显示遍历动态图层并按照下面的步骤:
通过检查立即阶段的DynamicLayerDirty以重新编译是否需要,如果任何一个动态图层在理解阶段设置了ditry标志,所有的动态图层都会在立即阶段调用DrawDynamicLayer方法
在立即阶段直接调用DrawDynamicLayer方法
通过检查编译阶段的DynamicLayerDirty和DynamicRecompileRate属性确定编译是不是需要
如果需要的话,在编译阶段通过调用DrawDynamicLayer方法重新编译这个图层
在编译阶段通过显示裂变绘图
1.7使用动态图层
动态图层是一个自定义的图层,当我们定义了这个动态图层之后,他就和一个普通的图层一样,需要添加到一个地图中,然后我们就可以在上面绘制符号和图形等,要使用一个动态图层,按下面的步骤就可以完成:
1开启动态显示功能;
2创建自定义的动态图层并重写相关的绘图方法(上面提到的第一种方式);
3在Map中添加自定义的动态图层;
4实时数据的传递.
1.7.1开启动态地图功能
voidInitMap()
{
IAGSServerObjectNamepServerObjectName=GetMapServer("
"
ESRI_Imagery_World_2D"
false);
INamepName=(IName)pServerObjectName;
IAGSServerObjectpServerObject=(IAGSServerObject)pName.Open();
IMapServerpMapServer=(IMapServer)pServerObject;
ESRI.ArcGIS.Carto.IMapServerLayerpMapServerLayer=newESRI.ArcGIS.Carto.MapServerLayerClass();
pMapServerLayer.ServerConnect(pServerObjectName,pMapServer.DefaultMapName);
axMapControl1.AddLayer(pMapServerLayerasILayer);
axMapControl1.Refresh();
pActvie=axMapControl1.MapasIActiveView;
IDynamicMappDynamicMap=pActvie.FocusMapasIDynamicMap;
pDynamicMap.DynamicMapEnabled=true;
pDynamicMap.DynamicDrawRate=15;
}
1.7.2定义自定义的动态图层并重写DrawDynamicLayer方法
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Drawing;
usingSystem.Timers;
usingESRI.ArcGIS.ADF;
usingESRI.ArcGIS.ADF.Connection.Local;
usingESRI.ArcGIS.ADF.BaseClasses;
usingESRI.ArcGIS.Geodatabase;
usingESRI.ArcGIS.Geometry;
usingESRI.ArcGIS.Carto;
usingESRI.ArcGIS.Display;
usingESRI.ArcGIS.SystemUI;
namespaceQARFlight
publicsealedclassFlightDynamicLayer:
BaseDynamicLayer
publicboolm_bOnce=true;
privateIDynamicGlyphm_myGlyph=null;
IDynamicGlyphm_lineGlyph=null;
privateIDynamicSymbolProperties2m_dynamicSymbolProps=null;
privateIDynamicSymbolProperties2m_ldynamicSymbolProps=null;
privateIPointm_point=null;
privateTimerm_updateTimer=null;
publicdoubleCourse;
publicFlightDynamicLayer()
:
base()
base.m_sName="
MyDynamiclayer"
;
m_updateTimer=newTimer(10);
m_updateTimer.Enabled=false;
m_updateTimer.Elapsed+=newElapsedEventHandler(OnTimerElapsed);
publicvoidDraw(IPointpPoint)
this.m_point=pPoint;
IPointCollectionpPointCollection;
///<
summary>
///更新飞机的位置和姿态
/summary>
paramname="
x"
>
<
/param>
y"
Course"
publicvoidUpdate(doublex,doubley,doubleCourse)
if(this.m_point==null)
m_point=newPointClass();
pPointCollection=newPolylineClass()asIPointCollection;
this.m_point.X=x;
this.m_point.Y=y;
this.Course=Course;
pPointCollection.AddPoint(this.m_point);
///获取线的渲染符号
rgbColor"
inWidth"
inStyle"
returns>
/returns>
publicESRI.ArcGIS.Display.ISimpleLineSymbolGetSimpleLineSymbol(ESRI.ArcGIS.Display.IRgbColorrgbColor,System.DoubleinWidth,ESRI.ArcGIS.Display.esriSimpleLineStyleinStyle)
if(rgbColor==null)
returnnull;
ESRI.ArcGIS.Display.ISimpleLineSymbolsimpleLineSymbol=newESRI.ArcGIS.Display.SimpleLineSymbolClass();
simpleLineSymbol.Style=inStyle;
simpleLineSymbol.Color=rgbColor;
simpleLineSymbol.Width=inWidth;
returnsimpleLineSymbol;
publicoverridevoidDrawDynamicLayer(esriDynamicDrawPhaseDynamicDrawPhase,IDisplayDisplay,IDynamicDisplayDynamicDisplay)
if(DynamicDrawPhase!
=esriDynamicDrawPhase.esriDDPImmediate)
return;
if(!
m_bValid||!
m_visible)
IEnvelopevisibleExtent=Display.DisplayTransformation.FittedBounds;
IDynamicGlyphFactorydynamicGlyphFactory=null;
if(m_bOnce)
dynamicGlyphFactory=DynamicDisplay.DynamicGlyphFactory;
m_dynamicSymbolProps=DynamicDisplayasIDynamicSymbolProperties2;
m_ldynamicSymbolProps=DynamicDisplayasIDynamicSymbolProperties2;
IDynamicGlyphFactory2dynamicGlyphFactory2=dynamicGlyphFactoryasIDynamicGlyphFactory2;
IPictureMarkerSymbolpPicture=newPictureMarkerSymbolClass();
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))asIColor;
pPicture.CreateMarkerSymbolFromFile(esriIPictureType.esriIPictureBitmap,@"
.\plane.bmp"
);
m_myGlyph=dynamicGlyphFactory.CreateDynamicGlyph(pPictureasISymbol);
m_updateTimer.Enabled=true;
m_bOnce=false;
ISimpleLineSymbolpSimpleLineSym=GetSimpleLineSymbol(ESRI.ArcGIS.ADF.Connection.Local.Converter.ToRGBColor(Color.FromArgb(0,255,0))asIRgbColor,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.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;
voidOnTimerElapsed(objectsender,ElapsedEventArgse)
//确保下一个绘图周期
base.m_bIsImmediateDirty=true;
1.7.3加载动态图层
FlightDynamicLayerpFlightLayer=newFlightDynamicLayer();
Global.MainForm.pActvie.FocusMap.AddLayer(pFlightLayerasILayer);
1.7.4动态绘制数据
pFlightLayer.Update(point.X,point.Y,Course);
publicIAGSServerObjectNameGetMapServer(stringpHostOrUrl,stringpServiceName,boolpIsLAN)
//设置连接属性
IPropertySetpPropertySet=newPropertySetClass();
if(pIsLAN)
pPropertySet.SetProperty("
machine"
pHostOrUrl);
else
url"
//打开连接
IAGSServerConnectionFactorypFactory=newAGSServerConnectionFactory();
IAGSEnumServerObjectNamepServerObjectNames=pConnection.ServerObjectNames;
pServerObjectNames.Reset();
IAGSServerObjectNameServerObjectName=pServerObjectNames.Next();
while(ServerObjectName!
=null)
if((ServerObjectName.Name.ToLower()==pServiceName.ToLower())&
&
(ServerObjectName.Type=="
MapServer"
))
break;
ServerObjectName=pServerObjectNames.Next();
//返回对象
returnServerObjectName;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ArcGisEngine 利用 动态 实现 数据 实时 显示 监控