编辑: 丶蓶一 | 2019-07-15 |
entries.'
读光栅数据 GDAL有几种读光栅数据的方法,但是GDALRasterBand::RasterIO()是最常用的一种. 该函数可以自动转换数据类型、采样以及裁剪.下面的代码读光栅的第1行数据, 同时转换为float保存到缓冲. In C++: float *pafScanline;
int nXSize = poBand->
GetXSize();
pafScanline = (float *) CPLMalloc(sizeof(float)*nXSize);
poBand->
RasterIO( GF_Read, 0, 0, nXSize, 1, pafScanline, nXSize, 1, GDT_Float32, 0,
0 );
In C: float *pafScanline;
int nXSize = GDALGetRasterBandXSize( hBand );
pafScanline = (float *) CPLMalloc(sizeof(float)*nXSize);
GDALRasterIO( hBand, GF_Read, 0, 0, nXSize, 1, pafScanline, nXSize, 1, GDT_Float32, 0,
0 );
In Python: scanline = band.ReadRaster( 0, 0, band.XSize, 1, \ band.XSize, 1, GDT_Float32 ) 返回的是一个string,包含了xsize*4大小的二进制数据,是float类型指针. 可以使用python的struct模块转换为python数据类型: import struct tuple_of_floats = struct.unpack('
f'
* b2.XSize, scanline) RasterIO函数的完整说明如下: CPLErr GDALRasterBand::RasterIO( GDALRWFlag eRWFlag, int nXOff, int nYOff, int nXSize, int nYSize, void * pData, int nBufXSize, int nBufYSize, GDALDataType eBufType, int nPixelSpace, int nLineSpace ) RasterIO()可以通过指定eRWFlag参数来确定是读/写数据(GF_Read或GF_Write). 参数nXOff/nYOff/nXSize/nYSize描述了要读的影象范围(或者是写).同时它也可以 自动处理边界等特殊情况. 参数pData指定读/写对应的缓冲.缓冲的类型必须是eBufType中定义的, 例如GDT_Float
32、GDT_Byte等.RasterIO ()会自动转换缓冲和波段的类型, 使它们一致.当数据向下转换时,或者是数据超出转换后的数据类型可以表示的范围时, 将会用最接近的数据来代替.例如一个 16位的整数被转换为GDT_Byte时,所有大于255的 值都会用255代替(数据并不会被缩放). 参数nBufXSize和nBufYSize描述了缓冲的大小.当时读写是是全部数据时, 该值和影象的大小相同.当需要对影象抽样的时候,缓冲也可以比真实的影象小. 因此,利用RasterIO()实现预览功能是很方便的. 参数nPixelSpace和nLineSpace通常被设置为0.当然,也可以使用他们来控制内存中的数据. 关闭Dataset 需要强调的一点是:GDALRasterBand对象属于相应的dataset,用户不能私自delete 任何GDALRasterBand对象.GDALDataset可以用GDALClose()关闭数据,或者是直接 delete GDALDataset对象.关闭GDALDataset的时候会进行相关的清除操作和刷新一些写操作. 创建文件的技巧 如果相应格式的驱动支持写操作的话,则可以创建文件.GDAL有两函数可以创建文件: CreateCopy()和Create(). CreateCopy()函数直接从参数给定的数据集复制数据. Create()函数........