Skip to content

Commit 922276f

Browse files
authored
Merge pull request #12082 from rouault/S2C
Sentinel2: make the driver ready for S2C_ filenames
2 parents c7cce23 + a6fbae1 commit 922276f

File tree

1 file changed

+27
-24
lines changed

1 file changed

+27
-24
lines changed

Diff for: frmts/sentinel2/sentinel2dataset.cpp

+27-24
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,20 @@ static const char *SENTINEL2GetOption(GDALOpenInfo *poOpenInfo,
141141
static bool SENTINEL2GetTileInfo(const char *pszFilename, int *pnWidth,
142142
int *pnHeight, int *pnBits);
143143

144+
/************************************************************************/
145+
/* IsS2Prefixed() */
146+
/************************************************************************/
147+
148+
// IsS2Prefixed(pszStr, "foo") checks that pszStr starts with
149+
// "S2x_foo" where x=A/B/C/D
150+
static bool IsS2Prefixed(const char *pszStr, const char *pszPrefixAfterS2X)
151+
{
152+
return pszStr[0] == 'S' && pszStr[1] == '2' && pszStr[2] >= 'A' &&
153+
pszStr[2] <= 'Z' &&
154+
(*pszPrefixAfterS2X == 0 ||
155+
STARTS_WITH_CI(pszStr + 3, pszPrefixAfterS2X));
156+
}
157+
144158
/************************************************************************/
145159
/* SENTINEL2GranuleInfo */
146160
/************************************************************************/
@@ -389,14 +403,10 @@ int SENTINEL2Dataset::Identify(GDALOpenInfo *poOpenInfo)
389403
/* Accept directly .zip as provided by https://scihub.esa.int/
390404
* First we check just by file name as it is faster than looking
391405
* inside to detect content. */
392-
if ((STARTS_WITH_CI(pszJustFilename, "S2A_MSIL1C_") ||
393-
STARTS_WITH_CI(pszJustFilename, "S2B_MSIL1C_") ||
394-
STARTS_WITH_CI(pszJustFilename, "S2A_MSIL2A_") ||
395-
STARTS_WITH_CI(pszJustFilename, "S2B_MSIL2A_") ||
396-
STARTS_WITH_CI(pszJustFilename, "S2A_OPER_PRD_MSI") ||
397-
STARTS_WITH_CI(pszJustFilename, "S2B_OPER_PRD_MSI") ||
398-
STARTS_WITH_CI(pszJustFilename, "S2A_USER_PRD_MSI") ||
399-
STARTS_WITH_CI(pszJustFilename, "S2B_USER_PRD_MSI")) &&
406+
if ((IsS2Prefixed(pszJustFilename, "_MSIL1C_") ||
407+
IsS2Prefixed(pszJustFilename, "_MSIL2A_") ||
408+
IsS2Prefixed(pszJustFilename, "_OPER_PRD_MSI") ||
409+
IsS2Prefixed(pszJustFilename, "_USER_PRD_MSI")) &&
400410
EQUAL(CPLGetExtensionSafe(pszJustFilename).c_str(), "zip"))
401411
{
402412
return TRUE;
@@ -497,10 +507,8 @@ GDALDataset *SENTINEL2Dataset::Open(GDALOpenInfo *poOpenInfo)
497507
}
498508

499509
const char *pszJustFilename = CPLGetFilename(poOpenInfo->pszFilename);
500-
if ((STARTS_WITH_CI(pszJustFilename, "S2A_OPER_PRD_MSI") ||
501-
STARTS_WITH_CI(pszJustFilename, "S2B_OPER_PRD_MSI") ||
502-
STARTS_WITH_CI(pszJustFilename, "S2A_USER_PRD_MSI") ||
503-
STARTS_WITH_CI(pszJustFilename, "S2B_USER_PRD_MSI")) &&
510+
if ((IsS2Prefixed(pszJustFilename, "_OPER_PRD_MSI") ||
511+
IsS2Prefixed(pszJustFilename, "_USER_PRD_MSI")) &&
504512
EQUAL(CPLGetExtensionSafe(pszJustFilename).c_str(), "zip"))
505513
{
506514
const CPLString osBasename(CPLGetBasenameSafe(pszJustFilename));
@@ -525,8 +533,7 @@ GDALDataset *SENTINEL2Dataset::Open(GDALOpenInfo *poOpenInfo)
525533
GDALOpenInfo oOpenInfo(osFilename, GA_ReadOnly);
526534
return Open(&oOpenInfo);
527535
}
528-
else if ((STARTS_WITH_CI(pszJustFilename, "S2A_MSIL1C_") ||
529-
STARTS_WITH_CI(pszJustFilename, "S2B_MSIL1C_")) &&
536+
else if (IsS2Prefixed(pszJustFilename, "_MSIL1C_") &&
530537
EQUAL(CPLGetExtensionSafe(pszJustFilename).c_str(), "zip"))
531538
{
532539
const CPLString osBasename(CPLGetBasenameSafe(pszJustFilename));
@@ -544,8 +551,7 @@ GDALDataset *SENTINEL2Dataset::Open(GDALOpenInfo *poOpenInfo)
544551
GDALOpenInfo oOpenInfo(osFilename, GA_ReadOnly);
545552
return Open(&oOpenInfo);
546553
}
547-
else if ((STARTS_WITH_CI(pszJustFilename, "S2A_MSIL2A_") ||
548-
STARTS_WITH_CI(pszJustFilename, "S2B_MSIL2A_")) &&
554+
else if (IsS2Prefixed(pszJustFilename, "_MSIL2A_") &&
549555
EQUAL(CPLGetExtensionSafe(pszJustFilename).c_str(), "zip"))
550556
{
551557
const CPLString osBasename(CPLGetBasenameSafe(pszJustFilename));
@@ -621,12 +627,10 @@ GDALDataset *SENTINEL2Dataset::Open(GDALOpenInfo *poOpenInfo)
621627
if (VSI_ISREG(psEntry->nMode) &&
622628
(STARTS_WITH_CI(pszInsideFilename, "MTD_MSIL2A") ||
623629
STARTS_WITH_CI(pszInsideFilename, "MTD_MSIL1C") ||
624-
STARTS_WITH_CI(pszInsideFilename, "S2A_OPER_MTD_SAFL1B") ||
625-
STARTS_WITH_CI(pszInsideFilename, "S2B_OPER_MTD_SAFL1B") ||
626-
STARTS_WITH_CI(pszInsideFilename, "S2A_OPER_MTD_SAFL1C") ||
627-
STARTS_WITH_CI(pszInsideFilename, "S2B_OPER_MTD_SAFL1C") ||
628-
STARTS_WITH_CI(pszInsideFilename, "S2A_USER_MTD_SAFL2A") ||
629-
STARTS_WITH_CI(pszInsideFilename, "S2B_USER_MTD_SAFL2A")))
630+
IsS2Prefixed(pszInsideFilename, "_OPER_MTD_SAFL1B") ||
631+
IsS2Prefixed(pszInsideFilename, "_OPER_MTD_SAFL1C") ||
632+
IsS2Prefixed(pszInsideFilename, "_USER_MTD_SAFL2A") ||
633+
IsS2Prefixed(pszInsideFilename, "_USER_MTD_SAFL2A")))
630634
{
631635
osFilename = osFilename + "/" + psEntry->pszName;
632636
CPLDebug("SENTINEL2", "Trying %s", osFilename.c_str());
@@ -1751,8 +1755,7 @@ SENTINEL2GetMainMTDFilenameFromGranuleMTD(const char *pszFilename)
17511755
for (char **papszIter = papszContents; papszIter && *papszIter; ++papszIter)
17521756
{
17531757
if (strlen(*papszIter) >= strlen("S2A_XXXX_MTD") &&
1754-
(STARTS_WITH_CI(*papszIter, "S2A_") ||
1755-
STARTS_WITH_CI(*papszIter, "S2B_")) &&
1758+
IsS2Prefixed(*papszIter, "") &&
17561759
EQUALN(*papszIter + strlen("S2A_XXXX"), "_MTD", 4))
17571760
{
17581761
osMainMTD = CPLFormFilenameSafe(osTopDir, *papszIter, nullptr);

0 commit comments

Comments
 (0)