GDAL Docker容器内使用管道执行多GDAL命令报错问题咨询
问题原因
当前写法存在两个核心错误:
- 管道符
|的作用是将前一个命令的**标准输出(stdout)**传递给后一个命令的标准输入,你所写的gdal_pansharpen.py是把结果写入/home/combo.tif磁盘文件,不会产生任何stdout内容,管道触发后gdal_translate会立即启动,此时前序的全色锐化进程还没完成combo.tif的写入,自然找不到文件。 - 你之前尝试的
vsistdout/vsistdin方案报错大概率是参数配置不对,gdal_pansharpen.py需要指定输出格式、并将输出路径设置为/vsistdout/,才能将结果流写入stdout,gdal_translate也需要指定输入为/vsistdin/才能从管道读取流。
解决方法1:顺序执行命令(无需流传输)
如果不需要节省磁盘空间,直接把管道符换成&&即可,&&会保证前一个命令执行成功后才启动后一个命令:
docker run -v /my_dir/:/home osgeo/gdal:alpine-normal-3.4.0 \ sh -c 'gdal_pansharpen.py -r cubic /home/pan.tif /home/mul.tif \ /home/combo.tif && gdal_translate -of COG -ot Byte /home/combo.tif \ /home/combo_byte.tif'
如果不需要保留中间文件combo.tif,可以在命令末尾加&& rm /home/combo.tif清理。
解决方法2:流管道传输(不生成中间文件)
正确配置虚拟文件系统参数即可实现无中间文件的管道传输:
docker run -v /my_dir/:/home osgeo/gdal:alpine-normal-3.4.0 \ sh -c 'gdal_pansharpen.py -of GTiff -r cubic /home/pan.tif /home/mul.tif \ /vsistdout/ | gdal_translate -of COG -ot Byte /vsistdin/ \ /home/combo_byte.tif'
注意这里必须给
gdal_pansharpen.py加-of GTiff参数指定输出格式,否则GDAL无法推断流输出的格式,会导致写入失败。
内容的提问来源于stack exchange,提问作者Yves Moisan
相关产品推荐
相关产品推荐

