我想在我拥有的包含多个目录的数据库中合并所有马赛克。我试图这样做,但我最后的马赛克合并了M.tif'只是我列表中最后一项(mosaic_list)的马赛克。如何让gdal_warp合并我列表中的所有项目?
这是我的BASH脚本,出于某种原因,最后的马赛克' mergedM.tif'仅显示我的mosaic_list中的最后一项。
<?php
$con=mysqli_connect(root,user);
// Check connection
if (mysqli_connect_errno())
{
echo nl2br("Failed to connect to MySQL: " . mysqli_connect_error() . "\n");
} else {
echo nl2br("Established Database Connection \n");
}
//escape variables for allergen
$sanentry=implode(',',$_REQUEST["boxsize"]);
//escape variables for ethnicites
$category = mysqli_real_escape_string($con, $_POST['category']);
var_dump($category);
//sql select query
$sql="SELECT r.restaurant_name
FROM restaurant as r,
ethnicity as e,
allergen as a
WHERE e.restaurant_id=a.restaurant_id
AND e.restaurant_id=r.restaurant_id
AND a.restaurant_id=r.restaurant_id
AND a.allergen LIKE '%".$value."%'
AND e.ethnicity LIKE '%".$category."%'";
$split_allergy=explode(",", $sanentry);
// var_dump($split_allergy);
foreach ($split_allergy as $value){
echo $value;
$result=mysqli_query($con,$sql);
$resultCheck=mysqli_num_rows($result);
if ($resultCheck > 0) {
while ($row=mysqli_fetch_assoc($result)){
// echo $row['restaurant_name'] . "<br";
print_r($row);
}
}
}
mysqli_close($con);
$allergen=mysqli_real_escape_string($con, $sanentry);
?>
我的$ 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)
答案 0 :(得分: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
包含在列表中。
循环遍历文件列表。在每次迭代中,变量mosaic_list
都采用当前文件的值。您将其附加到文件mosaiclist.txt
。该文件应包含所有文件。到目前为止一切都很好。
然后在循环之后运行gdalwarp ... $mosaic_list mergedM.tif
。
此时mosaic_list
变量的值是多少?它是列表中的最后一项。完整列表位于文件中。也许你认为他们在某种程度上累积在这个变量中。这不是循环的工作方式。
这就是为什么剧本没有达到你的预期。
在Bash脚本方面也存在其他问题。
你永远不应该解析ls
的输出。它很脆弱,许多事情都可能出错。要获得强大的解决方案,请使用glob模式或find ... -exec
命令。
还要小心引用。命令参数中使用的变量应该包含在"..."
中,以防止单词拆分和通配。 (看看我在这篇文章的顶部做了什么。)