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
在使用该界面设置完成一些参数以后可以在后面的文本框中得到命令行参数。
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:/CSDN/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:/CSDN/warped1.tif
在QGIS中打开变换后的图像,对比如图
下层真彩色的图像为原图像,上层发黄的是变换后的影像。可以看出两幅影像相同的地理位置处的影像是相同的,也就是变换不会损坏图像的信息,但从旁边的黑色部分可以看出这一地理位置的信息是没有的。
同时,查看两幅图像的信息,发现转换后的图像经过了
- 经过了压缩
- 行列数目发生了变化
- 图像顶点及范围变化
- 像元大小发生变化
- 参考系在参考椭球和高斯平面坐标间发生了变化(最重要)
下面,在控制台中直接使用原生程序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:\CSDN\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, 0 );
if( argc < 1 )
GDALExit( -argc );
for( int i = 0; argv != NULL && argv[i] != NULL; i++ )
{
if( EQUAL(argv[i], "--utility_version") )
{
printf("%s was compiled against GDAL %s and is running against GDAL %s\n",
argv[0], GDAL_RELEASE_NAME, GDALVersionInfo("RELEASE_NAME"));
CSLDestroy( argv );
return