@@ -1524,18 +1524,17 @@ CPLErr ZarrDataset::FlushCache(bool bAtClosing)
15241524 auto poFirstBand = cpl::down_cast<ZarrRasterBand *>(papoBands[0 ]);
15251525 if (poFirstBand->m_dfNoData .has_value ())
15261526 {
1527- bool bSameNoDataValue = true ;
1528- for (int i = 1 ; bSameNoDataValue && i < nBands; ++i)
1527+ bool bSameValue = true ;
1528+ for (int i = 1 ; bSameValue && i < nBands; ++i)
15291529 {
15301530 auto poBand = cpl::down_cast<ZarrRasterBand *>(papoBands[i]);
1531- bSameNoDataValue =
1532- poBand->m_dfNoData .has_value () &&
1533- ((std::isnan (poFirstBand->m_dfNoData .value ()) &&
1534- std::isnan (poBand->m_dfNoData .value ())) ||
1535- (poFirstBand->m_dfNoData .value () ==
1536- poBand->m_dfNoData .value ()));
1531+ bSameValue = poBand->m_dfNoData .has_value () &&
1532+ ((std::isnan (poFirstBand->m_dfNoData .value ()) &&
1533+ std::isnan (poBand->m_dfNoData .value ())) ||
1534+ (poFirstBand->m_dfNoData .value () ==
1535+ poBand->m_dfNoData .value ()));
15371536 }
1538- if (!bSameNoDataValue )
1537+ if (!bSameValue )
15391538 {
15401539 CPLError (CE_Failure, CPLE_NotSupported,
15411540 " Not all bands have the same nodata value. It will be "
@@ -1551,15 +1550,15 @@ CPLErr ZarrDataset::FlushCache(bool bAtClosing)
15511550 }
15521551 else if (poFirstBand->m_nNoDataInt64 .has_value ())
15531552 {
1554- bool bSameNoDataValue = true ;
1555- for (int i = 1 ; bSameNoDataValue && i < nBands; ++i)
1553+ bool bSameValue = true ;
1554+ for (int i = 1 ; bSameValue && i < nBands; ++i)
15561555 {
15571556 auto poBand = cpl::down_cast<ZarrRasterBand *>(papoBands[i]);
1558- bSameNoDataValue = poBand->m_nNoDataInt64 .has_value () &&
1559- poFirstBand->m_nNoDataInt64 .value () ==
1560- poBand->m_nNoDataInt64 .value ();
1557+ bSameValue = poBand->m_nNoDataInt64 .has_value () &&
1558+ poFirstBand->m_nNoDataInt64 .value () ==
1559+ poBand->m_nNoDataInt64 .value ();
15611560 }
1562- if (!bSameNoDataValue )
1561+ if (!bSameValue )
15631562 {
15641563 CPLError (CE_Failure, CPLE_NotSupported,
15651564 " Not all bands have the same nodata value. It will be "
@@ -1575,15 +1574,15 @@ CPLErr ZarrDataset::FlushCache(bool bAtClosing)
15751574 }
15761575 else if (poFirstBand->m_nNoDataUInt64 .has_value ())
15771576 {
1578- bool bSameNoDataValue = true ;
1579- for (int i = 1 ; bSameNoDataValue && i < nBands; ++i)
1577+ bool bSameValue = true ;
1578+ for (int i = 1 ; bSameValue && i < nBands; ++i)
15801579 {
15811580 auto poBand = cpl::down_cast<ZarrRasterBand *>(papoBands[i]);
1582- bSameNoDataValue = poBand->m_nNoDataUInt64 .has_value () &&
1583- poFirstBand->m_nNoDataUInt64 .value () ==
1584- poBand->m_nNoDataUInt64 .value ();
1581+ bSameValue = poBand->m_nNoDataUInt64 .has_value () &&
1582+ poFirstBand->m_nNoDataUInt64 .value () ==
1583+ poBand->m_nNoDataUInt64 .value ();
15851584 }
1586- if (!bSameNoDataValue )
1585+ if (!bSameValue )
15871586 {
15881587 CPLError (CE_Failure, CPLE_NotSupported,
15891588 " Not all bands have the same nodata value. It will be "
@@ -1598,6 +1597,54 @@ CPLErr ZarrDataset::FlushCache(bool bAtClosing)
15981597 }
15991598 }
16001599
1600+ if (poFirstBand->m_dfOffset .has_value ())
1601+ {
1602+ bool bSameValue = true ;
1603+ for (int i = 1 ; bSameValue && i < nBands; ++i)
1604+ {
1605+ auto poBand = cpl::down_cast<ZarrRasterBand *>(papoBands[i]);
1606+ bSameValue = poBand->m_dfOffset .has_value () &&
1607+ poFirstBand->m_dfOffset .value () ==
1608+ poBand->m_dfOffset .value ();
1609+ }
1610+ if (!bSameValue)
1611+ {
1612+ CPLError (CE_Failure, CPLE_NotSupported,
1613+ " Not all bands have the same offset value. It will be "
1614+ " ignored as the array can only have a single offset "
1615+ " value for all bands." );
1616+ eErr = CE_Failure;
1617+ }
1618+ else
1619+ {
1620+ m_poSingleArray->SetOffset (poFirstBand->m_dfOffset .value ());
1621+ }
1622+ }
1623+
1624+ if (poFirstBand->m_dfScale .has_value ())
1625+ {
1626+ bool bSameValue = true ;
1627+ for (int i = 1 ; bSameValue && i < nBands; ++i)
1628+ {
1629+ auto poBand = cpl::down_cast<ZarrRasterBand *>(papoBands[i]);
1630+ bSameValue =
1631+ poBand->m_dfScale .has_value () &&
1632+ poFirstBand->m_dfScale .value () == poBand->m_dfScale .value ();
1633+ }
1634+ if (!bSameValue)
1635+ {
1636+ CPLError (CE_Failure, CPLE_NotSupported,
1637+ " Not all bands have the same scale value. It will be "
1638+ " ignored as the array can only have a single scale "
1639+ " value for all bands." );
1640+ eErr = CE_Failure;
1641+ }
1642+ else
1643+ {
1644+ m_poSingleArray->SetScale (poFirstBand->m_dfScale .value ());
1645+ }
1646+ }
1647+
16011648 bool bFoundColorInterp = false ;
16021649 for (int i = 0 ; i < nBands; ++i)
16031650 {
@@ -1985,6 +2032,12 @@ CPLErr ZarrRasterBand::SetNoDataValueAsUInt64(uint64_t nNoData)
19852032
19862033double ZarrRasterBand::GetOffset (int *pbSuccess)
19872034{
2035+ if (m_dfOffset.has_value ())
2036+ {
2037+ if (pbSuccess)
2038+ *pbSuccess = true ;
2039+ return m_dfOffset.value ();
2040+ }
19882041 bool bHasValue = false ;
19892042 double dfRet = m_poArray->GetOffset (&bHasValue);
19902043 if (pbSuccess)
@@ -1998,7 +2051,13 @@ double ZarrRasterBand::GetOffset(int *pbSuccess)
19982051
19992052CPLErr ZarrRasterBand::SetOffset (double dfNewOffset)
20002053{
2001- return m_poArray->SetOffset (dfNewOffset) ? CE_None : CE_Failure;
2054+ auto poGDS = cpl::down_cast<ZarrDataset *>(poDS);
2055+ if (!poGDS->m_poSingleArray )
2056+ {
2057+ return m_poArray->SetOffset (dfNewOffset) ? CE_None : CE_Failure;
2058+ }
2059+ m_dfOffset = dfNewOffset;
2060+ return CE_None;
20022061}
20032062
20042063/* ***********************************************************************/
@@ -2007,6 +2066,12 @@ CPLErr ZarrRasterBand::SetOffset(double dfNewOffset)
20072066
20082067double ZarrRasterBand::GetScale (int *pbSuccess)
20092068{
2069+ if (m_dfScale.has_value ())
2070+ {
2071+ if (pbSuccess)
2072+ *pbSuccess = true ;
2073+ return m_dfScale.value ();
2074+ }
20102075 bool bHasValue = false ;
20112076 double dfRet = m_poArray->GetScale (&bHasValue);
20122077 if (pbSuccess)
@@ -2020,7 +2085,13 @@ double ZarrRasterBand::GetScale(int *pbSuccess)
20202085
20212086CPLErr ZarrRasterBand::SetScale (double dfNewScale)
20222087{
2023- return m_poArray->SetScale (dfNewScale) ? CE_None : CE_Failure;
2088+ auto poGDS = cpl::down_cast<ZarrDataset *>(poDS);
2089+ if (!poGDS->m_poSingleArray )
2090+ {
2091+ return m_poArray->SetScale (dfNewScale) ? CE_None : CE_Failure;
2092+ }
2093+ m_dfScale = dfNewScale;
2094+ return CE_None;
20242095}
20252096
20262097/* ***********************************************************************/
0 commit comments