ArcEngine下动态数据的实现显示——概念及接口介绍

GIS经常需要以高频率显示信息并能够清晰的传递地理信息。包括:以动画的方式移动物体,更新位置方位,大小,状态以及属性信息等,这些信息需要迅速更新。

一。ArcGIS 显示子系统管理着要素的显示和刷新,异步刷新显示和大量数据的渲染使得CPU的利用率增大,这可能导致显示延迟等问题.我们看一下ArcGIS 显示子系统的结构图,从这张图我们更能清楚的看到ArcGIS的显示原理:

动态显示技术将渲染大量的数据从CPU端移动到了显卡上,利用了显卡的性能,这明显提高了显示性能.动态显示技术提供同步显示机制使得大量的动态数据以及高频率刷新的操作可以在瞬间完成,下面的图详细的揭示了动态显示技术的逻辑:

 动态图层介绍

动态图层是一个自定义图层,因此应该至少继承ILayer,IDynamicLayer和IGeoDataset三个接口。经过查找帮助文档,ESRI提供BaseDynamicLayer

抽象类,该类实现了上述三个接口,因此我们只需要在实现动态图层的时候继承该类就行。参考官方的文档,我们可以看到BaseDynamicLayer这个抽象类实现了ILayer,IdynamicLayer,ILayerExtensions,IGeoDataset几个接口。

public abstract class BaseDynamicLayer : ESRI.ArcGIS.Carto.IDynamicLayer, ESRI.ArcGIS.Carto.ILayer, ESRI.ArcGIS.Carto.ILayerExtensions, ESRI.ArcGIS.Carto.ILayerGeneralProperties, ESRI.ArcGIS.Carto.IPublishLayer, IDocumentVersionSupportGEN, IPersistVariant, ESRI.ArcGIS.Geodatabase.IGeoDataset  
In order to implemet a DynamicLayer using this base-class, the user has to inherit this base class and override method DrawDynamicLayer().
    三 和动态显示相关的图层

IDynamicMap:控制动态图层的显示。该接口提供Enabled属性来控制动态显示是否可用,这个接口和我们地图是一一对应的.但我们要使用动态图层的时候,必须用该接口开启动态显示功能,也就是Enable属性设置为true。

IDynamicLayer:该接口ILayer和IGeoDataset协同完成动态显示,也就是符号的绘制等,此接口提供了自定义图层动态显示内容的机制。

IDynamicScreenDisplay:控制是否启用动态显示。

IDynamicGlyph:处理动态显示渲染所需的资源。这些资源可以是线,点,文本。

 IDynamicGlyphFactory:该接口用来管理动态符号。用此接口可以创建,删除动态符号,这些符号就是我们上面所提到的IDynamicGlyph的内容

 IDynamicSymbolProperties:该接口用来管理显示符号的大小,比例尺,颜色等. 。在绘制符号前使用该接口控制符号的属性。

IDynamicDisplay:该接口提供了在地图上描绘几何图形的绘图机制,并且提供了访问动态符号工厂对象。在地图上绘制不同的几何图形,该接口和IDynamicSymbolProperties接口协同,使用IDynamicSymbolProperties来设置的动态符号,然后使用IDynamicDisplay绘制形状。IDynamicDisplay接口其实是下面几何绘图回调函数的参数IDynamicLayer.DrawDynamicLayer; IDynamicMapEvents.BeforeDynamicDraw; IDynamicMapEvents.AfterDynamicDraw.

     IDynamicDrawScreen:该接口使用屏幕坐标系在地图上绘制几何图形。首先设置符号的属性,然后使用该接口绘制几何图形。 






  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过以下代码可以实现基于ArcEngine的栅格数据转换成栅格数据集: ``` // 获取栅格工作空间对象 IRasterWorkspace rasterWorkspace = engineWorkspace.OpenRasterWorkspace(rasterWorkspacePath); // 获取待转换的栅格数据对象 IRaster raster = new RasterClass(); raster.CreateFromFile(inputFilePath); // 构造栅格数据集参数对象 IRasterDatasetEdit2 rasterDataset = rasterWorkspace.CreateRasterDataset(rasterDatasetName, "GRID", extent, cellSize, bandCount, pixelType, null); rasterDataset.SetNoDataValue(0, noDataValue); // 设置无效像元值 // 获取栅格数据集编辑对象 IRasterEdit rasterEdit = (IRasterEdit)rasterDataset.Create(); // 将栅格数据写入到栅格数据集中 IPixelBlock pixelBlock = rasterEdit.CreatePixelBlock(new Envelope() { XMin = 0, YMin = 0, XMax = width, YMax = height }); IRasterProps rasterProps = (IRasterProps)raster; IRasterBandCollection rasterBands = (IRasterBandCollection)raster; for (int i = 0; i < bandCount; i++) { // 获取栅格数据的像元值,并设置到栅格数据集的像元块中 IPnt blockSize = new PntClass() { X = width, Y = height }; rasterBands.Item(i).Read(pixelBlock, null, null); rasterEdit.Write(0, 0, blockSize.X, blockSize.Y, pixelBlock.get_SafeArray(0) as System.Array, null); // 设置栅格数据集的像元块属性 IPixelBlock3 pixelBlock3 = (IPixelBlock3)pixelBlock; rasterEdit.WriteBlock(i, 0, 0, width, height, pixelBlock3.get_PixelDataByRef(0)); rasterEdit.Flush(); } // 完成栅格数据集编辑操作 rasterEdit.Refresh(); rasterEdit.CalculateStatistics(); // 释放资源 System.Runtime.InteropServices.Marshal.ReleaseComObject(pixelBlock); System.Runtime.InteropServices.Marshal.ReleaseComObject(rasterEdit); System.Runtime.InteropServices.Marshal.ReleaseComObject(rasterBands); System.Runtime.InteropServices.Marshal.ReleaseComObject(rasterProps); System.Runtime.InteropServices.Marshal.ReleaseComObject(raster); ``` 以上代码中,需要定义的变量有:`rasterWorkspacePath`(栅格工作空间路径)、`inputFilePath`(待转换的栅格数据路径)、`rasterDatasetName`(栅格数据集名称)、`extent`(栅格数据集范围)、`cellSize`(栅格数据集像元大小)、`bandCount`(栅格数据集波段数)、`pixelType`(栅格数据集像元类型)、`noDataValue`(栅格数据集无效像元值)、`width`(栅格数据集宽度)和`height`(栅格数据集高度)。 根据实际需求进行相应的参数设定即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值