Le 11/05/2025 à 00:20, Michael Sumner via gdal-dev a écrit :
Hello, I have a question about safely re-casting a dataset to another, I want to use Multidim to re-orient an MDArray as a classic 2D raster. I was a bit surprised that this works (I just overwrite poSrcDS with the classic form):

I'm passing in 'osFilename', 'osArrayName' and two dimension indexes 'index_x' and 'index_y', the first "Open()" line is a literal copy from vrtdataset.cpp:


// I've removed all the nullptr checks from this code
auto poSrcDS = std::unique_ptr<GDALDataset, GDALDatasetUniquePtrReleaser>(
         GDALDataset::Open(osFilename, GDAL_OF_RASTER | GDAL_OF_VERBOSE_ERROR,
                          aosAllowedDrivers.List(), aosOpenOptions.List(),
                          nullptr));
// now open in mdim mode, and get the specified MDArray in Classic form with index_x,index_y auto poMDimDS = std::unique_ptr<GDALDataset>(GDALDataset::Open(osFilename, GDAL_OF_MULTIDIM_RASTER));
auto poMdimGroup = poMDimDS->GetRootGroup();
auto poArrayDS = poMdimGroup->OpenMDArrayFromFullname(osFilename);
auto poClassicDS = poArrayDS->AsClassicDataset(index_x, index_y);

// FIXME how to safely swap poSrcDS with poClassicDS
poSrcDS = std::unique_ptr<GDALDataset, GDALDatasetUniquePtrReleaser>(poClassicDS);

My question is about the last line where poClassic "replaces" poSrcDS: what am I responsible for to make that safe?

That's perfectly fine. In the mdim API, objects returned by GetRootGroup(), OpenMDArray(), AsClassicDataset(), etc. , keep the necessary parent objects alive through shared_ptr mechanism. Furthermore in your example, there is no relationship between poSrcDS et poClassicDS, so even if that wasn't the case, your final assignment would be still safe.

--
http://www.spatialys.com
My software is free, but my time generally not.
_______________________________________________
gdal-dev mailing list
gdal-dev@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/gdal-dev

Reply via email to