From f19a7a3d78f9dd3101fb4f390cfb44e1975f513c Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Wed, 4 Sep 2024 17:22:33 +0200 Subject: [PATCH 1/2] netCDF: make sure CreateMetadataFromOtherVars() doesn't set PAM dirty flag --- autotest/gdrivers/netcdf_multidim.py | 10 ++++++++++ frmts/netcdf/netcdfdataset.cpp | 3 +++ 2 files changed, 13 insertions(+) diff --git a/autotest/gdrivers/netcdf_multidim.py b/autotest/gdrivers/netcdf_multidim.py index c6134d376c07..a566cb900f3f 100755 --- a/autotest/gdrivers/netcdf_multidim.py +++ b/autotest/gdrivers/netcdf_multidim.py @@ -2096,6 +2096,9 @@ def test_netcdf_multidim_getcoordinatevariables(): def test_netcdf_multidim_getresampled_with_geoloc(): + if os.path.exists("data/netcdf/sentinel5p_fake.nc.aux.xml"): + os.unlink("data/netcdf/sentinel5p_fake.nc.aux.xml") + ds = gdal.OpenEx("data/netcdf/sentinel5p_fake.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() @@ -2118,6 +2121,8 @@ def test_netcdf_multidim_getresampled_with_geoloc(): warped_ds = gdal.Warp("", "data/netcdf/sentinel5p_fake.nc", format="MEM") assert warped_ds.ReadRaster() == resampled_ar.Read() + assert not os.path.exists("data/netcdf/sentinel5p_fake.nc.aux.xml") + def test_netcdf_multidim_cache(): @@ -3575,6 +3580,9 @@ def reopen(): def test_netcdf_multidim_getresampled_with_geoloc_EMIT_L2A(): + if os.path.exists("data/netcdf/fake_EMIT_L2A.nc.aux.xml"): + os.unlink("data/netcdf/fake_EMIT_L2A.nc.aux.xml") + ds = gdal.OpenEx("data/netcdf/fake_EMIT_L2A.nc", gdal.OF_MULTIDIM_RASTER) rg = ds.GetRootGroup() @@ -3770,6 +3778,8 @@ def test_netcdf_multidim_getresampled_with_geoloc_EMIT_L2A(): 20.0, ) + assert not os.path.exists("data/netcdf/fake_EMIT_L2A.nc.aux.xml") + def test_netcdf_multidim_getresampled_with_geoloc_EMIT_L2A_with_good_wavelengths(): diff --git a/frmts/netcdf/netcdfdataset.cpp b/frmts/netcdf/netcdfdataset.cpp index 343b30951285..e2dcce35dc6e 100644 --- a/frmts/netcdf/netcdfdataset.cpp +++ b/frmts/netcdf/netcdfdataset.cpp @@ -1965,6 +1965,7 @@ void netCDFRasterBand::CreateMetadataFromOtherVars() m_bCreateMetadataFromOtherVarsDone = true; netCDFDataset *l_poDS = reinterpret_cast(poDS); + const int nPamFlagsBackup = l_poDS->nPamFlags; // Compute all dimensions from Band number and save in Metadata. int nd = 0; @@ -2134,6 +2135,8 @@ void netCDFRasterBand::CreateMetadataFromOtherVars() Taken += result * Sum; } // End loop non-spatial dimensions. + + l_poDS->nPamFlags = nPamFlagsBackup; } /************************************************************************/ From 4bb6d164867efb87a01183f0600423cc8f6e64c2 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Wed, 4 Sep 2024 17:29:00 +0200 Subject: [PATCH 2/2] Multidim: AsClassicDataset(): make it able to retrieve dataset metadata from PAM --- autotest/gdrivers/netcdf_multidim.py | 43 ++++++++++++++++++++++++++++ gcore/gdalmultidim.cpp | 6 ++++ 2 files changed, 49 insertions(+) diff --git a/autotest/gdrivers/netcdf_multidim.py b/autotest/gdrivers/netcdf_multidim.py index a566cb900f3f..46c347a42d99 100755 --- a/autotest/gdrivers/netcdf_multidim.py +++ b/autotest/gdrivers/netcdf_multidim.py @@ -4126,3 +4126,46 @@ def test_netcdf_multidim_chunk_cache_options(): "CHUNK_SLOTS": "1000", "PREEMPTION": "0.900000", } + + +############################################################################### + + +def test_netcdf_multidim_as_classic_dataset_metadata(): + def set_metadata(): + ds = gdal.OpenEx( + "data/netcdf/fake_EMIT_L2A_with_good_wavelengths.nc", + gdal.OF_MULTIDIM_RASTER, + ) + rg = ds.GetRootGroup() + ar = rg.OpenMDArray("reflectance") + resampled_ar = ar.GetResampled( + [None, None, None], gdal.GRIORA_NearestNeighbour, None + ) + assert resampled_ar is not None + classic_ds = ar.AsClassicDataset(1, 0) + classic_ds.SetMetadataItem("foo", "bar") + + def check_metadata(): + ds = gdal.OpenEx( + "data/netcdf/fake_EMIT_L2A_with_good_wavelengths.nc", + gdal.OF_MULTIDIM_RASTER, + ) + rg = ds.GetRootGroup() + ar = rg.OpenMDArray("reflectance") + resampled_ar = ar.GetResampled( + [None, None, None], gdal.GRIORA_NearestNeighbour, None + ) + assert resampled_ar is not None + classic_ds = ar.AsClassicDataset(1, 0) + assert classic_ds.GetMetadataItem("foo") == "bar" + + pam_filename = "data/netcdf/fake_EMIT_L2A_with_good_wavelengths.nc.aux.xml" + if os.path.exists(pam_filename): + os.unlink(pam_filename) + + set_metadata() + check_metadata() + + assert os.path.exists(pam_filename) + os.unlink(pam_filename) diff --git a/gcore/gdalmultidim.cpp b/gcore/gdalmultidim.cpp index 3e344ae98623..b46bf17780fe 100644 --- a/gcore/gdalmultidim.cpp +++ b/gcore/gdalmultidim.cpp @@ -9500,6 +9500,12 @@ GDALDatasetFromArray *GDALDatasetFromArray::Create( } poDS->SetDerivedDatasetName(osDerivedDatasetName.c_str()); poDS->TryLoadXML(); + + for (const auto &[pszKey, pszValue] : cpl::IterateNameValue( + CSLConstList(poDS->GDALPamDataset::GetMetadata()))) + { + poDS->m_oMDD.SetMetadataItem(pszKey, pszValue); + } } return poDS.release();