diff --git a/frmts/stacit/stacitdataset.cpp b/frmts/stacit/stacitdataset.cpp index 043ba7845d9a..c52c709eb6f9 100644 --- a/frmts/stacit/stacitdataset.cpp +++ b/frmts/stacit/stacitdataset.cpp @@ -60,7 +60,7 @@ struct AssetSetByProjection struct Asset { std::string osName{}; - CPLJSONArray eoBands{}; + CPLJSONArray bands{}; std::map assets{}; }; @@ -140,7 +140,8 @@ int STACITDataset::Identify(GDALOpenInfo *poOpenInfo) } if (strstr(pszHeader, "\"stac_version\"") != nullptr && - strstr(pszHeader, "\"proj:transform\"") != nullptr) + (strstr(pszHeader, "\"proj:transform\"") != nullptr || + strstr(pszHeader, "\"proj:bbox\"") != nullptr)) { return true; } @@ -234,34 +235,43 @@ static void ParseAsset(const CPLJSONObject &jAsset, return oProperties[pszName]; }; - auto oProjEPSG = GetAssetOrFeatureProperty("proj:epsg"); std::string osProjUserString; - if (oProjEPSG.IsValid() && oProjEPSG.GetType() != CPLJSONObject::Type::Null) + auto oProjCode = GetAssetOrFeatureProperty("proj:code"); + if (oProjCode.IsValid() && oProjCode.GetType() != CPLJSONObject::Type::Null) { - osProjUserString = "EPSG:" + oProjEPSG.ToString(); + osProjUserString = oProjCode.ToString(); } else { - auto oProjWKT2 = GetAssetOrFeatureProperty("proj:wkt2"); - if (oProjWKT2.IsValid() && - oProjWKT2.GetType() == CPLJSONObject::Type::String) + auto oProjEPSG = GetAssetOrFeatureProperty("proj:epsg"); + if (oProjEPSG.IsValid() && + oProjEPSG.GetType() != CPLJSONObject::Type::Null) { - osProjUserString = oProjWKT2.ToString(); + osProjUserString = "EPSG:" + oProjEPSG.ToString(); } else { - auto oProjPROJJSON = GetAssetOrFeatureProperty("proj:projjson"); - if (oProjPROJJSON.IsValid() && - oProjPROJJSON.GetType() == CPLJSONObject::Type::Object) + auto oProjWKT2 = GetAssetOrFeatureProperty("proj:wkt2"); + if (oProjWKT2.IsValid() && + oProjWKT2.GetType() == CPLJSONObject::Type::String) { - osProjUserString = oProjPROJJSON.ToString(); + osProjUserString = oProjWKT2.ToString(); } else { - CPLDebug("STACIT", - "Skipping asset %s that lacks a valid CRS member", - osAssetName.c_str()); - return; + auto oProjPROJJSON = GetAssetOrFeatureProperty("proj:projjson"); + if (oProjPROJJSON.IsValid() && + oProjPROJJSON.GetType() == CPLJSONObject::Type::Object) + { + osProjUserString = oProjPROJJSON.ToString(); + } + else + { + CPLDebug("STACIT", + "Skipping asset %s that lacks a valid CRS member", + osAssetName.c_str()); + return; + } } } } @@ -396,7 +406,9 @@ static void ParseAsset(const CPLJSONObject &jAsset, { Asset asset; asset.osName = osAssetName; - asset.eoBands = jAsset.GetArray("eo:bands"); + asset.bands = jAsset.GetArray("bands"); + if (!asset.bands.IsValid()) + asset.bands = jAsset.GetArray("eo:bands"); collection.assets[osAssetName] = std::move(asset); } @@ -594,17 +606,19 @@ bool STACITDataset::SetupDataset( poVRTBand->SetColorInterpretation(eInterp); // Set band properties - if (asset.eoBands.IsValid() && - asset.eoBands.Size() == poItemDS->GetRasterCount()) + if (asset.bands.IsValid() && + asset.bands.Size() == poItemDS->GetRasterCount()) { - const auto &eoBand = asset.eoBands[i]; - const auto osBandName = eoBand["name"].ToString(); + const auto &band = asset.bands[i]; + const auto osBandName = band["name"].ToString(); if (!osBandName.empty()) poVRTBand->SetDescription(osBandName.c_str()); if (eInterp != GCI_Undefined) { - const auto osCommonName = eoBand["common_name"].ToString(); + auto osCommonName = band["eo:common_name"].ToString(); + if (osCommonName.empty()) + osCommonName = band["common_name"].ToString(); if (osCommonName == "red") poVRTBand->SetColorInterpretation(GCI_RedBand); else if (osCommonName == "green") @@ -615,13 +629,14 @@ bool STACITDataset::SetupDataset( poVRTBand->SetColorInterpretation(GCI_AlphaBand); } - for (const auto &eoBandChild : eoBand.GetChildren()) + for (const auto &bandChild : band.GetChildren()) { - const auto osChildName = eoBandChild.GetName(); - if (osChildName != "name" && osChildName != "common_name") + const auto osChildName = bandChild.GetName(); + if (osChildName != "name" && osChildName != "common_name" && + osChildName != "eo:common_name") { poVRTBand->SetMetadataItem(osChildName.c_str(), - eoBandChild.ToString().c_str()); + bandChild.ToString().c_str()); } } }