29 #include "gdalcachedpixelaccessor.h"
37 class GDALGeoLocDatasetAccessors
39 typedef class GDALGeoLocDatasetAccessors AccessorType;
41 static constexpr
int TILE_SIZE = 1024;
43 GDALGeoLocTransformInfo* m_psTransform;
49 GDALDataset* m_poBackmapWeightsTmpDataset =
nullptr;
51 GDALGeoLocDatasetAccessors(
const GDALGeoLocDatasetAccessors&) =
delete;
52 GDALGeoLocDatasetAccessors& operator= (
const GDALGeoLocDatasetAccessors&) =
delete;
54 bool LoadGeoloc(
bool bIsRegularGrid);
63 explicit GDALGeoLocDatasetAccessors(GDALGeoLocTransformInfo* psTransform):
64 m_psTransform(psTransform),
65 geolocXAccessor(nullptr),
66 geolocYAccessor(nullptr),
67 backMapXAccessor(nullptr),
68 backMapYAccessor(nullptr),
69 backMapWeightAccessor(nullptr)
71 m_aosGTiffCreationOptions.SetNameValue(
"TILED",
"YES");
72 m_aosGTiffCreationOptions.SetNameValue(
"INTERLEAVE",
"BAND");
73 m_aosGTiffCreationOptions.SetNameValue(
"BLOCKXSIZE",
CPLSPrintf(
"%d", TILE_SIZE));
74 m_aosGTiffCreationOptions.SetNameValue(
"BLOCKYSIZE",
CPLSPrintf(
"%d", TILE_SIZE));
77 ~GDALGeoLocDatasetAccessors();
79 bool Load(
bool bIsRegularGrid,
bool bUseQuadtree);
81 bool AllocateBackMap();
84 void FlushBackmapCaches();
87 void FreeWghtsBackMap();
94 GDALGeoLocDatasetAccessors::~GDALGeoLocDatasetAccessors()
103 delete m_poGeolocTmpDataset;
104 delete m_poBackmapTmpDataset;
111 bool GDALGeoLocDatasetAccessors::AllocateBackMap()
114 if( poDriver ==
nullptr )
117 m_poBackmapTmpDataset = poDriver->Create(
119 m_psTransform->nBackMapWidth,
120 m_psTransform->nBackMapHeight,
123 m_aosGTiffCreationOptions.List());
124 if( m_poBackmapTmpDataset ==
nullptr )
133 backMapXAccessor.
SetBand(poBandX);
134 backMapYAccessor.
SetBand(poBandY);
136 m_poBackmapWeightsTmpDataset = poDriver->Create(
138 m_psTransform->nBackMapWidth,
139 m_psTransform->nBackMapHeight,
142 m_aosGTiffCreationOptions.List());
143 if( m_poBackmapWeightsTmpDataset ==
nullptr )
158 void GDALGeoLocDatasetAccessors::FreeWghtsBackMap()
160 if( m_poBackmapWeightsTmpDataset )
163 delete m_poBackmapWeightsTmpDataset;
164 m_poBackmapWeightsTmpDataset =
nullptr;
172 GDALDataset* GDALGeoLocDatasetAccessors::GetBackmapDataset()
177 poBandY->SetNoDataValue(INVALID_BMXY);
178 return m_poBackmapTmpDataset;
185 void GDALGeoLocDatasetAccessors::FlushBackmapCaches()
195 bool GDALGeoLocDatasetAccessors::Load(
bool bIsRegularGrid,
bool bUseQuadtree)
197 return LoadGeoloc(bIsRegularGrid) &&
198 ((bUseQuadtree && GDALGeoLocBuildQuadTree(m_psTransform)) ||
199 (!bUseQuadtree && GDALGeoLoc<AccessorType>::GenerateBackMap(m_psTransform)));
206 bool GDALGeoLocDatasetAccessors::LoadGeoloc(
bool bIsRegularGrid)
211 const int nXSize = m_psTransform->nGeoLocXSize;
212 const int nYSize = m_psTransform->nGeoLocYSize;
215 if( poDriver ==
nullptr )
218 m_poGeolocTmpDataset = poDriver->Create(
224 m_aosGTiffCreationOptions.List());
225 if( m_poGeolocTmpDataset ==
nullptr )
239 double* padfTempX =
static_cast<double *
>(
241 double* padfTempY =
static_cast<double *
>(
243 if( padfTempX ==
nullptr || padfTempY ==
nullptr )
253 padfTempX, nXSize, 1,
256 for(
int j = 0; j < nYSize; j++ )
263 0, 0,
nullptr) != CE_None )
270 if( eErr == CE_None )
274 padfTempY, nYSize, 1,
277 for(
int i = 0; i < nXSize; i++ )
284 0, 0,
nullptr) != CE_None )
295 if( eErr != CE_None )
298 geolocXAccessor.
SetBand( poXBand );
299 geolocYAccessor.
SetBand( poYBand );
308 return GDALGeoLoc<GDALGeoLocDatasetAccessors>::LoadGeolocFinish(m_psTransform);