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

时间:2018-03-18 23:29:02

标签: bash list gdal

我想在我拥有的包含多个目录的数据库中合并所有马赛克。我试图这样做,但我最后的马赛克合并了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)

1 个答案:

答案 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命令。

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