GDAL学习笔记——读取和创建栅格数据集

更新时间:2023-04-21 15:34:41 阅读: 评论:0


2023年4月21日发(作者:韶关公务员)

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();

/*

* ⽬前,⼦数据集⽀持的驱动有ADRGECRGTOCGEORASTERGTiffHDF4HDF5netCDF

* NITFNTv2OGDIPDFPostGISRasterRasterliteRPFTOCRS2WCSWMS

*/

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小时内删除。

标签:DCAP
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图