最近应用AE开发插值和栅格转等值线的程序,涉及到栅格读写的有关内容。联想到ArcGIS利用了GDAL的某些东西,从AE的OMD中也发现RasterDataset和RasterBand这些命名和GDAL的很相似。所以觉得应该对比学习一下:ArcEngine和GDAL读写栅格数据机制对比。

  AE涉及栅格图像读写的主要是Workspace、RasterDataset、Pixel blocks和 RasterBand。如图所示。RasterDataset实现了接口IrasterBandCollection,是RasterBand的集合。所以RasterDataset依赖于RasterBand。

1)   RasterDataset:

The RasterDataset class represents a raster dataset stored in a storage media, file system, geodatabase, or in memory. RasterDataset is a file raster dataset if it is opened from a file system or a personal geodatabase, and it is a database raster dataset if it is opened from a file geodatabase or an ArcSDE geodatabase. A raster dataset in an unmanaged raster catalog, where raster datasets are stored in a file system, is also a file raster dataset. ArcGIS allows you to create an in-memory RasterDataset where the pixels are stored in memory. This type of raster dataset has the characteristics of a file raster dataset. A file raster dataset and a geodatabase raster dataset behave the same except for some minor differences.

Creating raster datasets in various workspaces requires specifying the properties of the raster data to be created as well as the properties of the storage container. In an ArcSDE geodatabase, raster data is stored as a set of database management system (DBMS) tables that are used to manage the pixel values, pyramids, and other auxiliary information. The pixels of raster data are divided into small tiles, and each tile is stored as a binary large object (BLOB) in a row of the block table. The raster column in the business table defines the properties of the raster dataset, and the geometry column defines properties of the footprint of the raster dataset. A file geodatabase raster has a similar implementation as an ArcSDE geodatabase. The only difference is that raster data is stored as a set of file geodatabase tables in the file system instead of in a relational geodatabase.

IRasterWorkspaceEx is used to create a raster dataset and a raster catalog in a geodatabase. When creating data in a geodatabase, RasterDef can be used to set the properties of the raster field, and RasterStorageDef can be used to specify the storage properties such as tile size, cell size, pyramid origin, and compression. Because raster data in a personal geodatabase is implemented by converting it to an IMAGINE file format and managing it in the personal geodatabase, only some of the raster storage properties apply to a personal geodatabase (such as cell size and compression).

Creating a geodatabase raster dataset using IRasterWorkspaceEx initially creates an empty raster dataset, which servers as a placeholder for the specified properties of the raster dataset. The extent and pixel values of the dataset can be populated by mosaicking from other raster dataset or, alternatively, writing using PixelBlock.

To create a raster dataset in any supported file raster format using IRasterWorkspace2, the origin, number of bands, pixel type, width, and height of the raster dataset must be specified along with other required parameters. The created raster dataset has a specified dimension and a default pixel value. The default pixel value is normally the maximum value of the specified pixel type and can be populated by writing pixel blocks. If IRasterWorkspace2 is used to create a geodatabase raster dataset, the default storage parameters are used.

2)   Raster

The Raster class, in contrast to the static RasterDataset and RasterBand classes, is transient in nature and can be modified without affecting the source data. This allows the raster to represent what you want—for example, you can set a transformation or a pixel filter on a raster, specify a projection or extent, and set other properties without changing the raster dataset. If you want to persist change, the modified raster can be saved to another raster dataset using the ISaveAs interface.

Although Raster is always transient in nature, it must be associated with one or more raster bands, which provides a source for the data to be read through the raster. As such, the Raster is most easily understood as a vehicle to provide resampling, transformation, and data type conversion from one or more raster bands to a desired output coordinate system.

3)   RasterBand

A representation of a single band of a raster dataset on disk.

RasterBand is a non-creatable object. References to non-creatable objects must be obtained through other objects.

The RasterBand object represents an existing band of a raster dataset. This band may be the only band in a single raster dataset or one band in a multiband raster dataset.

A RasterBand can be obtained from a RasterDataset or a Raster using IRasterBandCollection::Item.

The RasterBand class represents an existing band of a raster dataset. You can access a RasterBand of a Raster or a RasterDataset. Regardless of whether it is derived from the static RasterDataset or the transient Raster, the RasterBand always represents a static band of raster data.

The IRasterBand interface provides access to the raster color map, histogram, statistics, and attribute table if they exist.

4)       Pixel blocks

The PixelBlock class is a container for pixel arrays. It has the properties of width, height, pixel type, and number of planes. Each plane is a pixel array corresponding to one raster band. The PixelBlock class can handle generic pixel arrays from any raster data source. To support different pixel types, PixelBlock transports pixels in a SafeArray, which can contain many different data types.

The PixelBlock class is used to read, modify, and write pixel values or a portion of pixel values of the raster data. Create a pixel block from a raster using the IRaster.CreatePixelBlock method. This initializes the size and other properties of the pixel block. Use the IRaster.Read method to read the pixel values into the pixel block, then use IPixelBlock3.PixelData or PixelDataByRef to get or modify the pixel values of the pixel block. The IRasterEdit interface can be used to write the pixel block to the raster dataset.

GDAL涉及栅格图像读写的主要是GDALDataset和GDALRasterBand。

GDALDataset:A set of associated raster bands, usually from one file.

GDALRasterBand:A single raster band (or channel)

理解AE和GDAL的类似要从PixelBlock和RasterIO函数说起。RasterIO的参数说明可以参阅李民录的CADN博客。

CPLErr GDALDataset::RasterIO ( GDALRWFlag  eRWFlag,
    int  nXOff,
    int  nYOff,
    int  nXSize,
    int  nYSize,
    void *  pData,
    int  nBufXSize,
    int  nBufYSize,
    GDALDataType  eBufType,
    int  nBandCount,
    int *  panBandMap,
    int  nPixelSpace,
    int  nLineSpace,
    int  nBandSpace  
  )
eRWFlag  Either GF_Read to read a region of data, or GF_Write to write a region of data.
  nXOff  The pixel offset to the top left corner of the region of the band to be accessed. This would be zero to start from the left side.
  nYOff  The line offset to the top left corner of the region of the band to be accessed. This would be zero to start from the top.
  nXSize  The width of the region of the band to be accessed in pixels.
  nYSize  The height of the region of the band to be accessed in lines.
  pData  The buffer into which the data should be read, or from which it should be written. This buffer must contain at least nBufXSize * nBufYSize * nBandCount words of type eBufType. It is organized in left to right,top to bottom pixel order. Spacing is controlled by the nPixelSpace, and nLineSpace parameters.
  nBufXSize  the width of the buffer image into which the desired region is to be read, or from which it is to be written.
  nBufYSize  the height of the buffer image into which the desired region is to be read, or from which it is to be written.
  eBufType  the type of the pixel values in the pData data buffer. The pixel values will automatically be translated to/from the GDALRasterBand data type as needed.
  nBandCount  the number of bands being read or written.
  panBandMap  the list of nBandCount band numbers being read/written. Note band numbers are 1 based. This may be NULL to select the first nBandCount bands.
  nPixelSpace  The byte offset from the start of one pixel value in pData to the start of the next pixel value within a scanline. If defaulted (0) the size of the datatype eBufType is used.
  nLineSpace  The byte offset from the start of one scanline in pData to the start of the next. If defaulted (0) the size of the datatype eBufType * nBufXSize is used.
  nBandSpace  the byte offset from the start of one bands data to the start of the next. If defaulted (0) the value will be nLineSpace * nBufYSize implying band sequential organization of the data buffer.

PixelBlock的作用是不是和RasterIO函数中的pData、nXSize和nYSize很像?

Raster主要是将数据存储在内存中,用于显示,连接起显示和数据源。

ArcEngine和GDAL读写栅格数据机制对比(一)相关推荐

  1. SSO 认证机制对比

    2019独角兽企业重金招聘Python工程师标准>>> SSO 认证机制对比 博客分类: 架构 几种常用的认证机制 HTTP Basic Auth HTTP Basic Auth简单 ...

  2. gdal读写图像分块处理

    转自赵文原文 gdal读写图像分块处理(精华版) Review: 用gdal,感觉还不如直接用C++底层函数对遥感数据进行处理.因为gdal进行太多封装,如果你仅仅只是Geotif等格式进行处理,IO ...

  3. Fortran读写方式效率对比

    最近对Fortran中各类读写方式的效率产生好奇,将各种情况的效率对比了一下,分享给有需要的同学. 问题:对于计算流体力学中的结构网格数据,怎样的Fortran文件格式读写速度最快? 研究对象:假设有 ...

  4. 计网实验四—TCP Tahoe与Reno运行机制对比分析

    计算机网络实验四--TCP Tahoe与Reno运行机制对比分析 一.实验目的 二.实验内容 三.实验原理 TCP 基于窗口的拥塞控制策略 1.加法增加乘法减少(AIMD)窗口算法 2. TCP 拥塞 ...

  5. rocketmq源码分析之主从读写分离机制

    主从读写分离机制:根据主服务器的消息堆积量来决定消费者是否向从服务器拉取消息消费核心: 开关1:suggestPullingFromSlave:总开关,默认消费者不会消费从服务器. 开关2:sugge ...

  6. GDAL读写矢量文件——C#

    在C#中使用OGR读写矢量数据时,需要引用"using OSGeo.OGR;".同时为了处理中文路径和中文字段,需要在开始设置下面两个属性,代码如下: //为了支持中文路径,请添加 ...

  7. GDAL读写矢量文件——Java

    关于Java配置GDAL库参考之前的博文. 在Java中使用OGR读写矢量数据时,需要导入ogr库,如果需要对中文路径的支持还有空间参考的支持,需要导入gdal和osr库,代码如下: importor ...

  8. 【GDAL学习】用GDAL读取栅格数据

    1.根据坐标读取遥感影像的单个像素值 # week 4: get pixel values at a set of coordinates by reading in one pixel at a t ...

  9. 深度学习建模训练总结(五):梳理NLP发展里程碑——各种注意力机制对比分析

    之前提到,seq2seq的一大缺点是单一的语义向量难以表达长序列的完整语义,而改善这一问题的一个有效方法就是结合注意力机制,在不同的时刻针对输出计算包含不同语义的语义向量: 所谓注意力机制,本质上就是 ...

最新文章

  1. ACM小白入门之必须要了解的东西
  2. EMV内核使用中的常见问题
  3. android git上传出现错误,热更新上传patch包时提示上传失败,文件不合法
  4. python中字典的键是唯一的吗_在python3中反转字典中的键和值(值不唯一)
  5. linux centeros下Redis的安装
  6. 全库检索包含某个值的表名和所在的列.
  7. canvas js 绘图插件_快速入门前端图表插件Echart
  8. ActiveMQ之Topic
  9. express日常开发总结
  10. 性能测试--yslow
  11. 电源大师课笔记 3.5
  12. 慕课-现代通信技术-知识点记录
  13. android系统下载管理器,android 系统下载管理器
  14. 【NiosII训练】第一篇、FPGA驱动AD9854基础篇
  15. 欧盟授权代表EU Representative是什么?
  16. PTA 剥洋葱(C语言 + 详细注释 + 代码超简单)
  17. C# Math.Round小数点后保留两位小数,四舍五入的函数及使用方法
  18. 还在用网易云音乐客户端?out了~
  19. 【SPSS】交叉设计方差分析和协方差分析详细操作教程(附案例实战)
  20. 什么是视频价值?如何体现价值?做自媒体有很多人都弄错了

热门文章

  1. 深度linux_国产系统?基于Linux研发的深度Deepin系统,到底算不算真国产
  2. 2017.3.3 双栈排序 失败总结
  3. Intel® Nehalem/Westmere架构/微架构/流水线 (1) - 特性概述
  4. python Django之Web框架本质 (2)
  5. debian10安装mysql_ECS Debian 系统安装mysql数据库的具体操作
  6. dhcp软件_DHCP和DNS是什么 二者有何区别?
  7. 关于健康吗、核算检测等系统高并发问题的一些思考
  8. c++ 应用socket实现C/S端文件的传输
  9. Codeforces初体验
  10. tcpdump 命令祥解