GDAL源码剖析(七)之GDAL RasterIO使用说明

GDAL源码剖析(七)之GDAL RasterIO使用说明

转载自:http://blog.csdn.net/liminlu0314/article/details/7072224

 

一、关于RasterIO

在GDAL中读写图像是最基本的操作,那么RasterIO也就是最基本的函数了,关于RasterIO有很多方式,这个函数的功能相当强大,下面慢慢说明。RasterIO一共有两个,一个是GDALRasterBand::RasterIO,另一个是GDALDataset::RasterIO,这两个RasterIO都可以对图像数据来进行读写,大多数情况下是一样的,但是还是有一些区别的。

二、RasterIO参数说明

下面对两个RasterIO的参数进行一个简单的说明:首先是GDALRasterBand::RasterIO  ,该函数的声明如下,具体可以参考下面网址:http://gdal.org/classGDALRasterBand.html#5497e8d29e743ee9177202cb3f61c3c7

  

接下来是GDALDataset::RasterIO ,该函数的什么如下,具体形式可以参考下面的网址: http://gdal.org/classGDALDataset.html#e077c53268d2272eebed10b891a05743

由于这两个函数的参数基本一致,大多数参数都是一样的,下面就一起进行说明:

第一个参数RWFlag来指定是读数据还是写入数据,其值只能有两个即:GF_Read 和GF_Write,分别表示读取数据和写入数据。

第二个和第三个参数nXOff, nYOff表示读取或者写入图像数据的起始坐标图像的左上角坐标为(0,0)。

第四个和第五个参数 nXSize, nYSize表示读取或者写入图像数据的窗口大小,nXSize表示宽度,nYSize表示高度,均使用像素为单位,该宽度和高度是从第二个和第三个参数处开始计算。这两个参数和第二第三个参数一起表示就是,读取和写入图像的窗口位置和大小。

第六个参数pData是指向存储数据的一个指针。如果是写入数据,那么会将pData中的数据写入到栅格图像中去;如果是读取数据,那么会将栅格数据中的数据读入到pData中。pData的真实数据类型是通过后面的eBufType参数来指定的。如GDT_Byte就是代表的是一个8U的数据类型,如果是GDT_Float32就表示的是一个32F(float)的数据类型。RasterIO会自动将读入的数据按照参数eBufType指定的数据类型进行转换,需要注意的是,将浮点数转换为整数时,将对数据进行四舍五入处理;而且从一个大的存储单位转换到一个较小的存储单位是所进行的操作是截断操作而不是按照比例缩小操作,比如原来的实际数据中float的存取数据范围超过了缓冲数据指定的数据byte类型的最大存储范围,操作将把超过byte存储的范围外的数据进行丢弃处理,而不是将float缩小到0~255。

第七个和第八个参数nBufXSize和nBufYSize参数指定缓冲区的大小。注意pData的大小应当是nBufXSize×nBufYSize。当读取的数据是完整分辨率的数据(原始数据,没有进行缩放操作),他们应该设置和取值窗口的大小相同,也就是与第四个和第五个参数相等,但是在读取时使用了缩小或者放大系数,那么他们需要根据这个缩放系数进行调整。在这种情况下,RasterIO将会使用缩略图组overviews(金字塔)中某个合适的缩略图来进行读取数据。

第九个和第十个参数(对于GDALDataset来说还有第十一个参数nBandSpace)nPixelSpace和nLineSpace(以及nBandSpace)参数一般情况下是将0作为缺省值。但是,他们可以用于控制存取的内存数据的排列顺序,可以使用这两个参数将图像数据按照另一种组织形式读取内存缓冲区中。也就是说这两个(三个)参数可以读取或者写入非常规组织的缓冲数据。这个首先可以用于在一个缓冲区中包含多个波段数据,并且各个数据之间是交叉排列的,比如一个图像中的数据组织是RGBRGBRGB…,而普通的数据可能是RRR…GGG…BBB…,我们一般读取到的数据就是RGBRGBRGB…这种排列,现在需要使用RRR…GGG…BBB…这样的排列,一般想法就是自己写个for循环之类的,重新组织一次,其实完全没有必要,只要设置这两个(三个)参数就可以达到这个目的。

nPixelSpace表示的是在一个扫描行中一个像元的字节偏移起始点到下一个像元字节偏移起始点之间的字节间隔,如果默认使用0,那么将使用eBufType作为实际的两个像元之间的字节间隔。

nLineSpace表示在一行数据和下一行数据之间的起始字节见的间隔,如果使用0,那么将会使用eBufType*nBufXSize来表示实际间隔。

此外如果使用的GDALDataset::RasterIO函数,最后还有一个参数叫nBandSpace,同上,这个参数的意思就是一个波段与下一个波段之间的起始字节间的间隔,如果使用0,实际将使用eBufType*nBufXSize*nBufYSize来表示。

对于GDALDataset::RasterIO函数还有两个参数nBandCount和panBandMap,分别表示要读取的波段个数和波段序号,尤其是后一个参数波段序号,可以自定义先读取那一个波段,后读取那一个。具体使用方法见下。

三、RasterIO使用方法示例

使用示例一,在Windsow位图数据颜色排列是BGR,但是图像存储的可能是按照RGB来存储的,一般的做法是将数据按照每个波段读出来,然后再认为的按照BGR来进行组织,其实完全可以使用后面三个参数来将读出来的数据自动按照BGR的方式组织好。只要将参数设置为:nBandCount=3;panBandMap =new int[]{3,2,1}即可。     

   int panBandMap [3]= {3,2,1};   //按照BGR BGR BGR ... 来读取数据组织
        DT_8U *pData = new DT_8U[iWidth*iHeight*3];
        poDataset ->RasterIO(GF_Read, 0, 0, iWidth,iHeight, pData,iWidth, iHeight,        (GDALDataType)iDataType, 3, panBandMap,iDataType*3, iDataType*iMthWidth*3, iDataType);

使用示例二,实现的是将7波段图像中的第2 3 4波段按照3 42的顺序读入内存中,逐像素存储: 

  intbandmap[7];
  bandmap[0]=3;
  bandmap[1]=4;
  bandmap[2]=2;
  Scanline=(nImagSizex*8+31)/32*4;
 BYTE   pafScan=( BYTE )CPLMalloc(sizeof(byte)*nImgSizeX*nImgSizeY*3)
 poDataset->RasterIO(GF_Read, 0, 0,nImgSizeX,nImgSizeY, pafScan,
  nImgSizeX,nImgSizeY,GDT_Byte,3,bandmap,3,Scanline*3,1 );

以这种方式读取之后,直接可构建位图进行显示。这里可以按照自己的需要进行其他方式读取。以上读取方式仅仅为了显示方便,如进行图像处理相关运算,则按波段全部读出会比较方便,即按照常规的方式读取处理:

poDataset->RasterIO( GF_Read, 0,0,nImgSizeX,nImgSizeY, pafScan,
nImgSizeX,nImgSizeY,GDT_Byte,bandcount,0,0,0,0);

之前申请的内存改为:

BYTE  pafScan=new byte[nImgSizeX*nImgSizeY*bandcount];

将图像数据读入内存后,即可通过指针pafScan对图像进行你想要进行的操作了。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
gdal rasterio 是一个基于 Python 的开源库,用于读取、写入和处理栅格数据。它是在 GDAL(地理空间数据抽象库)和 Rasterio(基于 GDAL 的 Python 绑定)的基础上开发的。 gdal rasterio源码包括各种功能和模块,用于处理不同类型的栅格数据,如 DEM(数字高程模型)、卫星影像和遥感数据等。它提供了一种简单而强大的接口,可以在 Python 环境中轻松读取和处理这些数据。 源码中的主要模块包括: 1. 数据读取和写入:gdal rasterio 提供了功能强大的数据读取和写入功能,可以加载不同格式的栅格数据文件,如 TIFF、GeoTIFF、JPEG 等,并将数据保存到不同的格式中。它还支持对栅格数据的各种操作,如投影转换、剪切、裁剪、重采样等。 2. 数据处理和分析:gdal rasterio 还包括一些数据处理和分析的功能,如计算栅格数据的统计信息、计算两个栅格数据的差异、计算栅格数据的直方图等。这些功能使用户能够更加灵活地进行栅格数据的处理和分析。 3. 元数据管理:gdal rasterio 还提供了元数据管理的功能,用户可以读取和修改栅格数据文件的元数据信息,如坐标系、分辨率、地理范围等。这使得用户能够更好地了解和使用栅格数据。 总之,gdal rasterio 是一个功能强大且易于使用的库,可以方便地读取、写入和处理栅格数据。它的源码中包含了各种功能和模块,帮助用户处理不同格式的栅格数据,并提供了各种数据处理和分析的功能,以及元数据管理的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值