GDAL工具集代码实现(C/C++)

GDAL2.0 开始,可以使用代码实现GDAL工具集的功能,即可以使用代码调用gdal工具集,可以提升编码效率。需要注意,使用参数时,需要逐个添加,不能一行按照空格添加。

下面主要介绍 gdalinfo gdalwarp gdal_translate ogr2ogr 几个常用工具的代码实现,其他可用工具见 GDAL官网gdal_utils.h: GDAL Utilities C API 说明,包括 gdaldem gdal_rasterize nearblack gdal_grid gdalbuildvrt 几个工具,其余工具官方正在添加。

使用前,需要添加以下头文件:

#include "gdal_priv.h"
#include "cpl_string.h"
#include "gdal_utils.h"

gdalinfo

gdalinfo文件信息工具 工具功能可以使用 GDALInfo 函数实现,具体定义如下:

/**
* @param hDataset   需要获取信息的数据集
* @param psOptions  gdalinfo命令参数
* @return 返回数据集信息
*/
char* GDALInfo      (       GDALDatasetH    hDataset,
const GDALInfoOptions *     psOptions
)

基本使用方式如下:

GDALAllRegister();
GDALDatasetH TestDs = GDALOpen( "testfile.tiff", GA_ReadOnly );
char* info = GDALInfo(TestDs,NULL);
std::cout<<info<<std::endl;
//do something
GDALClose(TestDs);

如果需要使用命令行参数,则需要创建 GDALInfoOptions 代码如下:

GDALAllRegister();
//添加命令参数
char **argv = NULL;
argv = CSLAddString( argv, "-json");
argv = CSLAddString( argv, "-hist");
GDALInfoOptions *opt = GDALInfoOptionsNew(argv,NULL);
GDALDatasetH TestDs = GDALOpen( "testfile.tiff", GA_ReadOnly );
char* info = GDALInfo(TestDs,opt);
GDALInfoOptionsFree(opt);
std::cout<<info<<std::endl;
//do something
GDALClose(TestDs);

gdalwarp

gdalwarp 图像纠正工具 工具功能可以使用 GDALWarp 函数实现,具体定义如下:

/**
* @param pszDest      输出路径,或者NULL
* @param hDstDS       输出数据集或为NULL(前两参数必须选一)
* @param nSrcCount    输入数据集个数
* @param pahSrcDS     输入数据集列表
* @param psOptionsIn  命令行参数
* @param pbUsageError 返回值,标识错误信息
* @return  输出数据集(如果hDstDS为NULL,返回的数据集必须使用GDALClose关闭)
*/
GDALDatasetH GDALWarp       (
    const char *    pszDest,
    GDALDatasetH    hDstDS,
    int     nSrcCount,
    GDALDatasetH *  pahSrcDS,
    const GDALWarpAppOptions *      psOptionsIn,
    int *   pbUsageError
)

基本使用方式如下:

GDALAllRegister();
//添加命令参数,每次添加一个!!!
char **argv = NULL;
argv = CSLAddString( argv, "-order" );
argv = CSLAddString( argv, "3" );
argv = CSLAddString( argv, "-ts" );
argv = CSLAddString( argv, "1000" );
argv = CSLAddString( argv, "1000" );

//错误实例!!!!
//error!!!!
//////argv = CSLAddString( argv, "-order 3 -ts 1000 1000" );//此写法错误,按照上面写!!!!
//error!!!!

//返回
int bUsageError = FALSE;
//输入列表
GDALDatasetH TestDs = GDALOpen("test.tif", GA_ReadOnly );
//gdalwarp
GDALWarpAppOptions *opt = GDALWarpAppOptionsNew( argv, NULL );
GDALDataset *dst = ( GDALDataset * )GDALWarp( "out.tif", NULL, 1,\
                   &TestDs ,opt, &bUsageError );
GDALWarpAppOptionsFree( opt );
CSLDestroy( argv );
//do something
//clear env
GDALClose(dst);
GDALClose(TestDs);

如果有多个文件输入,使用如下代码:

GDALAllRegister();
//添加命令参数,每次添加一个!!!
char **argv = NULL;
argv = CSLAddString( argv, "-order" );
argv = CSLAddString( argv, "3" );
argv = CSLAddString( argv, "-ts" );
argv = CSLAddString( argv, "1000" );
argv = CSLAddString( argv, "1000" );

//错误实例!!!!
//error!!!!
//////argv = CSLAddString( argv, "-order 3 -ts 1000 1000" );//此写法错误,按照上面写!!!!
//error!!!!

//返回
int bUsageError = FALSE;
//输入列表
GDALDatasetH TestDs = GDALOpen("test.tif", GA_ReadOnly );
GDALDatasetH *srcList = NULL;
srcList = ( GDALDatasetH * ) CPLRealloc( srcList, sizeof( GDALDatasetH ) * 1 );
srcList[0] = TestDs;//有多少写多少
//gdalwarp
GDALWarpAppOptions *opt = GDALWarpAppOptionsNew( argv, NULL );
GDALDataset *dst = ( GDALDataset * )GDALWarp( "out.tif", NULL, 1,\
                   srcList ,opt, &bUsageError );
GDALWarpAppOptionsFree( opt );
CSLDestroy( argv );
//do something
//clear env
GDALClose(dst);
GDALClose(TestDs);
CPLFree(srcList);

gdal_translate

gdal_translate格式转换工具 工具功能可以使用 GDALTranslate 函数实现,具体定义如下:

/**
* @param pszDest      输出路径
* @param hSrcDataset  输入数据集
* @param psOptionsIn  命令行参数,可以为空
* @param pbUsageError 返回值,标识错误信息
* @return  输出数据集(如果hDstDS为NULL,返回的数据集必须使用GDALClose关闭)
*/
GDALDatasetH GDALTranslate  (
    const char *    pszDest,
    GDALDatasetH    hSrcDataset,
    const GDALTranslateOptions *    psOptionsIn,
    int *   pbUsageError
)

基本使用方式如下:

GDALAllRegister();
//添加命令参数,每次添加一个!!!
char **argv = NULL;
argv = CSLAddString( argv, "-ot" );
argv = CSLAddString( argv, "UInt16" );

//错误实例!!!!
//error!!!!
//////argv = CSLAddString( argv, "-ot UInt16" );//此写法错误,按照上面写!!!!
//error!!!!

//返回
int bUsageError = FALSE;
//输入列表
GDALDatasetH TestDs = GDALOpen( "test.tif", GA_ReadOnly );
//GDALTranslate
GDALTranslateOptions *opt =  GDALTranslateOptionsNew( argv, NULL );
GDALDataset *dst = ( GDALDataset * )GDALTranslate( "out.tif", TestDs ,opt, &bUsageError );
GDALTranslateOptionsFree( opt );
CSLDestroy( argv );

ogr2ogr

ogr2ogr 工具功能可以使用 GDALVectorTranslate 函数实现,具体定义如下:

/**
* @param pszDest      输出路径,或者NULL
* @param hDstDS       输出数据集或为NULL(前两参数必须选一)
* @param nSrcCount    输入数据集个数(至2.1.1为止,只能有1个)
* @param pahSrcDS     输入数据集列表
* @param psOptionsIn  命令行参数
* @param pbUsageError 返回值,标识错误信息
* @return  输出数据集(如果hDstDS为NULL,返回的数据集必须使用GDALClose关闭)
*/
GDALDatasetH GDALVectorTranslate    (
    const char *    pszDest,
    GDALDatasetH    hDstDS,
    int     nSrcCount,
    GDALDatasetH *  pahSrcDS,
    const GDALVectorTranslateOptions *      psOptionsIn,
    int *   pbUsageError
)

基本使用方式如下:

GDALAllRegister();
//添加命令参数,每次添加一个!!!
char **argv = NULL;
argv = CSLAddString( argv, "-f" );
argv = CSLAddString( argv, "GML" );

//错误实例!!!!
//error!!!!
//////argv = CSLAddString( argv, "-f GML" );//此写法错误,按照上面写!!!!
//error!!!!

//返回
int bUsageError = FALSE;
//输入列表
GDALDatasetH TestDs = GDALOpenEx("test.shp",GDAL_OF_VECTOR, , NULL, NULL, NULL );
//gdalwarp
GDALVectorTranslateOptions *opt = GDALVectorTranslateOptionsNew( argv, NULL );
GDALDataset *dst = ( GDALDataset * )GDALVectorTranslate( "out.gml", NULL, 1,
                    &TestDs ,opt, &bUsageError );
GDALVectorTranslateOptionsFree( opt );
CSLDestroy( argv );
//do something
//clear env
GDALClose(dst);
GDALClose(TestDs);