diff --git a/autotest/gdrivers/netcdf.py b/autotest/gdrivers/netcdf.py index fc97d9b92b6f..21c0b3026ca6 100755 --- a/autotest/gdrivers/netcdf.py +++ b/autotest/gdrivers/netcdf.py @@ -6544,7 +6544,7 @@ def test_netcdf_create_metadata_with_equal_sign(tmp_path): # Test force opening a HDF55 file with netCDF driver -def test_netcdf_force_opening_hdf5_file(tmp_vsimem): +def test_netcdf_force_opening_hdf5_file(): ds = gdal.OpenEx("data/hdf5/groups.h5", allowed_drivers=["netCDF"]) assert ds.GetDriver().GetDescription() == "netCDF" @@ -6561,3 +6561,25 @@ def test_netcdf_force_opening_no_match(): drv = gdal.IdentifyDriverEx("data/byte.tif", allowed_drivers=["netCDF"]) assert drv is None + + +############################################################################### + + +def test_netcdf_extra_dim_no_georef(tmp_path): + + fname = tmp_path / "out.nc" + + src_ds = gdal.Translate("", "../gcore/data/stefan_full_rgba.tif", format="MEM") + size_z = 4 + src_ds.SetMetadataItem("NETCDF_DIM_EXTRA", "{Z}") + src_ds.SetMetadataItem("NETCDF_DIM_Z_DEF", f"{{{size_z},4}}") + src_ds.SetMetadataItem("NETCDF_DIM_Z_VALUES", "{0,1,2,3}") + src_ds.SetMetadataItem("Z#axis", "Z") + + # Create netCDF file + gdal.GetDriverByName("netCDF").CreateCopy(fname, src_ds) + + ds = gdal.Open(fname) + assert ds.RasterCount == 4 + assert ds.ReadRaster() == src_ds.ReadRaster() diff --git a/frmts/netcdf/netcdfdataset.cpp b/frmts/netcdf/netcdfdataset.cpp index 4599ae267bc2..5619568c1864 100644 --- a/frmts/netcdf/netcdfdataset.cpp +++ b/frmts/netcdf/netcdfdataset.cpp @@ -9610,11 +9610,6 @@ netCDFDataset::CreateCopy(const char *pszFilename, GDALDataset *poSrcDS, pScaledProgress = GDALCreateScaledProgress(0.1, 0.25, pfnProgress, pProgressData); poDS->AddProjectionVars(false, GDALScaledProgress, pScaledProgress); - // Save X,Y dim positions. - panDimIds[nDim - 1] = poDS->nXDimID; - panBandDimPos[0] = nDim - 1; - panDimIds[nDim - 2] = poDS->nYDimID; - panBandDimPos[1] = nDim - 2; GDALDestroyScaledProgress(pScaledProgress); } else @@ -9628,6 +9623,12 @@ netCDFDataset::CreateCopy(const char *pszFilename, GDALDataset *poSrcDS, } } + // Save X,Y dim positions. + panDimIds[nDim - 1] = poDS->nXDimID; + panBandDimPos[0] = nDim - 1; + panDimIds[nDim - 2] = poDS->nYDimID; + panBandDimPos[1] = nDim - 2; + // Write extra dim values - after projection for optimization. if (nDim > 2) {