ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

GDAL gdal_retile 完全指南:瓦片重切片与金字塔构建实战

GDAL gdal_retile 完全指南:瓦片重切片与金字塔构建实战 GIS遥感数据工程【免费下载链接】gdalGDAL is an open source MIT licensed translator library for raster and vector geospatial data formats.项目地址https://gitcode.com/gh_mirrors/gd/gdal点击查看免费下载本篇技术指南围绕 GDAL 官方命令gdal_retile展开讲解如何将一组已经地理配准的输入瓦片重新切分为统一的规则网格、按需构建多层影像金字塔并输出 shapefile 瓦片索引或 CSV 地理信息文件。读完本文你将掌握gdal_retile的全部命令行参数及其默认值、输出目录结构与瓦片命名规则理解其底层基于 GDAL/OGR Python 绑定的实现原理并能参考仓库内的自动化测试用例写出可运行的实战命令。文中所有参数说明以官方命令参考 doc/source/programs/gdal_retile.rst 为骨架以源码 swig/python/gdal-utils/osgeo_utils/gdal_retile.py 为佐证。gdal_retile 是什么gdal_retile是一个用于**重切片retile和构建金字塔tiled pyramid**的 GDAL 工具。它接收一组输入瓦片tile将其重新组织为统一规格的输出瓦片集合可选地它还会为输出结果生成一层或多层金字塔便于大影像的快速缩放浏览。在 gdal_retile.rst 中官方明确了该工具的输入前提与能力边界所有输入瓦片必须位于同一个坐标系统中且波段数一致输入瓦片的仿射变换矩阵geotransform不得包含旋转项即第 2、4 个系数必须为 0可选生成金字塔并可同时生成描述输出瓦片范围的 shapefile 索引当输入瓦片数量过多、超出命令行缓冲区时可使用通用--optfile选项把参数写入文件该工具是Python 实用程序仅在 GDAL Python 绑定osgeo模块可用时才可用。特别提醒gdal_retile已被官方标注为废弃deprecated新开发的命令行程序gdal raster tile自 GDAL 3.11 起提供在功能上与其部分等价详见 gdal_raster_tile.rst。但gdal_retile的同坐标系瓦片重切片 金字塔 shapefile/CSV 索引工作流至今仍有大量存量用法理解其语义对迁移也很有帮助。完整命令语法Synopsisgdal_retile的完整语法如下来自 gdal_retile.rstgdal_retile [--help] [--help-general] [-v] [-co NAMEVALUE]... [-of out_format] [-ps pixelWidth pixelHeight] [-overlap val_in_pixel] [-ot {Byte/Int8/Int16/UInt16/UInt32/Int32/Float32/Float64/ CInt16/CInt32/CFloat32/CFloat64}] [ -tileIndex tileIndexName [-tileIndexField tileIndexFieldName]] [-csv fileName [-csvDelim delimiter]] [-s_srs srs_def] [-pyramidOnly] [-r {near|bilinear|cubic|cubicspline|lanczos}] -levels numberoflevels [-useDirForEachRow] [-resume] -targetDir TileDirectory input_file input_file...该用法同时与源码中的Usage()输出保持一致见 gdal_retile.py。可以看出唯一必选参数是-targetDir TileDirectory指定输出瓦片目录后面跟随一个或多个输入文件-levels numberoflevels在语法中被标记为必选用于指定金字塔层数源码中该值必须大于等于 1否则报Invalid number of levels见 gdal_retile.py。输出结构与瓦片命名规则-targetDir输出目录与金字塔子目录-targetDir directory指定瓦片结果的输出目录。关键行为如下gdal_retile.rst基础层瓦片直接存放在该目录中金字塔层存放在从 1 开始编号的子目录1/、2/、……中生成的瓦片文件名遵循编号 schema并包含源瓦片文件的名字。从源码看-targetDir指向的目录必须已存在否则报TargetDir dir does not exist并退出若路径末尾缺少路径分隔符程序会自动补上gdal_retile.py。金字塔层目录由程序自动创建gdal_retile.py。瓦片命名规则瓦片文件名的生成逻辑位于getTileName()gdal_retile.py规则可以概括为文件名 源文件名去扩展名_行号_列号.扩展名例如输入byte.tif产生的瓦片为byte_1_1.tif、byte_1_2.tif行号、列号采用零填充填充宽度取决于countTilesX与countTilesY中较大者的位数例如 5 行 5 列时位数为 1输出byte_1_1.tif超过 9 行时位数为 2输出byte_01_01.tif之类扩展名默认沿用输入文件扩展名通过输出驱动元数据DMD_EXTENSION获取若驱动未声明扩展名则使用输入扩展名使用-of指定输出格式时会采用对应驱动的扩展名。测试用例 test_gdal_retile.py 验证了非连续输入下的命名in1_01_05.tif、金字塔层1/in1_1_2.tif等均按上述规则生成。核心参数详解通用选项--help、--help-general、-v--help打印用法并退出--help-general给出 GDAL 通用命令行选项的简要说明。-v打开详细输出verbose逐瓦片打印操作过程。开启后每个瓦片创建完成时会在终端打印瓦片名 : 偏移X|偏移Y--宽度-高度形式的信息gdal_retile.py并在结束时打印FINISHED。输出格式与类型-of、-co、-ot-of out_format选择输出格式使用格式短名如GTiff、PNG。若未指定则根据扩展名猜测格式options/of.rst。源码中-f也作为-of的别名接受默认格式为GTiff见 gdal_retile.py 与RetileGlobals初始化。-co NAMEVALUE创建选项creation options可重复多次原样传给输出驱动。例如 GeoTIFF 驱动的TILEDYES、COMPRESSDEFLATE等。创建选项最终通过g.Driver.Create(...)传入gdal_retile.py。-ot type强制输出波段的数据类型。完整取值列表见 options/ot.rstByte、Int8、UInt16、Int16、UInt32、Int32、UInt64、Int64、Float32、Float64、CInt16、CInt32、CFloat32、CFloat64。源码通过gdal.GetDataTypeByName()解析该参数解析失败返回GDT_Unknown会报错退出gdal_retile.py。未指定时输出类型与输入瓦片一致。切片规格-ps、-overlap-ps pixelsize_x pixelsize_y指定输出瓦片的像素尺寸宽、高。默认 256 × 256。源码中对应-ps后的两个整数分别赋给TileWidth、TileHeight若任一为 0 会报Invalid tile dimensiongdal_retile.py。-overlap val_in_pixel相邻瓦片之间的重叠像素数默认 0。源码同时校验瓦片尺寸 - 重叠数必须大于 0否则报Overlap too big w.r.t tile height/widthgdal_retile.py。瓦片的切分计算封装在tile_info类中gdal_retile.py当影像尺寸大于瓦片尺寸时行/列方向上的瓦片数量由公式countTiles 1 int((xsize - tileSize (tileSize - overlap) - 1) / (tileSize - overlap))确定即按步长 瓦片尺寸 − 重叠数向上取整切片边缘瓦片会不足满幅。测试用例 test_gdal_retile.py 对-ps 8 7 -overlap 3与-ps 8 8 -overlap 4产生的边缘瓦片尺寸如5×7、8×4、6×6做了逐一断言可作为理解该公式的直观样本。金字塔-levels、-pyramidOnly、-r-levels numberOfLevels指定要构建的金字塔层数。-pyramidOnly不重切片只构建金字塔。此时跳过基础层切片tileImage直接以内部构建的输入瓦片索引作为金字塔第一层的数据来源gdal_retile.py。-r algorithm金字塔层使用的重采样算法可选near、bilinear、cubic、cubicspline、lanczos默认near。源码将这五种字符串分别映射为gdal.GRA_NearestNeighbour、GRA_Bilinear、GRA_Cubic、GRA_CubicSpline、GRA_Lanczos未知算法会报错退出gdal_retile.py。金字塔构建入口为buildPyramid()/buildPyramidLevel()gdal_retile.py每一层将上一层的瓦片索引作为输入切分尺寸减半int(xsize/2)、int(ysize/2)单个瓦片的地理范围像素尺寸则扩大一倍源码中以scaleX * 2、scaleY * 2表达见 gdal_retile.py从而保证金字塔层之间像素对齐、分辨率逐层减半。每个金字塔瓦片通过gdal.ReprojectImage()完成重采样写入gdal_retile.py。需要说明文档与当前实现的一个细节差异官方文档写有所有金字塔层都从输入瓦片生成而非从上一层生成但从当前仓库源码看金字塔是逐层递进的——buildPyramid循环中把上一层返回的瓦片索引OGRDS传给下一层gdal_retile.pymosaic_info再通过DataSetCache打开索引中记录的瓦片文件读取数据gdal_retile.py。因此第二层及以上实际以上一层金字塔瓦片为数据源。空间参考-s_srs-s_srs srs_def用于显式指定输入数据使用的空间参考系gdal_retile.rst可接受的值与OGRSpatialReference.SetFromUserInput()完全一致包括 EPSG 编码如EPSG:4296、投影坐标系PCS与地理坐标系GCS名称、PROJ.4 定义字符串或包含 Well Known Text 的.prj文件路径若未指定则使用输入瓦片自身的 SRS如果存在该 SRS 会传播到生成的瓦片如果可能以及可选的 shapefile 索引中。源码中该参数通过osr.SpatialReference().SetFromUserInput()解析失败即报invalid -s_srsgdal_retile.py若命令行未提供而输入瓦片带投影则程序会自动从输入瓦片推导并写回输出瓦片gdal_retile.py。更全面的 SRS 表示形式说明可参见 raster_common_options.rst。瓦片索引-tileIndex、-tileIndexField-tileIndex tileIndexName生成一个记录输出瓦片范围的 shapefile 索引。源码会为不带扩展名的名字自动补.shpgdal_retile.py每个瓦片对应一个面polygon要素属性字段记录瓦片文件名。-tileIndexField tileIndexFieldName索引属性中保存瓦片名的字段名默认location见RetileGlobals初始化 gdal_retile.py字段类型为字符串、宽度 256gdal_retile.py。实现上程序先在内存驱动中构建临时瓦片索引TileIndexDriverTyp Memory任务完成后通过copyTileIndexToDisk()用 ESRI Shapefile 驱动写出gdal_retile.py。基础层的索引写在-targetDir下金字塔各层的索引写在对应层级子目录下如1/、2/。使用-useDirForEachRow时索引中的瓦片名会带上行子目录前缀形如1/byte_1_1.tif。CSV 地理信息-csv、-csvDelim-csv csvFileName生成一个记录各瓦片地理范围信息的 CSV 文件固定 5 列tilename,minx,maxx,miny,maxy瓦片名、最小 X、最大 X、最小 Y、最大 Y。不带扩展名时自动补.csvgdal_retile.py。-csvDelim column delimiterCSV 列分隔符默认分号;。CSV 的写出逻辑在copyTileIndexToCSV()gdal_retile.py遍历索引要素写出瓦片 basename再通过要素几何的GetEnvelope()依次写出 minx、maxx、miny、maxy 四个坐标值。每层金字塔会生成对应的 CSV基础层在-targetDir下第 N 层在N/子目录下。目录结构优化-useDirForEachRow对于影像特别大、瓦片文件数量极多的情况单个目录内文件数过多会导致某些文件系统性能骤降。-useDirForEachRow改变输出结构以缓解该问题gdal_retile.rst基础层瓦片存放在子目录0/中金字塔层分别放在1/、2/、……在每一层目录内再按行创建编号子目录0、1、……每个目录只存放某一层某一行的瓦片对于大影像可获得显著的性能提升。从源码看该模式下getTileName()会在getTargetDir(g, level) 行号/下生成瓦片并在切换到新行时自动os.mkdir创建行目录gdal_retile.py同时程序会预先创建0/层目录gdal_retile.py。断点续传-resume-resume进入续传模式只生成缺失的文件gdal_retile.rst。适合中断后的重新启动。实现上程序在创建每个瓦片前检查目标文件是否已存在若存在则跳过重采样、只把该瓦片登记进索引feature_only g.Resume and os.path.exists(tilename)见 [gdal_retile.py](https://link.gitcode.com/i/c4097efa37e3b2325b278946101979dc#L428、L870 与 L672-L676。工作流程与底层实现剖析gdal_retile的执行主流程在main()中gdal_retile.py可概括为六个阶段参数解析遍历命令行参数填充RetileGlobals未知选项报Unrecognized command option。输入校验至少需要一个输入文件-targetDir必须存在瓦片尺寸与重叠数需满足约束。构建内部瓦片索引getTileIndexFromFiles逐一打开输入瓦片校验 geotransform 无旋转项gt[2] ! 0 or gt[4] ! 0时报错并提示可能需要先使用 gdalwarp见 gdal_retile.py校验各瓦片 SRS 一致性缺失、存在或不相同都会报错gdal_retile.py然后为每个瓦片在内存索引中登记一个面要素addFeature用 WKT 构建多边形gdal_retile.py。计算整体范围mosaic_info从索引图层GetExtent()得到整个马赛克的西北角与东南角进而推算整幅影像的像素尺寸、波段数、数据类型、投影、NoData 与颜色表/颜色解释等元信息gdal_retile.py。基础层切片tileImage按tile_info的网格遍历每个瓦片通过mosaic_info.getDataSet()从与目标包围盒相交的源瓦片窗口读取数据并写入临时文件最后重命名为正式瓦片createTilegdal_retile.py。NoData 值会被传播目标瓦片先用 NoData 填充再叠加源数据gdal_retile.py。金字塔构建buildPyramid逐层以减半分辨率、倍增像素范围切分每个金字塔瓦片用gdal.ReprojectImage重采样生成createPyramidTilegdal_retile.py并同步输出每层的 shapefile 索引与 CSV。值得注意的实现细节源瓦片缓存DataSetCache维护一个容量为 8 的 FIFO 缓存避免频繁gdal.Open重复打开源瓦片gdal_retile.py。临时文件机制每个瓦片先以tmp_前缀的临时文件写出_createTempFileName完成后_renameDataset原子式重命名为正式名gdal_retile.py保证中断时不产生半成品正式文件——这与-resume的只生成缺失文件语义配合良好。不支持 Create 能力驱动的处理若输出驱动没有DCAP_CREATE能力如 MEM 驱动程序会自动选用 MEM 驱动做中间缓冲再CreateCopy到目标驱动gdal_retile.py。实战示例以下示例基于 gcore/byte.tif测试数据与仓库测试用例整理命令均可直接替换路径运行。示例 1最简重切片将单个输入按默认 256×256 瓦片重切片到out目录目录需预先存在gdal_retile -targetDir out byte.tif示例 2重切片 2 层金字塔双线性重采样gdal_retile -v -levels 2 -r bilinear -targetDir out byte.tif执行后out/下为基础层瓦片byte_1_1.tif…out/1/、out/2/为两层金字塔。测试用例 test_gdal_retile.py 验证了该场景基础层byte_1_1.tif校验和为 4672第 1 层瓦片宽 10 像素、第 2 层宽 5 像素分辨率逐层减半。示例 3指定瓦片大小与重叠gdal_retile -v -ps 8 7 -overlap 3 -targetDir out byte.tif输出 20 个瓦片尺寸为 8×7 或边缘不足5×7、8×4、5×4与 test_gdal_retile.py 中断言的尺寸完全一致。示例 4生成 shapefile 索引与 CSVgdal_retile -tileIndex index -tileIndexField location -csv tiles.csv -targetDir out byte.tif生成out/index.shp含location字段记录瓦片名与out/tiles.csv5 列tilename;minx;maxx;miny;maxy默认分号分隔。示例 5仅构建金字塔输入本身已切好片只补建金字塔gdal_retile -pyramidOnly -levels 3 -r cubic -targetDir out byte_*.tif示例 6PNG 输出 金字塔gdal_retile -v -levels 2 -r bilinear -of PNG -targetDir out byte.tif测试用例 test_gdal_retile.py 验证了 PNG 输出与.aux.xml辅助文件如byte_1_1.png.aux.xml的生成。示例 7多输入瓦片拼接重切片多个同坐标系、同波段数、无旋转的瓦片一起输入gdal_retile -v -levels 2 -r bilinear -ps 20 20 -targetDir out in1.tif in2.tif in3.tif仓库测试 test_gdal_retile.py 专门构造了三块含间隙的 100×100 输入分别填 0、21、42验证了部分网格无数据时也能正确生成其余瓦片的行为。示例 8断点续传中断后再次执行同样命令即可补齐缺失瓦片gdal_retile -resume -levels 2 -targetDir out byte.tif输入瓦片过多的处理--optfile当输入瓦片数量多到超出命令行缓冲区时官方建议改用通用选项--optfilegdal_retile.rst。其规则见 raster_common_options.rst从指定文件读取并替换命令行参数列表以#开头的行被忽略多词参数可用双引号保持为一个整体可多次使用--optfile file1 --optfile file2。例如将全部输入瓦片写入tiff_list.txt后执行gdal_retile -levels 2 -targetDir out --optfile tiff_list.txt约束、错误场景与退出码依据文档 gdal_retile.rst 与源码校验逻辑以下情况会导致任务无法执行或直接报错geotransform 含旋转项报File file has a geotransform matrix with rotational terms, which is not supported. You may need to use gdalwarp before.测试 test_gdal_retile.py各输入瓦片 SRS 不一致报File file has a SRS different from other tiles.部分瓦片缺失 SRS 时分别报has no SRS whether other tiles have one./has a SRS whether other tiles do not.测试 test_gdal_retile.py波段数不一致文档明确要求所有输入瓦片波段数匹配-targetDir目录不存在、瓦片尺寸为 0、重叠数不小于瓦片尺寸、-levels小于 1、未知格式/未知数据类型/未知重采样算法均会打印错误并退出。关于退出码按 return_code.rst 的通用约定成功返回 0出错返回非 0作为警告发出的非阻塞错误仍视为成功执行。迁移建议与gdal raster tile的关系官方文档明确指出新命令行接口中的 gdal_raster_tile.rst 与gdal_retile部分等价gdal_retile.rst。两者定位差异显著gdal raster tileGDAL 3.11面向OGC WMTS 规范的瓦片金字塔默认按 WebMercatorQuad 等既定 tiling scheme 切 Web 瓦片同时可生成 OpenLayers/Leaflet 查看器页面侧重 Web 发布场景可用--tiling-scheme raster让瓦片网格完全贴合输入栅格的起点与分辨率语义上与gdal_retile最接近示例见 gdal_raster_tile.rstgdal_retile则强调同坐标系栅格瓦片的规则化重切片并输出 shapefile/CSV 索引更适合需要精确控制网格、重叠与索引产物的批处理流程。从仓库现状看gdal_retile的 Python 实现gdal_retile.py仍随 GDAL 发布并被 autotest/pyscripts/test_gdal_retile.py 完整覆盖但脚本入口已在导入时调用deprecation_warn(gdal_retile)给出废弃提示scripts/gdal_retile.py。新项目建议优先评估gdal raster tile存量脚本可依据上文参数对照平滑迁移。赞分享GIS遥感数据工程【免费下载链接】gdalGDAL is an open source MIT licensed translator library for raster and vector geospatial data formats.项目地址https://gitcode.com/gh_mirrors/gd/gdal点击查看免费下载相关推荐libvips 图像金字塔构建完全指南使用 dzsave 生成 DeepZoom / Zoomify / Google Maps / IIIF 瓦片金字塔libvips 图像金字塔构建完全指南使用 dzsave 生成 DeepZoom / Zoomify / Google Maps / IIIF 瓦片金字塔 导图像处理GDAL MRFMeta Raster Format驱动完全指南云友好瓦片金字塔、缓存与多格式压缩GDAL MRFMeta Raster Format驱动完全指南云友好瓦片金字塔、缓存与多格式压缩 本篇技术指南聚焦 GDAL 内置的 MRFMetaGIS遥感数据工程GDAL 3.11 gdal raster tile 栅格切片生成完全指南从 WMTS 瓦片目录到 Web 发布GDAL 3.11 gdal raster tile 栅格切片生成完全指南从 WMTS 瓦片目录到 Web 发布 导读 gdal raster tile 是GIS遥感数据工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进