GDAL应用
sf2gis@163.com
2014年11月5日
2014年11月7日添加性能测试
2014年11月12日添加vrt、批量处理
2014年11月12日添加 格式转换
2014年11月13日添加定义坐标系统
2014年11月15日添加vrt合成及更改分辨率
2014年11月15日添加重采样方法测试
2014年11月18日增加gdal地理范围裁剪
2014年11月20日添加文件数量测试
1GDAL/OGR总览
1.1 功能 GDAL
- 使用 gdalinfo 浏览影象
- 使用 gdal_translate 转换数据格式
- 使用 gdalwarp 重投影
- 使用 gdal_warp 或 gdal_merge.py 拼接影象
- 使用 gdaltindex 生成作为栅格切片索引的 shp 文件
- 使用 ogrinfo 浏览元数据
- 使用 ogr2ogr 转换数据格式
参考:http://live.osgeo.org/zh/quickstart/gdal_quickstart.html
1.2 性能测试 1.2.1gdalwarp:多线程和缓存性能提升效果
gdalwarp:默认单线程性能最好。多线程无明显的提升(占用3个线程)。改变缓存空间大小会降低性能,并可能导致内存不足。双线性内插重采样较最邻近法重采样性能有所降低(7%)。投影降低性能21%左右。
gdal_merge.bat:性能好,仅需gdalwarp的21%。但只能使用最邻近法,无法更改重采样方法。
vrt文件能够有效的提高处理效率,可以被所有方法使用。
gdal_translate性能很好,配合vrt文件可以高效完成许多工作。
附:测试数据
输入580M*4,17477*11651
1.gdalwarp
single: start:2014-11-06 20:40:20 end:2014-11-06 20:53:52span= 14m
multi: start=2014-11-06 20:55:54 end= 2014-11-06 21:09:35span=14m
multi-wm1g: start=2014-11-06 21:10:23 end= 2014-11-0621:19:45 (error)span=9m
multi-wm300m:start=2014-11-0621:20:33 end=2014-11-06 21:44:55 span=24m
multi-wm500m: start=2014-11-06 21:45:51 end=2014-11-0622:08:26 span=23m
single: start=2014-11-06 22:09:08 end=2014-11-06 22:22:13span=13m
single-wm1g: start=2014-11-06 22:23:00 end=2014-11-0622:38:04 span=15m
merge-bi2(project):start=2014-11-0700:20:31 end=2014-11-07 00:37:36 span=17m
merge-bi3:start=2014-11-07 00:44:43 end=2014-11-07 00:59:17span=15m
2.merge
set OSGEO4W_ROOT=D:\Program Files (x86)\QGIS Chugiak
set PATH=%OSGEO4W_ROOT%\bin; %PATH%
SET PYTHONHOME=%OSGEO4W_ROOT%\apps\Python27
D:\output\out\J50>gdal_merge.bat -n 0 -a_nodata 0 -ofGTiff -o merge14.tif NJ50C003003_lonlat-L14.tif NJ50C003004_lonlat-L14.tifNJ50C004003_lonlat-L14.tif NJ50C004004_lonlat-L14.tif
start:2014-11-06 23:15:02 end:2014-11-06 23:18:12 span=3m
1.2.2改变分辨率方法测试
vrt+translate方法(参见:更改分辨率)比直接使用gdal_translate设置分辨率(参见:改变分辨率/缩放)效率高15%以上,比使用目标分辨率vrt和nearest的gdalwarp提高75%以上(参见:更改分辨率),比使用源分辨率vrt和nearest的gdalwarp提高95%,比使用目标分辨率和bilinear的gdalwarp提高87%(此种方法无实际意义,不会使用源数据进行重采样)。
附:测试结果
vrt.bat
@echo start=%time%
gdalbuildvrt j50-zoomin.vrt j50/*.jpg -tr 0.00001 0.00001
gdal_translate j50-zoomin.vrt j50-zoomin.tif
@echo end=%time%
D:\output\getile>D:/vrt.bat
start= 0:14:24.78
D:\output\getile>gdalbuildvrt j50-zoomin.vrt j50/*.jpg -tr0.00001 0.00001
D:\output\getile>gdal_translate j50-zoomin.vrtj50-zoomin.tif
end= 0:15:03.34
translate.bat
@echo start=%time%
gdalbuildvrt j50.vrt j50/*.jpg
gdal_translate -outsize 26367 25269 j50.vrt j50-translate.tif
@echo end=%time%
D:\output\getile>D:/translate.bat
start= 0:15:56.91
D:\output\getile>gdalbuildvrt j50.vrt j50/*.jpg
D:\output\getile>gdal_translate -outsize 26367 25269j50.vrt j50-translate.tif
end= 0:16:26.94
vrt-warp.bat
@echo start=%time%
gdalbuildvrt j50-zoomin.vrt j50/*.jpg -tr 0.00001 0.00001
gdalwarp j50-zoomin.vrt j50-zoomin.tif
@echo end=%time%
D:\output\getile>D:/vrt-warp.bat
start= 0:37:49.00
D:\output\getile>gdalbuildvrt j50-zoomin.vrt j50/*.jpg -tr0.00001 0.00001
D:\output\getile>gdalwarp j50-zoomin.vrt j50-zoomin.tif
end= 0:39:30.37
warp.bat
@echo start=%time%
gdalbuildvrt j50.vrt j50/*.jpg
gdalwarp -tr 0.00001 0.00001 j50.vrt j50-warp.tif
@echo end=%time%
D:\output\getile>D:/warp.bat
start= 0:52:06.31
D:\output\getile>gdalbuildvrt j50.vrt j50/*.jpg
D:\output\getile>gdalwarp -tr 0.00001 0.00001 j50.vrtj50-warp.tif
end= 1:00:29.96
resample.bat
@echo start=%time%
gdalbuildvrt j50-zoomin.vrt j50/*.jpg -tr 0.00001 0.00001
gdalwarp -r bilinear j50-zoomin.vrt j50-zoomin.tif
@echo end=%time%
D:\output\getile>D:/resample.bat
start= 1:01:18.61
D:\output\getile>gdalbuildvrt j50-zoomin.vrt j50/*.jpg -tr0.00001 0.00001
D:\output\getile>gdalwarp -r bilinear j50-zoomin.vrtj50-zoomin.tif
end= 1:04:34.90
1.2.3重采样方法测试
设置重采样只能使用gdalwarp,并且在gdalwarp方法中同时设置分辨率和采样方法才有效。
使用vrt设置分辨率,再设置gdalwarp的方法是错误的。
附:测试结果
resapmle-merge.bat
@echo start=%time%
gdalbuildvrt -overwrite j50-zoomin.vrt j50/*.jpg
gdalwarp -overwrite -r bilinear -tr 0.00001 0.00001j50-zoomin.vrt j50-resample-warpmerge.tif
@echo end=%time%
D:\output\getile>D:\resample-merge.bat
start=11:14:24.53
D:\output\getile>gdalbuildvrt -overwrite j50-zoomin.vrtj50/*.jpg
D:\output\getile>gdalwarp -overwrite -r bilinear -tr0.00001 0.00001 j50-zoomin.vrt j50-resample-warpmerge.tif
end=11:15:39.09
vrt-warp.bat
@echo start=%time%
gdalbuildvrt -overwrite j50-zoomin.vrt j50/*.jpg -tr 0.000010.00001
gdalwarp -overwrite j50-zoomin.vrt j50-warpmerge.tif
@echo end=%time%
D:\output\getile>D:\vrt-warp.bat
start=11:16:41.18
D:\output\getile>gdalbuildvrt -overwrite j50-zoomin.vrtj50/*.jpg -tr 0.00001 0.00001
D:\output\getile>gdalwarp -overwrite j50-zoomin.vrtj50-warpmerge.tif
end=11:17:23.94
resample.bat
@echo start=%time%
gdalbuildvrt -overwrite j50-zoomin.vrt j50/*.jpg -tr 0.000010.00001
gdalwarp -overwrite -r bilinear j50-zoomin.vrtj50resample-warpmerge.tif
@echo end=%time%
D:\output\getile>D:\resample.bat
start=11:20:27.78
D:\output\getile>gdalbuildvrt -overwrite j50-zoomin.vrtj50/*.jpg -tr 0.00001 0.00001
D:\output\getile>gdalwarp -overwrite -r bilinearj50-zoomin.vrt j50resample-warpmerge.tif
end=11:21:36.70
1.2.4gdal_translate 文件量效率测试
对于vrt类型的格式转换,如果vrt中包含的数量>=100个,效率明显下降,如果低于100个,则效率较好,文件量过少时,会由于读写文件过多的耗时,但不会有明显的下降。推荐使用90个左右的文件。
附:测试用例:
@echo off
REM argv 1=tile num y start. 2=tilenumber y end.
REM argv 3=middle path with \
REM argv 4=tile num x start
REM argv 5=tile num x end
REM argv 6=level
REM argv 7=source tile path with \
REM argv 8=output filename
REM sample: batwarp 2457 2525 D:\sf\z\part\ 33 36 12Z:\GeProcess\{2fef6b3c-dce7-42ca-9cfd-50e1dd06035e}\ D:\sf\z\12.tif
@echo on
@echo start=%time%
@REM merge middle files
for /l %%i in (%1,1,%2) do @echostart=%time%>>%3%6-%%i.txt && (for /l %%j in (%4,1,%5) dogdalbuildvrt -overwrite %3%6-%%i-%%j.vrt %7%6-%%i-%%j*.jpg &&gdal_translate %3%6-%%i-%%j.vrt %3%6-%%i-%%j.tif) && @echo end=%time%>>%3%6-%%i-%%j.txt
@echo end=%time%
@REM merge all vrt to one merge.vrt
【GDAL应用】@echo start=%time%>>%3merge.txt
gdalbuildvrt -overwrite %3merge.vrt %3*.tif
@echo end=%time%>>%3merge.txt
@REM merge output file
@echo start=%time%>>%3translate.txt
gdal_translate %3merge.vrt %8
@echo end=%time%>>%3translate.txt
@echo end=%time%
1.3 批量文件处理 1.3.1目标:使用大量文件进行操作。
1.3.2原理:按照指定的方式将文件名称通知gdal。
1.3.3方法:VRT(推荐)、通配符
1)具有相同文件名(或部分相同):使用通配符(*、?)。
通配符由MS_DOS控制,使用*代表任意字符, 使用?代表单个字符。
参考:
http://blogs.msdn.com/b/oldnewthing/archive/2007/12/17/6785519.aspx
http://msdn.microsoft.com/en-us/library/ms690414(v=vs.85).aspx )。
2)使用vrt:将所有文件名组成列表通知gdal。(推荐)
转化为vrt再进行其它操作,其效率有明显的提升。
如图像合成,参见:图像合并(Merge)/镶嵌(Mosaic)。
使用gdal_merge.bat进行直接合并时,4*600M需要6min,使用VRT合成时需要3.5min,gdal_translate转化仅需要1min。直接copy速度的45s。
参见:gdalbuildvrt: 创建VRT(virtual raster type)。
附:测试结果
merge
start: 2014-11-12 01:08:24
end: 2014-11-12 01:14:31
mergevrt
start:2014-11-12 01:27:35
end:2014-11-12 01:31:08
translate
start:2014-11-12 01:15:25
end:2014-11-12 01:16:26
copy:45S
参考:
http://gis.stackexchange.com/questions/83052/how-do-i-use-wildcards-to-work-around-the-gdal-character-limit
1.3.4示例:
1)C:\Users\Administrator>gdalwarp -s_srs EPSG:4326 -t_srs EPSG:4326-of GTiff D:\o
utput\dbio\*.jpg D:/xx.tif
2)C:\Users\Administrator>gdalwarp -s_srs EPSG:4326 -t_srs EPSG:4326-of GTiff D:\o
utput\dbio\7-??-???.jpg D:/xx2.tif
3)gdalbuildvrt -input_file_list mylist.txt my.vrt
参考:http://www.gdal.org/gdaltindex.html
1.4 工具总结 1.4.1图像合并
高效方法:vrt合成+translate转化为目标格式。参见:图像合并(Merge)/镶嵌(Mosaic)
1.4.2更改分辨率
高效方法:vrt更改分辨率+translate转化为目标格式。参见:更改分辨率
重采样只能使用gdalwarp,所有其它方法无效,且必须同时设置分辨率。
1.5 全局设置 GDAL_CACHEMAX:设置进程的内存总量,越大则效率越高。在启动之前设置有效。以MB为单位(如果超过10G,则以B为单位,32位程序不得超过2G)。
示例: set GDAL_CACHEMAX=1024
2 GDAL程序模型 GDAL的核心在gcore文件下,主要是rasterio函数(rasterio.cpp)和GDALRasterBand类。其它所有的功能函数(API)或者工具,主要功能都是对这些核心库的不同封装。
只有在范围不同或分辨率不同时,才进行重采样,如果相同范围,相同分辨率,则只进行复制(即使设置了重采样方法)。
参考:http://www.cnblogs.com/gywei/p/3387343.html
可以使用内存数据,类型为MEM。
参考:http://www.gdal.org/frmt_mem.html
http://blog.csdn.net/liminlu0314/article/details/7166230
3 gdalwarp:变形工具。包括投影、拼接、及相关的变形功能。此工具功能强大,但效率不高,使用时注意
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] [-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]*
srcfile* dstfile
参考:http://www.gdal.org/gdalwarp.html
3.1 提高效率方法 目标:提高warp的执行效率。
原理:
主要是调整一样变形参数,在-wo中设置。
设置INIT_DEST
设置多线程数:NUM_THREADS(>=1.10)
增加缓存大小(与测试结果有异???)。
方法:
gdalwarp
-wo set a warp option.可以有多个-wo,NUM_THREADS=N表示使用的线程数,如果N=ALL_CPUS则使用全部CPU。INIT_DEST=[value]or INIT_DEST=NO_DATA表示初始化目标文件,如果不设置,则读取源文件并覆盖。
示例:
gdalwarp world_4326.tif out.tif -t_srsEPSG:3857 -overwrite –wo NUM_THREADS=4 -wm 512
参考:
http://www.gdal.org/structGDALWarpOptions.html#a0ed77f9917bb96c7a9aabd73d4d06e08
http://lists.osgeo.org/pipermail/gdal-dev/2013-January/035217.html
3.2 坐标系统变换/投影变换 目的:根据源图像和源坐标系统,输出指定坐标系统的目标图像。
原理:根据源坐标系统和目的坐标系统之间的数学关系,对源图像进行逐点重新采样,生成目标图像。
方法:gdalwarp(直接投影效率很高)
-overwrite 如果目标图像已经存在,则重写(覆盖)。
-s_srs 源坐标系统
-t_srs 目标坐标系统
-r 重采样方法near:最邻近值(默认,最快,质量差),bilinear:双线性内插(用的较多),Cubic:三次方,Cubic Spline:三次样条,Lanczos,Average,mode:出现次数最多。
-wm warp caching memory,缓存大小(单位:MB)
-ts target size,目标图像大小,格式:宽 高,单位(像素)。不能与-tr共存。
-multi 多线程
-dstnodata 目标图像无值时填充值
-q quiet
-cutline 指定裁剪的mask矢量图层
-dstalpha 指定透明通道,对于无数据值的像素设置为透明。
-of output format,指定输出目标图像格式。默认为GeoTiff(GTiff)。
最后两个参数分别是源图像和目标图像。
示例:
gdalwarp -overwrite -s_srs EPSG:4326 -t_srsEPSG:32650 -r bilinear -wm 20 -ts 3000 3000 -multi -dstnodata 0 -q -cutlineD:/qgis-ppt/grid/grid-polygon.shp -dstalpha -of GTiffD:/qgis-ppt/timeextent/Korea/Korea.png D:/qgis-ppt/timeextent/Korea/ttttt.tif
3.3 矢量裁剪 目的:根据指定的矢量图形,输出源图像的相应图像。
原理:根据指定的矢量范围(Rectangle),对源图像进行逐点重新采样,Rectangle中无矢量的部分为无数据,有矢量的部分为源图像数据,以此生成目标图像。
方法:gdalwarp
参见:投影
-crop_to_cutline 将目标图像的范围指定为cutline 矢量图像的范围。
示例:
gdalwarp -dstnodata 0 -q –cutline D:/qgis-ppt/vector-cut/cutpolygon.shp-crop_to_cutline -dstalpha -of GTiff D:/qgis-ppt/timeextent/Korea/test.tifD:/qgis-ppt/vector-cut/clipper-poly-alpha.tif
3.4 图像合并(Merge)/镶嵌(Mosaic) 目的:将多个图像合并输出到目标图像。
原理:通过复制原始图像(或者重采样之后再复制)到目标图像。
方法:gdalwarp
输入图像为多个,最后一个为输出图像。
注意:如果效率不够,可以尝试使用gdal_merge.py。
示例:
gdalwarp -s_srs EPSG:4326 -t_srs EPSG:4326 -ofGTiff D:/qgis-ppt/mosaic/J1.tif D:/qgis-ppt/mosaic/J2.tifD:/qgis-ppt/mosaic/J3.tif D:/qgis-ppt/mosaic/J4.tifD:/qgis-ppt/mosaic/merge4_by_warp.tif
3.5 地理范围裁剪 目的:根据指定地理范围,获取源图像相应图像。
原理:根据指定的地理范围,从源图像的中copy数据到目标图像。注意:此方法与gdalbuildvrt结果相似,会更改地图范围(进行重采样)。
方法:gdalwarp
-texmin ymin xmax ymax。设置目标坐标系统的范围。
示例:
gdalwarp -s_srs EPSG:4326 -t_srs EPSG:4326 -te114.01 39.97 114.03 39.99 -of GTiff -of GTiff D:/qgis-ppt/mosaic/J1.tifD:/qgis-ppt/mosaic/J2.tif D:/qgis-ppt/mosaic/J3.tif D:/qgis-ppt/mosaic/J4.tifD:/qgis-ppt/mosaic/mcp.tif
3.6更改分辨率 目的:更改原始图像的分辨率。
原理:重新采样后,复制到目标图像。
方法:gdalwarp
-trxres yres。设置目标图像的分辨率。不可与-ts共存。
示例:
gdalwarp -s_srs EPSG:4326 -t_srs EPSG:4326 -te114.01 39.97 114.03 39.99 -tr 0.000021457672119 -0.000021457672119 -of GTiff D:/qgis-ppt/mosaic/J1.tifD:/qgis-ppt/mosaic/J2.tif D:/qgis-ppt/mosaic/J3.tif D:/qgis-ppt/mosaic/J4.tifD:/qgis-ppt/mosaic/mcp-tr.tif
4 gdal_translate:转换工具。包括裁剪,格式转换等。可能会进行重采样、取子集、变换分辨率等。 注意:只能使用nearest重采样方法。
gdal_translate[--help-general]
[-ot{Byte/Int16/UInt16/UInt32/Int32/Float32/Float64/
CInt16/CInt32/CFloat32/CFloat64}][-strict]
[-of format] [-b band] [-mask band][-expand {gray|rgb|rgba}]
[-outsize xsize[%] ysize[%]]
[-unscale] [-scale[_bn] [src_min src_max[dst_min dst_max]]]* [-exponent[_bn] exp_val]*
[-srcwin xoff yoff xsize ysize][-projwin ulx uly lrx lry] [-epo] [-eco]
[-a_srs srs_def] [-a_ullr ulx uly lrxlry] [-a_nodata value]
[-gcp pixel line easting northing[elevation]]*
[-mo "META-TAG=VALUE"]* [-q][-sds]
[-co "NAME=VALUE"]* [-stats][-norat]
[-oo NAME=VALUE]*
src_dataset dst_dataset
参考:http://www.gdal.org/gdal_translate.html
http://osdir.com/ml/gdal-development-gis-osgeo/2006-02/msg00037.html
4.1 地理范围裁剪 目的:根据指定地理范围,获取源图像相应图像。
原理:根据指定的地理范围,从源图像的中copy数据到目标图像。
方法:gdal_translate
-a_nodata目标图像无数据时指定值
-projwin地理范围,left,top,right,bottom。注意:此方法保证左上角数据在范围内,但右下角可能会有一个像素的缺失。
示例:
使用地理范围:
gdal_translate -a_nodata 0 -projwin 124.88936067344.2782385899 125.011173148 44.1042207686 -of GTiffD:/qgis-ppt/timeextent/Korea/test.tifD:/qgis-ppt/vector-cut/clipper-poly-alpha.tif
4.2 像素范围裁剪 目的:根据指定像素范围,获取源图像相应图像。
原理:根据指定像素范围,从源图像的中copy数据到目标图像。
方法:gdal_translate
-srcwin 输出范围,格式 x,y,width,hight
示例:
C:\OSGeo4W\bin>gdal_translate.exe -a_nodata 0-srcwin 0 0 100 200 -of GTiff D:/q
gis-ppt/timeextent/Korea/test.tifD:/qgis-ppt/vector-cut/clipper-srcwin.tif
4.3改变分辨率/缩放 目的:改变原始图像的分辨率。
原理:根据指定像素范围,从源图像的中copy数据到目标图像,并改变输出大小。
方法:gdal_translate
-outsize 输出范围,格式 xsize,ysize。如果有%,则按百分比输出。计算输入前后的分辨率比值,由此计算出输出文件的大小。通过文件大小控制分辨率。
示例:
gdal_translate -outsize 200% 200% -of GTiffD:\qgis-ppt\mosaic\J1.tif D:/qgis-ppt/mosaic/J1-zoom.tif
4.4 格式转换(可用于合成) 目的:改变原始图像的格式。
原理:读取原始图像数据,复制到目标文件格式中(可以需要重采样,只能使用nearest)。
方法:gdal_translate
-of 输出格式,默认GTiff。可以修改为所有GDAL支持的格式
-co create option。每种格式都有规定的co,需要查看格式说明。如:JPEG格式,可以使用WORLDFILE=YES(生成worldfile文件),QUALITY=75(设置压缩率,默认是75%,只能取10~100范围的值,>95无法提高质量,但会增大文件)。
效率很高。
示例:
gdal_translate -of GTiff j50c.vrt translate.tif
gdal_translate -of JPEG j50c4.vrt translatejpeg.jpg
gdal_translate -of JPEG -co WORLDFILE=YES -coQUALITY=75 j50c4.vrt
translatejpeg75.jpg
4.5 定义坐标系统(不能进行投影变换,只能定义) 目的:为源图像指定坐标系统。
原理:重新定义源图像的坐标系统(不能变换,只能定义,不改变图像值)。
方法:gdal_translate
-a_srs assign srs指定的坐标系统。
示例:
gdal_translate -a_srs EPSG:32650 -of GTiff J50_lonlat-L12.tif j50-2.tif
5 gdal-merge.py: 合并(Merge)/镶嵌(Mosaic)工具。要求图像必须是相同坐标系统、具有相同的波段数;可以不同分辨率,可以有重叠区域(后加入图像覆盖先加入的图像)。 注意:只能使用nearest重采样方法。
gdal_merge.py [-o out_filename] [-of out_format] [-co NAME=VALUE]*
[-ps pixelsize_x pixelsize_y] [-tap] [-separate] [-v] [-pct]
[-ul_lr ulx uly lrx lry] [-n nodata_value] [-init "value [value...]"]
[-ot datatype] [-createonly] input_files
参考:http://www.gdal.org/gdal_merge.html
http://osdir.com/ml/gdal-development-gis-osgeo/2006-03/msg00087.html
使用时需要python、gdal(python库)支持,设置方法:
set OSGEO4W_ROOT=D:\Program Files (x86)\QGIS Chugiak
set PATH=%OSGEO4W_ROOT%\bin; %PATH%
SET PYTHONHOME=%OSGEO4W_ROOT%\apps\Python27
5.1 图像合并(Merge)/镶嵌(Mosaic) 目的:将多个图像合并为一幅图像。
原理:读入源图像(多个),复制(如果分辨率不一致,需要进行重采样)源图像到目标图像的相应位置。
方法:gdal_merge.py
-n 源图像中无值时赋此值。
-a_nodata 同-n(>1.9)。
-co 参数。格式:key=value。COMPRESS=JPEG:使用JPEG压缩方式。JPEG_QUALITY=75。JPEG压缩率。
-of 输出格式。默认为GTiff(GeoTiff)。
-o 输出图像。默认(out.tif)。
示例:
gdal_merge.bat -n 0-a_nodata 0 -co COMPRESS=JPEG -co JPEG_QUALITY=75 -of GTiff -oD:/qgis-ppt/mosaic/merge4.tif D:/qgis-ppt/mosaic/J1.tifD:/qgis-ppt/mosaic/J2.tif D:/qgis-ppt/mosaic/J3.tif D:/qgis-ppt/mosaic/J4.tif
5.2 保持输入图像波段不变, 目的:将多个图像合并为一幅图像,并保持在目标图像中保留原始图像的所有波段。
原理:读入源图像(多个),复制(如果分辨率不一致,需要进行重采样)源图像到目标图像的相应位置。
方法:gdal_merge.py
-separate 将为每个输入图像的通道保留在目标图像的单独通道中。
示例:
gdal_merge.bat -separate -of GTiff -oD:/qgis-ppt/mosaic/merge4-layerstack.tif D:/qgis-ppt/mosaic/J1.tifD:/qgis-ppt/mosaic/J2.tif D:/qgis-ppt/mosaic/J3.tif D:/qgis-ppt/mosaic/J4.tif
可以看到结果中,源图像的3个通道都被依次加入到目标图像中。
5.3 保存PCT信息 目的:将多个图像合并为一幅图像,并保存PCT颜色表。
原理:读入源图像(多个),复制(如果分辨率不一致,需要进行重采样)源图像到目标图像的相应位置,将PCT信息保存在Tiff等输出文件的文件头。
方法:gdal_merge.py
-pct 读入第一幅图像的PCT信息,并写入输出文件(假设所有输入文件使用相同的PCT)。
示例:
gdal_merge.bat -pct -of GTiff -oD:/qgis-ppt/mosaic/merge4-pct.tif D:/qgis-ppt/mosaic/J1.tifD:/qgis-ppt/mosaic/J2.tif D:/qgis-ppt/mosaic/J3.tif D:/qgis-ppt/mosaic/J4.tif
打开图像的16进制格式,可以看到,PCT文件比无PCT的文件,多了PCT文件头信息,其它部分都一样。
5.4 输出指定部分数据(将结果进行裁剪) 目的:将多个图像合并为一幅图像,输出指定范围数据。
原理:读入源图像(多个),复制(如果分辨率不一致,需要进行重采样)源图像到目标图像的相应位置,将结果数据进行范围裁剪。
方法:gdal_merge.py
-ul_lr upperleft_lowerright,左上角到右下角范围。默认使用全部范围。
示例:
gdal_merge.bat -ul_lr 114.01 39.99 114.03 39.97 -ofGTiff -o D:/qgis-ppt/mosaic/merge4-ul_lr.tif D:/qgis-ppt/mosaic/J1.tifD:/qgis-ppt/mosaic/merge4.tif
5.5 输出指定分辨率数据 目的:将多个图像合并为一幅图像,并输出指定分辨率数据。
原理:读入源图像(多个),进行重采样,将结果得到到目标图像的相应位置。
方法:gdal_merge.py
-ps xpixelsize ypixelsize,xy两个方向的输出分辨率。默认使用第一幅图像的分辨率。注意Y的方向。
示例:
gdal_merge.bat -of GTiff -ps 2.14577e-05-2.14577e-05 -o D:/qgis-ppt/mosaic/merge4-res.tif D:/qgis-ppt/mosaic/J1.tifD:/qgis-ppt/mosaic/J2.tif D:/qgis-ppt/mosaic/J3.tif D:/qgis-ppt/mosaic/J4.tif
6 gdalinfo: 信息读取、分析工具。可以读取、分析信息并生成相应的报告。
gdalinfo [--help-general] [-mm] [-stats] [-hist] [-nogcp] [-nomd]
[-norat] [-noct] [-nofl] [-checksum] [-proj4]
[-listmdd] [-mdd domain|`all`]*
[-sd subdataset] [-oo NAME=VALUE]* datasetname
参考:http://www.gdal.org/gdalinfo.html
6.1 获取栅格图像基本信息 目的:获取栅格图像基本信息。
原理:读取文件头信息。
方法:gdalinfo
最后一个参数代表输入的图像。
示例:
gdalinfo D:\qgis-ppt\mosaic\J1-zoom.tif
以下是输出
Driver: GTiff/GeoTIFF
Files: D:\qgis-ppt\mosaic\J1-zoom.tif
Size is 1024, 1024
Coordinate System is:
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84",6378137,298.257223563,
AUTHORITY["EPSG","7030"]],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0],
UNIT["degree",0.0174532925199433],
AUTHORITY["EPSG","4326"]]
Origin = (113.999977111816410,40.000019073486328)
Pixel Size = (0.000021457672119,-0.000021457672119)
Metadata:
AREA_OR_POINT=Area
Image Structure Metadata:
INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left(113.9999771,40.0000191)(113d59'59.92"E, 40d 0' 0.07"N)
Lower Left(113.9999771,39.9780464)(113d59'59.92"E, 39d58'40.97"N)
Upper Right ( 114.0219498, 40.0000191) (114d 1'19.02"E, 40d 0' 0.07"N)
Lower Right ( 114.0219498, 39.9780464) (114d 1'19.02"E, 39d58'40.97"N)
Center(114.0109634,39.9890327) (114d0'39.47"E, 39d59'20.52"N)
Band 1 Block=1024x2 Type=Byte, ColorInterp=Red
Band 2 Block=1024x2 Type=Byte, ColorInterp=Green
Band 3 Block=1024x2 Type=Byte, ColorInterp=Blue
7 gdalbuildvrt: 创建VRT(virtualgdal dataset)。
gdalbuildvrt [-tileindex field_name]
[-resolution {highest|lowest|average|user}]
[-te xmin ymin xmax ymax] [-tr xres yres] [-tap]
[-separate] [-b band] [-sd subdataset]
[-allow_projection_difference] [-q]
[-addalpha] [-hidenodata]
[-srcnodata "value [value...]"] [-vrtnodata "value [value...]"]
[-a_srs srs_def]
[-input_file_list my_liste.txt] [-overwrite] output.vrt [gdalfile]*
参考:http://www.gdal.org/gdalbuildvrt.html
7.1 VRT:可以被所有方法使用 目的:将多种类型的文件,合成一个文件使用。
原理:VRT使用一个XML文件,gdal读取并将多个文件动态合成。
方法:VRT可以读取所有GDAL支持的文件类型,也可以读取RAW文件。
VRT可以变换原始文件的几何和投影等所有信息。
示例:
440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0
Gray
"1">utm.tif
1
"0" yOff="0" xSize="512" ySize="512"/>
参考:http://www.gdal.org/gdal_vrttut.html
7.2 大量文件生成单一vrt文件 目的:将大量文件以文件名目录的方式生成一个vrt文件,用于其它操作时输入。
原理:将大量文件名生成一个vrt文件,gdal可以直接读取。
方法:gdalbuildvrt
-inputf_file_list 读入一个文件名,文件中每行代表一个栅格文件。
最后是输入的文件名。
输出文件是以.vrt结尾的文件。
示例:
D:\output\out>gdalbuildvrt j50c.vrt *.tif
gdalbuildvrt -input_file_list j50c4.txt j50c4.vrt
附 j50c4.txt:
NJ50C004003_lonlat-L14.tif
NJ50C004004_lonlat-L14.tif
7.3 图像合并(Merge)/镶嵌(Mosaic) 目的:将多个图像合并为一幅图像。
原理:将多个源图像处理为一个VRT文件,将VRT文件转换为目标格式文件。
方法:gdalbuildvrt+gdal_translate
使用VRT能明显提高处理效率。
此方法需要分两步,首先将多个源文件合成为一个VRT文件。参见:大量文件生成单一vrt文件。
然后将VRT文件转换为目标格式的图像。参见:格式转换。
示例:
D:\output\out>gdalbuildvrt j50c.vrt *.tif
D:\output\out>gdal_translate -of GTiff j50c.vrttranslate.tif
也可以被gdalwarp使用
gdalwarp -of GTiff D:/output/getile/t.vrtD:/output/getile/t.tif
7.4更改分辨率 目的:更改原始图像的分辨率。
原理:gdalbuildvrt 生成目标分辨率的vrt文件,使用gdal_translate生成tif文件。只能使用nearest方法。
方法:gdalbuildvrt
-trxres yres。设置目标图像的分辨率(地理坐标单位)。不可与-resolution共存。
示例:
7.5 地理范围裁剪 目的:根据指定地理范围,获取源图像相应图像。
原理:gdalbuildvrt裁剪范围,gdal_translate转换为目标图像。注意:此方法可以得到完美的输出范围,但是会将图像进行整体移动(一个像素以内),不推荐使用。
方法:gdalbuildvrt
-te xmin ymin xmax ymax:输出范围,输出图像将使用此范围,但是如果因为像素不能取整,则移动图像强行指定此范围。所以图像会变得不准确。
示例:
gdalbuildvrt -input_file_list Jlist.txt jlist.vrt
gdal_translate jlist.vrt jlist.tif
推荐阅读
- MFC|gdal 图像金字塔
- GDAL功能模块列表
- 深入解析GDAL库的RasterIO()函数
- GDAL关于圆形,多边形的创建以及如何判断点位是否与图形相交
- c++|gdal2.2.3关闭数据集失败的问题
- 初学者的领悟|百分比截断方法增加图像对比度的原理
- 初学者的领悟|c++实现使用GDAL实现大幅影像的快速读取
- GDAL|GDAL影像重采样
- gdal应用-gdalbuildvrt