GDAL应用

GDAL应用

[email protected]

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日添加文件数量测试

1  GDAL/OGR总览

1.1 功能

GDAL

  • 使用 gdalinfo 浏览影象
  • 使用 gdal_translate 转换数据格式
  • 使用 gdalwarp 重投影
  • 使用 gdal_warp 或 gdal_merge.py 拼接影象
  • 使用 gdaltindex 生成作为栅格切片索引的 shp 文件

OGR

  • 使用 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

@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可以变换原始文件的几何和投影等所有信息。

示例:

<VRTDataset rasterXSize="512" rasterYSize="512">
  440720.0, 60.0, 0.0, 3751320.0, 0.0, -60.0
  <VRTRasterBand dataType="Byte" band="1">
    Gray
    
      "1">utm.tif
      1
      "0" yOff="0" xSize="512" ySize="512"/>
      "0" yOff="0" xSize="512" ySize="512"/>
    
  VRTRasterBand>
VRTDataset>

参考: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

你可能感兴趣的:(GDAL/OGR)