13#include "gdalcachedpixelaccessor.h"
21class GDALGeoLocDatasetAccessors
23 typedef class GDALGeoLocDatasetAccessors AccessorType;
25 GDALGeoLocTransformInfo *m_psTransform;
27 CPLStringList m_aosGTiffCreationOptions{};
29 GDALDataset *m_poGeolocTmpDataset =
nullptr;
30 GDALDataset *m_poBackmapTmpDataset =
nullptr;
31 GDALDataset *m_poBackmapWeightsTmpDataset =
nullptr;
33 GDALGeoLocDatasetAccessors(
const GDALGeoLocDatasetAccessors &) =
delete;
34 GDALGeoLocDatasetAccessors &
35 operator=(
const GDALGeoLocDatasetAccessors &) =
delete;
37 bool LoadGeoloc(
bool bIsRegularGrid);
40 static constexpr int TILE_SIZE = 256;
41 static constexpr int TILE_COUNT = 64;
43 GDALCachedPixelAccessor<double, TILE_SIZE, TILE_COUNT> geolocXAccessor;
44 GDALCachedPixelAccessor<double, TILE_SIZE, TILE_COUNT> geolocYAccessor;
45 GDALCachedPixelAccessor<float, TILE_SIZE, TILE_COUNT> backMapXAccessor;
46 GDALCachedPixelAccessor<float, TILE_SIZE, TILE_COUNT> backMapYAccessor;
47 GDALCachedPixelAccessor<float, TILE_SIZE, TILE_COUNT> backMapWeightAccessor;
49 explicit GDALGeoLocDatasetAccessors(GDALGeoLocTransformInfo *psTransform)
50 : m_psTransform(psTransform), geolocXAccessor(nullptr),
51 geolocYAccessor(nullptr), backMapXAccessor(nullptr),
52 backMapYAccessor(nullptr), backMapWeightAccessor(nullptr)
55 m_aosGTiffCreationOptions.
SetNameValue(
"INTERLEAVE",
"BAND");
57 CPLSPrintf(
"%d", TILE_SIZE));
59 CPLSPrintf(
"%d", TILE_SIZE));
62 ~GDALGeoLocDatasetAccessors();
64 bool Load(
bool bIsRegularGrid,
bool bUseQuadtree);
66 bool AllocateBackMap();
68 GDALDataset *GetBackmapDataset();
69 void FlushBackmapCaches();
71 static void ReleaseBackmapDataset(GDALDataset *)
75 void FreeWghtsBackMap();
82GDALGeoLocDatasetAccessors::~GDALGeoLocDatasetAccessors()
91 delete m_poGeolocTmpDataset;
92 delete m_poBackmapTmpDataset;
99bool GDALGeoLocDatasetAccessors::AllocateBackMap()
102 if (poDriver ==
nullptr)
109 m_poBackmapTmpDataset = poDriver->Create(
110 osBackmapTmpFilename.c_str(), m_psTransform->nBackMapWidth,
112 m_aosGTiffCreationOptions.
List());
113 if (m_poBackmapTmpDataset ==
nullptr)
122 backMapXAccessor.
SetBand(poBandX);
123 backMapYAccessor.
SetBand(poBandY);
129 m_poBackmapWeightsTmpDataset = poDriver->Create(
130 osBackmapWeightsTmpFilename.c_str(), m_psTransform->nBackMapWidth,
132 m_aosGTiffCreationOptions.
List());
133 if (m_poBackmapWeightsTmpDataset ==
nullptr)
149void GDALGeoLocDatasetAccessors::FreeWghtsBackMap()
151 if (m_poBackmapWeightsTmpDataset)
154 delete m_poBackmapWeightsTmpDataset;
155 m_poBackmapWeightsTmpDataset =
nullptr;
163GDALDataset *GDALGeoLocDatasetAccessors::GetBackmapDataset()
168 poBandY->SetNoDataValue(
double(INVALID_BMXY));
169 return m_poBackmapTmpDataset;
176void GDALGeoLocDatasetAccessors::FlushBackmapCaches()
186bool GDALGeoLocDatasetAccessors::Load(
bool bIsRegularGrid,
bool bUseQuadtree)
188 return LoadGeoloc(bIsRegularGrid) &&
189 ((bUseQuadtree && GDALGeoLocBuildQuadTree(m_psTransform)) ||
191 GDALGeoLoc<AccessorType>::GenerateBackMap(m_psTransform)));
198bool GDALGeoLocDatasetAccessors::LoadGeoloc(
bool bIsRegularGrid)
203 const int nXSize = m_psTransform->nGeoLocXSize;
204 const int nYSize = m_psTransform->nGeoLocYSize;
207 if (poDriver ==
nullptr)
214 m_poGeolocTmpDataset =
215 poDriver->Create(osGeolocTmpFilename.c_str(), nXSize, nYSize, 2,
217 if (m_poGeolocTmpDataset ==
nullptr)
235 if (padfTempX ==
nullptr || padfTempY ==
nullptr)
246 for (
int j = 0; j < nYSize; j++)
248 if (poXBand->RasterIO(
GF_Write, 0, j, nXSize, 1, padfTempX, nXSize,
261 for (
int i = 0; i < nXSize; i++)
263 if (poYBand->RasterIO(
GF_Write, i, 0, 1, nYSize, padfTempY, 1,
279 geolocXAccessor.
SetBand(poXBand);
280 geolocYAccessor.
SetBand(poYBand);
290 GDALGeoLoc<GDALGeoLocDatasetAccessors>::LoadGeolocFinish(m_psTransform);
char ** List()
Return list.
Definition cpl_string.h:614
CPLStringList & SetNameValue(const char *pszKey, const char *pszValue)
Set name=value entry in the list.
Definition cplstringlist.cpp:546
bool FlushCache()
Flush content of modified tiles and drop caches.
Definition gdalcachedpixelaccessor.h:266
void SetBand(GDALRasterBand *poBand)
Assign the raster band if not known at construction time.
Definition gdalcachedpixelaccessor.h:69
void ResetModifiedFlag()
Reset the modified flag for cached tiles.
Definition gdalcachedpixelaccessor.h:287
A set of associated raster bands, usually from one file.
Definition gdal_dataset.h:76
void MarkSuppressOnClose()
Set that the dataset must be deleted on close.
Definition gdaldataset.cpp:1918
GDALRasterBand * GetRasterBand(int)
Fetch a band object for a dataset.
Definition gdaldataset.cpp:1062
static GDALDriver * FromHandle(GDALDriverH hDriver)
Convert a GDALDriverH to a GDALDriver*.
Definition gdal_driver.h:317
virtual const char * GetDescription() const
Fetch object description.
Definition gdalmajorobject.cpp:61
virtual CPLErr SetNoDataValue(double dfNoData)
Set the no data value for this band.
Definition gdalrasterband.cpp:2641
static GDALRasterBand * FromHandle(GDALRasterBandH hBand)
Convert a GDALRasterBandH to a GDALRasterBand*.
Definition gdal_rasterband.h:652
std::string CPLGenerateTempFilenameSafe(const char *pszStem)
Generate temporary file name.
Definition cpl_path.cpp:1459
#define CPLFree
Alias of VSIFree().
Definition cpl_conv.h:90
std::string CPLResetExtensionSafe(const char *, const char *)
Replace the extension with the provided one.
Definition cpl_path.cpp:620
CPLErr
Error category.
Definition cpl_error.h:37
int VSIUnlink(const char *pszFilename)
Delete a file.
Definition cpl_vsil.cpp:712
#define VSI_MALLOC2_VERBOSE(nSize1, nSize2)
VSI_MALLOC2_VERBOSE.
Definition cpl_vsi.h:345
@ GDT_Float64
Definition gdal.h:60
@ GDT_Float32
Definition gdal.h:59
@ GF_Write
Definition gdal.h:127
@ GF_Read
Definition gdal.h:126
GDALDriverH GDALGetDriverByName(const char *)
Fetch a driver based on the short name.
Definition gdaldrivermanager.cpp:758
CPLErr GDALRasterIO(GDALRasterBandH hRBand, GDALRWFlag eRWFlag, int nDSXOff, int nDSYOff, int nDSXSize, int nDSYSize, void *pBuffer, int nBXSize, int nBYSize, GDALDataType eBDataType, int nPixelSpace, int nLineSpace)
Read/write a region of image data for this band.
Definition gdalrasterband.cpp:487