BASH: 使用 gdal_warp 使用列表合并 tifs

BASH: using gdal_warp to merge tifs using a list

我想合并我拥有的包含多个目录的数据库中的所有马赛克。我试图这样做,但我的最终马赛克 'mergedM.tif' 只是我列表中最后一项 (mosaic_list) 的马赛克。如何让 gdal_warp 合并列表中的所有项目?

这是我的 BASH 脚本,由于某些原因,最后的马赛克 'mergedM.tif' 只显示了我的 mosaic_list.

中的最后一项
basepath=/home/rose/Desktop/b #change this as top level directory

cd $basepath
dir_list=$(ls -d -1 $PWD/**) #create list of directories 

for i in $dir_list
do
    x=$(basename $i)
    mosaic_list=$basepath/$x/$x.tif #create list of tifs including text file 
    echo $mosaic_list >> mosaiclist.txt

done

gdalwarp -of GTiff -s_srs EPSG:2193 -t_srs EPSG:2193 -dstnodata -9999 $mosaic_list mergedM.tif #creates mosaic of selected files(should do)

我的 $mosaic_list 的回声是这样的;

/home/rose/Desktop/b/0900Rich/0900Rich.tif
/home/rose/Desktop/b/0900Takaka/0900Takaka.tif
/home/rose/Desktop/b/1000StArn/1000StArn.tif
/home/rose/Desktop/b/1000TakaHWS/1000TakaHWS.tif
/home/rose/Desktop/b/1100AorereVPost/1100AorereVPost.tif

你不需要循环。您可以直接使用您的 glob:

gdalwarp -of GTiff -s_srs EPSG:2193 -t_srs EPSG:2193 -dstnodata -9999 "$basepath"/**.tif /tmp/mergedM.tif

请注意,我将输出放在 /tmp/mergedM.tif 而不是 "$basepath"/mergedM.tif 中。这是为了防止您再次 运行 命令,以避免 mergedM.tif 被错误地包含在列表中。

你的脚本有什么问题

循环遍历文件列表。在每次迭代中,变量 mosaic_list 取当前文件的值。您将其附加到文件 mosaiclist.txt。该文件应包含所有文件。到目前为止一切顺利。

然后在循环之后,你运行gdalwarp ... $mosaic_list mergedM.tif。 此时 mosaic_list 变量的值是多少?这是列表中的最后一项。完整列表在一个文件中。也许您认为它们以某种方式累积在这个变量中。这不是循环的工作方式。

这就是为什么脚本没有达到您的预期。

在 Bash 脚本方面还有其他问题。 你不应该解析 ls 的输出。它很脆弱,很多事情都可能出错。要获得可靠的解决方案,请使用 glob 模式或 find ... -exec 命令。

还要注意引用。命令参数中使用的变量应包含在 "..." 中以防止分词和通配。 (看看我在这个 post 的顶部是怎么做的。)