GDAL是遥感图像处理中比较常用的开源库。因项目要求,需要将多个图层的GTIFF文件叠加输出为PDF文件,且可以分层浏览展示。鉴于网上很少有关于GDAL PDF接口的使用说明,本人大致的将自己所做的说明记录一下。
1. 打开PDF接口。 打开GDAL目录, 修改frmts/makefile.vc文件的EXTRAFLAGS值.
在最后添加 –DFRMT_pdf
2. 打开VS2013工具。VS2013 x86 本机工具
跳转到GDAL目录下。输入 nmake /f makefile.vc MSVC_VER=1800 DEBUG=1 可生成x64 debug、win32 release、win32 debug相应库
3.在代码文件头加入
#include "gdal.h"
#include "cpl_string.h"
#include "gdal_priv.h"
#include "ogr_spatialref.h"
#include "commonutils.h"
#include "gdal_utils_priv.h"
#pragma comment(lib,"gdal_i.lib")
这里我仿照GDAL自带的命令行工具 gdal_translate的源代码写了测试.其实就是命令行 "-of pdf 111.tiff test.pdf -co LAYER_NAME=111 -co EXTRA_RASTERS=222.tiff -co EXTRA_RASTERS_LAYER_NAME=222" 需要注意的是栅格图之间的叠加必须要有地理信息,否则无法叠加,支持多张图叠加,如 -co EXTRA_RASTERS=222.tiff,333.tiff -co EXTRA_RASTERS_LAYER_NAME=222,333 。当然也可以以图片的形式叠加,则不需要地理坐标信息。命令为 -co EXTRA_IMAGES=TEST.PNG,0,0,1 后面3个数字为坐标以及图片放缩比例。
// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "gdal.h"
#include "cpl_string.h"
#include "gdal_priv.h"
#include "ogr_spatialref.h"
#include "commonutils.h"
#include "gdal_utils_priv.h"
#pragma comment(lib,"gdal_i.lib")
static void Usage(const char* pszErrorMsg = NULL, int bShort = TRUE) CPL_NO_RETURN;
static void Usage(const char* pszErrorMsg, int bShort)
{
int iDr;
printf("Usage: gdal_translate [--help-general] [--long-usage]\n"
" [-ot {Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/\n"
" CInt16/CInt32/CFloat32/CFloat64}] [-strict]\n"
" [-of format] [-b band] [-mask band] [-expand {gray|rgb|rgba}]\n"
" [-outsize xsize[%%]|0 ysize[%%]|0] [-tr xres yres]\n"
" [-r {nearest,bilinear,cubic,cubicspline,lanczos,average,mode}]\n"
" [-unscale] [-scale[_bn] [src_min src_max [dst_min dst_max]]]* [-exponent[_bn] exp_val]*\n"
" [-srcwin xoff yoff xsize ysize] [-epo] [-eco]\n"
" [-projwin ulx uly lrx lry] [-projwin_srs srs_def]\n"
" [-a_srs srs_def] [-a_ullr ulx uly lrx lry] [-a_nodata value]\n"
" [-gcp pixel line easting northing [elevation]]*\n"
" [-mo \"META-TAG=VALUE\"]* [-q] [-sds]\n"
" [-co \"NAME=VALUE\"]* [-stats] [-norat]\n"
" [-oo NAME=VALUE]*\n"
" src_dataset dst_dataset\n");
if (!bShort)
{
printf("\n%s\n\n", GDALVersionInfo("--version"));
printf("The following format drivers are configured and support output:\n");
for (iDr = 0; iDr < GDALGetDriverCount(); iDr++)
{
GDALDriverH hDriver = GDALGetDriver(iDr);
if (GDALGetMetadataItem(hDriver, GDAL_DCAP_RASTER, NULL) != NULL &&
(GDALGetMetadataItem(hDriver, GDAL_DCAP_CREATE, NULL) != NULL
|| GDALGetMetadataItem(hDriver, GDAL_DCAP_CREATECOPY, NULL) != NULL))
{
printf(" %s: %s\n",
GDALGetDriverShortName(hDriver),
GDALGetDriverLongName(hDriver));
}
}
}