GDAL学习笔记——读取和创建栅格数据集
打开栅格⽂件
打开GDAL⽀持的栅格数据之前需要注册驱动,GDALAllRegister()函数将尝试注册所有已知的驱动,包含那些⽤
GDALDriverManager::AutoLoadDrivers()函数⾃动加载的.so⽂件。
GDALAllRegister();
GDALDatat *poDatat;
const char* pszFileName = "C:";
poDa夸人帅的句子 tat = (GDALDatat *)GDALOpen( pszFileName, GA_ReadOnly);
if( poDatat == NULL){
printf( "Open the file failed!");
}
el{
printf( "Open succeed!n" );
}
如果GDALOpen()函数返回NULL,则打开失败,失败信息可以通过CPLError()函数获取。
获取数据集信息
可以使⽤adfGeoTransform[]表⽰⼀些信息:
adfGeoTransform[0] /* top left x */
adfGeoTransform[1] /* w-e pixel resolution */
adfGeoTransform[2] /* 0 */
adfGeoTransform[3] /* top left y */
adfGeoTransform[4] /* 0 */
adfGeoTransform[5] /* n-s pixel resolution (negative value) */
下⾯代码是获取数据集中的⼀些信息:
double adfGeoTransform[6];
printf( "Driver: %s / %sn",
poDatat->GetDriver()->GetDescription(),
poDatat->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ));
printf( "Size is %dx%dx%dn",
poDatat->GetRasterXSize(), poDatat->GetRasterYSize(),
poDatat->GetRasterCount());
if ( poDatat->GetProjectionRef() != NULL)
{
printf( "Projection is '%s'n",
poDatat->GetProjectionRef() );
}
if (poDatat->GetGeoTransform( adfGeoTransform ) == CE_None){
printf( "Origin = (%.6f,%.6f)n",
adfGeoTransform[0], adfGeoTransform[3] );
printf( "Pixel Size = (%.6f,%.6f)n",
adfGeoTransform[1], adfGeoTransform[5] );
}
获取栅格波段
获取栅格波段可以通过GDAL来完成,同时还会获得元数据、块⼤⼩、颜⾊表以及其他不同的信息。
GDALRasterBand *poBand;
int nBlockXSize, nBlockYSize;
int nGotMin, nGotMax;
double adfMinMax[2];
poBand = poDatat->GetRasterBand( 1 );
poBand->GetBlockSize( &nBlockXSize, &nBlockYSize );
printf( "Block = %dx%d Type = %s, ColorInterp = %sn",
nBlockXSize, nBlockYSize,
GDALGetDataTypeName( poBand->GetRasterDataType()),
GDALGetColorInterpretationName( poBand->GetColorInterpretation()) );
adfMinMax[0] = poBand->GetMinimum( &nGotMin );
adfMinMax[1] = poBand->GetMaximum( &nGotMax );
if( !( nGotMin && nGotMax )){
GDALComputeRasterMinMax( (GDALRasterBandH)poBand, TRUE, adfMinMax );
}
printf( "Min = %.3fd, Max = %.3fn",adfMinMax[0], adfMinMax[1] );
if( poBand->GetOverviewCount() > 0 ){
q图片 printf( "Band has %d overviews.n", poBand->GetOverviewCount() );
}
if( poBand->GetColorTable() != NULL){
printf( "Band has a color table with %d entries.n",
poBand->GetColorTable()->GetColorEntryCount() );
}
读取栅格数据
有⼏种⽅法来读取栅格数据,最常⽤的是通过 GDALRasterBand::RasterIO()⽅法,这种⽅法会⾃动的进⾏数据类型转换,向上或向下采
样。下⾯代码是读取相同⼤⼩缓冲区的数据的第⼀⾏,然后将其转换为浮点型。
floa家务的英文 t *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 );
关于GDALRasterBand::RasterIO()的使⽤,可以参考。
创建⽂件
在GDAL⽀持的⽂件格式中,如果格式驱动⽀持创建,则可以创建新⽂件。有两种⽅法创建新⽂件:CreateCopy()和Create()。第⼀个⽅
法是调⽤CreateCopy()函数,传递⼀个需要拷贝的源数据集参数。第⼆个⽅法是调⽤Create()函数。创建新⽂件的所有驱动⽀持
CreateCopy⽅法,只有部分驱动⽀持Create⽅法。
为了确定驱动⽀持CreateCopy⽅法还是Create⽅法,需要检查格式驱动对象中的DCAP_CREATE 和DCAP_CREATECOPY 元数据。在
调⽤GetDriverByName函数之前,需要⽤GDALAllRegister()进⾏驱动注册。下⾯代码是测试该驱动⽀持哪种⽅法:
GDALAllRegister();
/*
* ⽬前,⼦数据集⽀持的驱动有ADRG、ECRGTOC、GEORASTER、GTiff、HDF4、HDF5、netCDF、
* NITF、NTv2、OGDI、PDF、PostGISRaster、Rasterlite、RPFTOC、RS2、WCS和WMS。
*/
const char *pszFormat = "GTiff";
GDALDriver *poDriver;
char **papszMetadata;
poDriver = GetGDALDriverManager()->GetDriverByName( pszFormat );
if (poDriver == NULL){
exit(1);
}
papszMetadata = poDriver三国演义经典故事 ->GetMetadata();
if (CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATE, FALSE ))
printf( "Dr钢笔字图片 iver %s supports Create() method.n", pszFormat );
if ( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATECOPY, FALSE) )
printf( "Driver %s supports CreateCopy() method.n", pszFormat );
使⽤CreateCopy⽅法
该⽅法需要指明需要拷贝的⽂件以及要保存的⽂件。
const char* pszSrcFileName = "C:";
const char* pszDstFileName = "C:";;
GDALDatat *poSrcDS = (GDALDatat *) GDALOpen( pszSrcFileName, GA_ReadOnly );
GDALDatat *poDstDS;
poDstDS = poDriver->CreateCopy( psz晋升申请书范文 DstFileName, poSrcDS, FALSE,
NULL, NULL, NULL );
if( poDstDS != NULL){
GDALClo( (GDALDatatH) poDstDS );
}
GDALClo( (GDALDatatH) poSrcDS );
当需要传⼊更多的参数并且显⽰拷贝的进度,可以进⾏如下设计:
char **papszOptions = NULL;
papszOption电脑主板图 s = CSLSetNameValue( papszOptions, "TILED", "YES" );
papszOptions = CSLSetNameValue( papszOptions, "COMPRESS" ,"PACKBITS" );
poDstDS = poDriver->CreateCopy( pszDstFileName, poSrcDS, FALSE,
papszOptions, GDALTermProgress, NULL);
if( poDstDS != NULL){
GDALClo( (GDALDatatH) poDstDS );
}
GDALClo( (GDALDatatH) poSrcDS );
使⽤Create⽅法
如果不只是将现有⽂件拷贝到指定位置,则可以利⽤ GDALDriver::Create()⽅法创建新的⽂件。create()⽅法接受参数和createcopy()类
似,但是必须要提供图像的⼤⼩、波段数及波段类型。
GDALDatat *poDstDS;
char **papszOptions = NULL;
poDstDS = poDriver->Create( pszDstFilename, 512, 512, 1, GDT_Byte,
papszOptions );
当数据集创建成功,所有恰当的元数据和栅格数据信息就必须写到新建的⽂件中。
double adfGeoTranform[6] = { 444720, 30, 0, 3751320, 0, -30 };
OGRSpatialReference oSRS;//该类需要#include "ogr_spatialref.h"头⽂件
char *pszSRS_WKT = NULL;
GDALRasterBand *poBand;
GByte abyRaster[512 * 512];
poDstDS->SetGeoTransform( adfGeoTranform );
( 11, TRUE );
lKnownGeogCS( "NAD27尽管但是 " );
ToWkt( &pszSRS_WKT );
CPLFree( pszSRS整式的加减思维导图 _WKT );
poBand = poDstDS->GetRasterBand(1);
poBand->RasterIO( GF_Write, 0, 0, 512, 512,
abyRaster, 512, 512, GDT_Byte, 0, 0);
GDALClo( (GDALDatatH) poDstDS );
本文发布于:2023-04-21 15:34:41,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/89/841282.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |