GDAL工具箱详解之gdalwarp.exe

本文详细介绍了GDAL工具箱中的gdalwarp.exe,探讨了其在图像变换中的作用,包括在QGIS中的使用、源码分析,特别是GDALWarpOperation和GDALWarpKernel类的功能和相互关系。gdalwarp.exe用于执行地理信息数据的投影变换,确保图像信息不受损,同时调整行列数、像元大小和参考系。

GDAL自带的工具包含了众多的功能,可以看做是利用该开源库进行的典型开发案例。本节主要介绍其中基本的一项工具——gdalwarp.exe。

  • 该工具箱位于GDAL文件夹下的apps文件夹中,属于命令行可执行程序。

目录

使用方法

GDAL帮助文件中栅格工具箱里关于gdalwarp.exe的描述如下:

gdalwarp [--help-general] [--formats]
    [-s_srs srs_def] [-t_srs srs_def] [-to "NAME=VALUE"]
    [-order n | -tps | -rpc | -geoloc] [-et err_threshold]
    [-refine_gcps tolerance [minimum_gcps]]
    [-te xmin ymin xmax ymax] [-te_srs srs_def]
    [-tr xres yres] [-tap] [-ts width height]
    [-ovr level|AUTO|AUTO-n|NONE] [-wo "NAME=VALUE"] [-ot Byte/Int16/...] [-wt Byte/Int16]
    [-srcnodata "value [value...]"] [-dstnodata "value [value...]"] -dstalpha
    [-r resampling_method] [-wm memory_in_mb] [-multi] [-q]
    [-cutline datasource] [-cl layer] [-cwhere expression]
    [-csql statement] [-cblend dist_in_pixels] [-crop_to_cutline]
    [-of format] [-co "NAME=VALUE"]* [-overwrite]
    [-nomd] [-cvmd meta_conflict_value] [-setci] [-oo NAME=VALUE]*
    [-doo NAME=VALUE]*
    srcfile* dstfile
参数 意义 样例
-s_srs 原坐标系统 +proj=longlat +datum=WGS84 +no_defs
-t_srs 目标坐标系统 +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs
-to 变换选项 暂时未知
-order n 变换多项式顺序 1-3
-tps 强制基于已知控制点使用样条函数进行变换 只需输入设定即可
-rpc 强制使用rpc模型 只需输入设定即可
-geoloc 强制使用元数据中的地理位置数组 详细格式请参照:https://trac.osgeo.org/gdal/wiki/rfc4_geolocate
-et err_threshold 变换允许的偏差值 像素为单位
-refine_gcps tolerance minimum_gcps 精化后控制点的最少数量
-te xmin ymin xmax ymax 输出文件地理范围 最大最小x、y值
-te_srs srs_def 特殊指定SRS输出文件的地理参照 GDAL/OGR forms, complete WKT, PROJ.4, EPSG:n or a file containing the WKT
-tr xres yres 输出图像的分辨率 xres yres
-tap 输出图像范围的坐标系校正到图像分辨率一致 只需输入设定即可
-ts width height 设置输出图像的宽和高 像素数
-ovr level AUTO AUTO-n
-wo “NAME=VALUE” 这里可以特别指定重投影选项 重投影选项都可以
-ot type 输出数据类型 type
-wt type 处理时使用的数据类型 type
-r resampling_method 设定重采样算法 resampling_method
-srcnodata value [value…] 源图像无数据处的值 value
-dstnodata value [value…] 输出图像无数据处的值 value
-dstalpha 创建输出数据集中的透明波段以辨识无数据值 只需输入设定即可
-wm memory_in_mb 设定该应用程序内存 memory_in_mb
-multi 是否使用多线程 只需输入设定即可
-q 是否在控制台输出运行步骤提示 只需输入设定即可
-of format 输出格式 format
-co “NAME=VALUE” 格式驱动所支持的选项
-cutline datasource 激活OGR支持的矢量作为数据分割线 datasource
-cl layername 指定特定名称的图层 layername
-cwhere expression 基于属性查询分割线 expression
-csql query 使用sql语句选择在-cl指定图层上的分割线要素
-cblend distance 设置混合距离 按像素
-crop_to_cutline 按照分割线裁剪数据集 只需输入设定即可
-overwrite 是否覆写目标数据集 只需输入设定即可
-nomd 不复制元数据 只需输入设定即可
-cvmd meta_conflict_value 冲突元数据信息值 “”
-setci 参照输入数据集的色彩索引表建立输出数据集波段的色彩索引表 只需输入设定即可
-oo NAME=VALUE 打开选项 驱动打开选项
-doo NAME=VALUE 输出选项 驱动输出选项
srcfile 输入文件 raw_spot.tif
dstfile 输出文件 utm11.tif

关于-oo及doo的叙述在上一节gdalinfo中有所涉及,这里就不赘述了。
借助于QGIS中集成的的GDAL可视化界面我们可以简易地生成命令,下图是该工具的GUI
QGIS-GDALWarp
在使用该界面设置完成一些参数以后可以在后面的文本框中得到命令行参数。

gdalwarp -ot Float32 -s_srs EPSG:4326 -t_srs EPSG:2382 -r bilinear -of GTiff -te 116.526854182 40.0601709856 116.532848182 40.0661649856 -te_srs EPSG:4326 -co COMPRESS=DEFLATE -co PREDICTOR=1 -co ZLEVEL=6 -wo OPTIMIZE_SIZE=TRUE E:\GDALhomework\000000.tif E:/优快云/warped.tif

启用一些高级设置,得到:

gdalwarp -ot UInt16 -s_srs EPSG:4326 -t_srs EPSG:2382 -r bilinear -of GTiff -te 116.526854182 40.0481829856 116.532848182 40.0541769856 -te_srs EPSG:4326 -co COMPRESS=DEFLATE -co PREDICTOR=1 -co ZLEVEL=6 -co TILED=YES -wo OPTIMIZE_SIZE=TRUE E:\GDALhomework\000002.tif E:/优快云/warped1.tif

在QGIS中打开变换后的图像,对比如图
warpdifference
下层真彩色的图像为原图像,上层发黄的是变换后的影像。可以看出两幅影像相同的地理位置处的影像是相同的,也就是变换不会损坏图像的信息,但从旁边的黑色部分可以看出这一地理位置的信息是没有的。
同时,查看两幅图像的信息,发现转换后的图像经过了

  • 经过了压缩
  • 行列数目发生了变化
  • 图像顶点及范围变化
  • 像元大小发生变化
  • 参考系在参考椭球和高斯平面坐标间发生了变化(最重要)

下面,在控制台中直接使用原生程序gdalwarp.exe:进入控制台,并键入

D:\gdal-2.1.0\apps>gdalwarp -ot UInt16 -s_srs EPSG:4326 -t_srs EPSG:2382 -r
bilinear -of GTiff -te 116.526854182 40.0481829856 116.532848182 40.0541769856 -
te_srs EPSG:4326 -co COMPRESS=DEFLATE -co PREDICTOR=1 -co ZLEVEL=6 -co TILED=YES
 -wo OPTIMIZE_SIZE=TRUE E:\GDALhomework\000002.tif E:\优快云\warpedcmd.tif
0...10...20...30...40...50...60...70...80...90...100 - done.

bit length overflow
code 6 bits 6->7

bit length overflow
code 14 bits 6->7
code 13 bits 6->7

这样转换的图像和在QGIS中操作的结果是一样的。这里只是提供一种间接学习使用GDAL工具箱的方法。
下面看程序源码。

源码分析

应用程序主函数体:

/************************************************************************/
/*                                主函数()                               
/************************************************************************/

int main( int argc, char ** argv )

{
    GDALDatasetH *pahSrcDS = NULL;
    int nSrcCount = 0;

    EarlySetConfigOptions(argc, argv);

/* -------------------------------------------------------------------- */
/*      注册所有驱动,并且处理gdla常规命令选项。                             
/* -------------------------------------------------------------------- */
    GDALAllRegister();
    argc = GDALGeneralCmdLineProcessor( argc, &argv, 
<think>我们正在讨论在Qt中使用gdalwarp.exe实现TIFF和IMG格式的互转。根据引用内容,我们已有一些GDAL操作的知识,特别是gdal_translate(引用[1]和[3])以及如何在C++中调用GDAL(引用[2])。但用户的问题是关于使用gdalwarp.exe(一个命令行工具)在Qt程序中实现格式转换。 注意:gdalwarp.exeGDAL提供的一个用于图像镶嵌、重投影、裁剪等操作的工具,它也可以用来转换格式,因为GDAL支持多种格式的读写。TIFF和IMG都是GDAL支持的格式,因此我们可以使用gdalwarp来实现这两种格式之间的转换。 在Qt中,我们可以使用QProcess类来调用外部命令行程序(如gdalwarp.exe)。基本步骤包括: 1. 准备gdalwarp的命令行参数。 2. 使用QProcess执行该命令。 以下是一些关键点: 1. 格式转换:gdalwarp的基本用法是将一个输入文件转换为一个输出文件,并且可以通过指定输出文件的扩展名来确定输出格式。例如,将TIFF转换为IMG,可以将输出文件命名为xxx.img;反之亦然。 2. 命令格式: gdalwarp [选项] 输入文件 输出文件 3. 常用选项(根据需求): -of 格式:指定输出格式(例如,对于IMG格式,可以指定为HFA;对于GeoTIFF,可以指定为GTiff)。如果不指定,gdalwarp会根据输出文件的扩展名猜测格式。 其他选项如重投影、重采样等,如果不需要可以不指定。 4. 在Qt中调用: 使用QProcess执行命令。注意,需要确保gdalwarp.exe在系统的环境变量中,或者在Qt中指定其完整路径。 5. 注意:由于gdalwarp主要用于重投影和几何校正,对于简单的格式转换,也可以使用gdal_translate(引用[1]和[3]中提到了gdal_translate)。但是用户明确要求使用gdalwarp.exe,所以我们这里按照用户要求。 然而,用户提到“互转”,即双向转换(TIFF转IMG和IMG转TIFF)。由于两种转换的命令相似,只是输入输出文件扩展名不同,因此方法一致。 具体步骤: 1. 确定输入文件和输出文件的路径。 2. 构建命令字符串,例如: gdalwarp -of GTiff input.img output.tif # 将IMG转为TIFF 或者 gdalwarp -of HFA input.tif output.img # 将TIFF转为IMG 注意:输出格式(-of)参数可以省略,因为gdalwarp会根据输出文件的扩展名自动判断。但有时为了确保正确,可以显式指定。 3. 使用QProcess执行这个命令。 示例代码(Qt C++)如下: 假设我们要将input.tif转换为output.img: ```cpp #include <QProcess> #include <QDebug> // ... QString program = "gdalwarp"; // 或者使用绝对路径,如"C:/path/to/gdalwarp.exe" QStringList arguments; arguments << "input.tif" << "output.img"; // 如果需要指定输出格式,可以插入:arguments << "-of" << "HFA"; 放在输入文件之前。 QProcess *process = new QProcess(this); process->start(program, arguments); if (!process->waitForStarted()) { qDebug() << "Failed to start the process"; return; } if (!process->waitForFinished()) { qDebug() << "Process execution error"; return; } qDebug() << "Conversion completed"; ``` 同样,将IMG转为TIFF: ```cpp QString program = "gdalwarp"; QStringList arguments; arguments << "input.img" << "output.tif"; // 或者显式指定输出格式: arguments << "-of" << "GTiff"; QProcess process; process.start(program, arguments); process.waitForFinished(); ``` 注意事项: - 由于gdalwarp是一个控制台程序,它会在执行过程中输出一些信息。如果需要捕获这些信息,可以使用QProcess的读取标准输出和错误输出的方法。 - 确保GDAL工具已正确安装,并且gdalwarp.exe在系统路径中,或者在代码中指定完整路径。 - 如果转换过程中需要其他选项(如重采样方法、目标分辨率等),可以在参数列表中添加。 引用说明: [1]中提到了gdal_translate,但这里我们使用gdalwarp。实际上,简单的格式转换使用gdal_translate更直接,因为gdal_translate就是专门用于格式转换和提取子区域的工具。但是用户要求使用gdalwarp,所以我们就用gdalwarp。不过,如果用户不限于gdalwarp,也可以考虑gdal_translate,因为它在引用[1]和[3]中都有提及。 因此,如果用户希望使用gdal_translate,方法类似: gdal_translate -of HFA input.tif output.img # TIFF转IMG gdal_translate -of GTiff input.img output.tif # IMG转TIFF 在Qt中调用gdal_translate的方式与调用gdalwarp相同。 结论:在Qt中,我们可以通过QProcess调用gdalwarp.exe(或gdal_translate.exe)命令行工具,通过构建相应的命令参数来实现TIFF和IMG格式之间的互转。 最后,根据要求生成相关问题: §§相关问题§§ 1. GDAL支持哪些图像格式?如何查看? 2. 在Qt中使用QProcess调用外部程序时需要注意哪些问题? 3. 除了GDAL,还有哪些库可以实现TIFF和IMG格式的互转? 4. 如何提高使用gdalwarp进行格式转换的效率? </think>### 在Qt中使用gdalwarp.exe实现TIF和IMG格式互转的方法 在Qt中调用`gdalwarp.exe`实现TIFF和IMG格式互转,主要通过**QProcess执行命令行操作**完成。以下是具体步骤和示例代码: #### 核心原理 1. `gdalwarp`是GDAL提供的格式转换工具,支持200+地理数据格式互转 2. TIF格式标识:`GTiff`,IMG格式标识:`HFA`(Erdas Imagine) 3. 转换命令基本结构: ```bash gdalwarp -of [目标格式] [输入文件] [输出文件] ``` #### 转换步骤 (Qt/C++实现) ```cpp #include <QProcess> #include <QDebug> // TIFF转IMG bool convertTifToImg(const QString& inputTif, const QString& outputImg) { QProcess process; QStringList args; args << "-of" << "HFA" // 指定输出为IMG格式 << inputTif << outputImg; process.start("gdalwarp.exe", args); if (!process.waitForFinished(30000)) { // 设置30秒超时 qDebug() << "转换失败:" << process.errorString(); return false; } qDebug() << "转换成功! 输出文件:" << outputImg; return true; } // IMG转TIFF bool convertImgToTif(const QString& inputImg, const QString& outputTif) { QProcess process; QStringList args; args << "-of" << "GTiff" // 指定输出为TIFF格式 << inputImg << outputTif; process.start("gdalwarp.exe", args); return process.waitForFinished(30000); } ``` #### 关键注意事项 1. **环境配置**: - 将GDAL的`bin`目录(含gdalwarp.exe)添加到系统PATH - 或在代码中指定绝对路径:`process.start("C:/GDAL/bin/gdalwarp.exe", args)` 2. **性能优化**: ```cpp // 添加压缩选项减小文件体积 args << "-co" << "COMPRESS=LZW"; ``` 3. **投影保留**: ```cpp // 保持原坐标系(默认自动保留) args << "-t_srs" << "EPSG:4326"; // 如需重投影可指定EPSG码 ``` 4. **错误处理**: ```cpp if (process.exitCode() != 0) { qDebug() << "错误输出:" << process.readAllStandardError(); } ``` #### 替代方案(直接使用GDAL API) 如需更精细控制,可使用GDAL C++ API: ```cpp #include <gdal_priv.h> void convertFormat(const char* src, const char* dst) { GDALDataset* poSrc = (GDALDataset*)GDALOpen(src, GA_ReadOnly); GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("GTiff"); poDriver->CreateCopy(dst, poSrc, FALSE, NULL, NULL, NULL); GDALClose(poSrc); } ``` > 此方法需在.pro文件中添加:`LIBS += -lgdal_i`[^2] #### 验证方法 1. 转换后使用`gdalinfo.exe`检查元数据: ```cpp QProcess info; info.start("gdalinfo.exe", QStringList() << outputFile); info.waitForFinished(); qDebug() << info.readAllStandardOutput(); ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值