Skip to content

Commit

Permalink
Merge pull request OSGeo#11724 from rouault/fix_11717
Browse files Browse the repository at this point in the history
gdal raster mosaic/stack: turn gdalbuildvrt -strict mode, and add a --resolution=same mode mode
  • Loading branch information
rouault authored Jan 30, 2025
2 parents 9c8dc90 + 8e44a03 commit 045db42
Show file tree
Hide file tree
Showing 7 changed files with 246 additions and 145 deletions.
48 changes: 27 additions & 21 deletions apps/gdalalg_raster_mosaic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,18 @@ GDALRasterMosaicAlgorithm::GDALRasterMosaicAlgorithm()
AddArg("band", 'b', _("Specify input band(s) number."), &m_bands);
AddOverwriteArg(&m_overwrite);
{
auto &arg = AddArg("resolution", 0,
_("Target resolution (in destination CRS units)"),
&m_resolution)
.SetMetaVar("<xres>,<yres>|average|highest|lowest");
auto &arg =
AddArg("resolution", 0,
_("Target resolution (in destination CRS units)"),
&m_resolution)
.SetDefault("same")
.SetMetaVar("<xres>,<yres>|same|average|highest|lowest");
arg.AddValidationAction(
[this, &arg]()
{
const std::string val = arg.Get<std::string>();
if (val != "average" && val != "highest" && val != "lowest")
if (val != "average" && val != "highest" && val != "lowest" &&
val != "same")
{
const auto aosTokens =
CPLStringList(CSLTokenizeString2(val.c_str(), ",", 0));
Expand All @@ -66,8 +69,8 @@ GDALRasterMosaicAlgorithm::GDALRasterMosaicAlgorithm()
{
ReportError(CE_Failure, CPLE_AppDefined,
"resolution: two comma separated positive "
"values should be provided, or 'average', "
"'highest' or 'lowest'");
"values should be provided, or 'same', "
"'average', 'highest' or 'lowest'");
return false;
}
}
Expand Down Expand Up @@ -185,22 +188,25 @@ bool GDALRasterMosaicAlgorithm::RunImpl(GDALProgressFunc pfnProgress,
"VRT");

CPLStringList aosOptions;
if (!m_resolution.empty())
aosOptions.push_back("-strict");

aosOptions.push_back("-program_name");
aosOptions.push_back("gdal raster mosaic");

const auto aosTokens =
CPLStringList(CSLTokenizeString2(m_resolution.c_str(), ",", 0));
if (aosTokens.size() == 2)
{
const auto aosTokens =
CPLStringList(CSLTokenizeString2(m_resolution.c_str(), ",", 0));
if (aosTokens.size() == 2)
{
aosOptions.push_back("-tr");
aosOptions.push_back(aosTokens[0]);
aosOptions.push_back(aosTokens[1]);
}
else
{
aosOptions.push_back("-resolution");
aosOptions.push_back(m_resolution);
}
aosOptions.push_back("-tr");
aosOptions.push_back(aosTokens[0]);
aosOptions.push_back(aosTokens[1]);
}
else
{
aosOptions.push_back("-resolution");
aosOptions.push_back(m_resolution);
}

if (!m_bbox.empty())
{
aosOptions.push_back("-te");
Expand Down
48 changes: 27 additions & 21 deletions apps/gdalalg_raster_stack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,18 @@ GDALRasterStackAlgorithm::GDALRasterStackAlgorithm()
AddArg("band", 'b', _("Specify input band(s) number."), &m_bands);
AddOverwriteArg(&m_overwrite);
{
auto &arg = AddArg("resolution", 0,
_("Target resolution (in destination CRS units)"),
&m_resolution)
.SetMetaVar("<xres>,<yres>|average|highest|lowest");
auto &arg =
AddArg("resolution", 0,
_("Target resolution (in destination CRS units)"),
&m_resolution)
.SetDefault("same")
.SetMetaVar("<xres>,<yres>|same|average|highest|lowest");
arg.AddValidationAction(
[this, &arg]()
{
const std::string val = arg.Get<std::string>();
if (val != "average" && val != "highest" && val != "lowest")
if (val != "average" && val != "highest" && val != "lowest" &&
val != "same")
{
const auto aosTokens =
CPLStringList(CSLTokenizeString2(val.c_str(), ",", 0));
Expand All @@ -66,8 +69,8 @@ GDALRasterStackAlgorithm::GDALRasterStackAlgorithm()
{
ReportError(CE_Failure, CPLE_AppDefined,
"resolution: two comma separated positive "
"values should be provided, or 'average', "
"'highest' or 'lowest'");
"values should be provided, or 'same', "
"'average', 'highest' or 'lowest'");
return false;
}
}
Expand Down Expand Up @@ -181,24 +184,27 @@ bool GDALRasterStackAlgorithm::RunImpl(GDALProgressFunc pfnProgress,

CPLStringList aosOptions;

aosOptions.push_back("-strict");

aosOptions.push_back("-program_name");
aosOptions.push_back("gdal raster stack");

aosOptions.push_back("-separate");

if (!m_resolution.empty())
const auto aosTokens =
CPLStringList(CSLTokenizeString2(m_resolution.c_str(), ",", 0));
if (aosTokens.size() == 2)
{
const auto aosTokens =
CPLStringList(CSLTokenizeString2(m_resolution.c_str(), ",", 0));
if (aosTokens.size() == 2)
{
aosOptions.push_back("-tr");
aosOptions.push_back(aosTokens[0]);
aosOptions.push_back(aosTokens[1]);
}
else
{
aosOptions.push_back("-resolution");
aosOptions.push_back(m_resolution);
}
aosOptions.push_back("-tr");
aosOptions.push_back(aosTokens[0]);
aosOptions.push_back(aosTokens[1]);
}
else
{
aosOptions.push_back("-resolution");
aosOptions.push_back(m_resolution);
}

if (!m_bbox.empty())
{
aosOptions.push_back("-te");
Expand Down
Loading

0 comments on commit 045db42

Please sign in to comment.