我想在我拥有的包含多个目录的数据库中合并所有马赛克。我试图这样做,但我最后的马赛克'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
命令。
也要小心引用。命令参数中使用的变量应该包含在"..."
中,以防止单词拆分和通配。 (看看我在这篇文章的顶部做了多少。)