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

问题描述 投票:1回答:1

我想在我拥有的包含多个目录的数据库中合并所有马赛克。我试图这样做,但我最后的马赛克'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
bash list gdal
1个回答
0
投票

你不需要循环。你可以直接使用你的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错误地包含在列表中。

What was wrong with your script

循环遍历文件列表。在每次迭代中,变量mosaic_list都采用当前文件的值。您将它附加到文件mosaiclist.txt。该文件应包含所有文件。到现在为止还挺好。

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

这就是为什么剧本没有达到预期的效果。

在Bash脚本方面也存在其他问题。你永远不应该解析ls的输出。它很脆弱,很多东西都可能出错。要获得强大的解决方案,请使用glob模式或find ... -exec命令。

也要小心引用。命令参数中使用的变量应该包含在"..."中,以防止单词拆分和通配。 (看看我在这篇文章的顶部做了多少。)

© www.soinside.com 2019 - 2024. All rights reserved.