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 的顶部是怎么做的。)
我想合并我拥有的包含多个目录的数据库中的所有马赛克。我试图这样做,但我的最终马赛克 '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 的顶部是怎么做的。)