Skip to content
Snippets Groups Projects
Commit 538f98e4 authored by Marina Bertolino's avatar Marina Bertolino
Browse files

ENH: add band range function to otbExtendedFilenameHelper

parent 64867fda
Branches
Tags
No related merge requests found
......@@ -67,6 +67,15 @@ public:
void Print(std::ostream& os);
};
/** Decode the string into a list of GenericBandRange, band indexes are
* 1-based. */
std::vector<ExtendedFilenameHelper::GenericBandRange> GetBandRange(const std::string &optRangeSecond) const;
/** Resolve the list of band ranges into real band indexes, according to
* a total number of bands in the image. Note that the output indexes are
* zero-based (0 is the first component) */
bool ResolveBandRange(const unsigned int &nbBands, std::vector<unsigned int> &output, const std::string &optRangeSecond) const;
protected:
ExtendedFilenameHelper() {}
~ExtendedFilenameHelper() ITK_OVERRIDE {}
......
......@@ -191,4 +191,60 @@ ExtendedFilenameHelper::GenericBandRange
}
}
std::vector<ExtendedFilenameHelper::GenericBandRange>
ExtendedFilenameHelper
::GetBandRange(const std::string &optRangeSecond) const
{
//Parse string to return vector of band range
std::vector<ExtendedFilenameHelper::GenericBandRange> vBands;
size_t start = 0;
size_t pos;
while (start != std::string::npos)
{
pos = optRangeSecond.find(',',start);
if (pos > start)
{
ExtendedFilenameHelper::GenericBandRange range;
size_t size = (pos == std::string::npos ? pos : pos - start);
bool ret = range.SetString(optRangeSecond, start, size);
if (ret) vBands.push_back(range);
}
if (pos != std::string::npos) pos++;
start = pos;
}
return vBands;
}
bool
ExtendedFilenameHelper
::ResolveBandRange(const unsigned int &nbBands, std::vector<unsigned int> &output, const std::string &optRangeSecond) const
{
output.clear();
std::vector<ExtendedFilenameHelper::GenericBandRange> bandRangeList =
this->GetBandRange(optRangeSecond);
for (unsigned int i=0 ; i<bandRangeList.size() ; i++)
{
int a = bandRangeList[i].first;
int b = bandRangeList[i].second;
if (a<0) a+= nbBands+1;
if (b<0) b+= nbBands+1;
if (a==0) a=1;
if (b==0) b=nbBands;
if (1<=a && a<=b && b<=(int)nbBands)
{
for (unsigned int k=a ; k <= (unsigned int)b ; k++)
{
output.push_back((int)k -1);
}
}
else
{
// Invalid range wrt. the given number of bands
return false;
}
}
return true;
}
} // end namespace otb
......@@ -253,56 +253,14 @@ std::vector<ExtendedFilenameHelper::GenericBandRange>
ExtendedFilenameToReaderOptions
::GetBandRange () const
{
//Parse string to return vector of band range
std::vector<ExtendedFilenameHelper::GenericBandRange> vBands;
size_t start = 0;
size_t pos;
while (start != std::string::npos)
{
pos = m_Options.bandRange.second.find(',',start);
if (pos > start)
{
ExtendedFilenameHelper::GenericBandRange range;
size_t size = (pos == std::string::npos ? pos : pos - start);
bool ret = range.SetString(m_Options.bandRange.second, start, size);
if (ret) vBands.push_back(range);
}
if (pos != std::string::npos) pos++;
start = pos;
}
return vBands;
return Superclass::GetBandRange(m_Options.bandRange.second);
}
bool
ExtendedFilenameToReaderOptions
::ResolveBandRange(const unsigned int &nbBands, std::vector<unsigned int> &output) const
{
output.clear();
std::vector<ExtendedFilenameHelper::GenericBandRange> bandRangeList =
this->GetBandRange();
for (unsigned int i=0 ; i<bandRangeList.size() ; i++)
{
int a = bandRangeList[i].first;
int b = bandRangeList[i].second;
if (a<0) a+= nbBands+1;
if (b<0) b+= nbBands+1;
if (a==0) a=1;
if (b==0) b=nbBands;
if (1<=a && a<=b && b<=(int)nbBands)
{
for (unsigned int k=a ; k <= (unsigned int)b ; k++)
{
output.push_back((int)k -1);
}
}
else
{
// Invalid range wrt. the given number of bands
return false;
}
}
return true;
return Superclass::ResolveBandRange(nbBands, output, m_Options.bandRange.second);
}
} // end namespace otb
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment