29 #include "gdalcachedpixelaccessor.h"
37 class GDALGeoLocDatasetAccessors
39 typedef class GDALGeoLocDatasetAccessors AccessorType;
41 GDALGeoLocTransformInfo* m_psTransform;
47 GDALDataset* m_poBackmapWeightsTmpDataset =
nullptr;
49 GDALGeoLocDatasetAccessors(
const GDALGeoLocDatasetAccessors&) =
delete;
50 GDALGeoLocDatasetAccessors& operator= (
const GDALGeoLocDatasetAccessors&) =
delete;
52 bool LoadGeoloc(
bool bIsRegularGrid);
56 static constexpr
int TILE_SIZE = 1024;
64 explicit GDALGeoLocDatasetAccessors(GDALGeoLocTransformInfo* psTransform):
65 m_psTransform(psTransform),
66 geolocXAccessor(nullptr),
67 geolocYAccessor(nullptr),
68 backMapXAccessor(nullptr),
69 backMapYAccessor(nullptr),
70 backMapWeightAccessor(nullptr)
72 m_aosGTiffCreationOptions.SetNameValue(
"TILED",
"YES");
73 m_aosGTiffCreationOptions.SetNameValue(
"INTERLEAVE",
"BAND");
74 m_aosGTiffCreationOptions.SetNameValue(
"BLOCKXSIZE",
CPLSPrintf(
"%d", TILE_SIZE));
75 m_aosGTiffCreationOptions.SetNameValue(
"BLOCKYSIZE",
CPLSPrintf(
"%d", TILE_SIZE));
78 ~GDALGeoLocDatasetAccessors();
80 bool Load(
bool bIsRegularGrid,
bool bUseQuadtree);
82 bool AllocateBackMap();
85 void FlushBackmapCaches();
88 void FreeWghtsBackMap();
95 GDALGeoLocDatasetAccessors::~GDALGeoLocDatasetAccessors()
104 delete m_poGeolocTmpDataset;
105 delete m_poBackmapTmpDataset;
112 bool GDALGeoLocDatasetAccessors::AllocateBackMap()
115 if( poDriver ==
nullptr )
118 m_poBackmapTmpDataset = poDriver->Create(
120 m_psTransform->nBackMapWidth,
121 m_psTransform->nBackMapHeight,
124 m_aosGTiffCreationOptions.List());
125 if( m_poBackmapTmpDataset ==
nullptr )
134 backMapXAccessor.
SetBand(poBandX);
135 backMapYAccessor.
SetBand(poBandY);
137 m_poBackmapWeightsTmpDataset = poDriver->Create(
139 m_psTransform->nBackMapWidth,
140 m_psTransform->nBackMapHeight,
143 m_aosGTiffCreationOptions.List());
144 if( m_poBackmapWeightsTmpDataset ==
nullptr )
159 void GDALGeoLocDatasetAccessors::FreeWghtsBackMap()
161 if( m_poBackmapWeightsTmpDataset )
164 delete m_poBackmapWeightsTmpDataset;
165 m_poBackmapWeightsTmpDataset =
nullptr;
173 GDALDataset* GDALGeoLocDatasetAccessors::GetBackmapDataset()
178 poBandY->SetNoDataValue(INVALID_BMXY);
179 return m_poBackmapTmpDataset;
186 void GDALGeoLocDatasetAccessors::FlushBackmapCaches()
196 bool GDALGeoLocDatasetAccessors::Load(
bool bIsRegularGrid,
bool bUseQuadtree)
198 return LoadGeoloc(bIsRegularGrid) &&
199 ((bUseQuadtree && GDALGeoLocBuildQuadTree(m_psTransform)) ||
200 (!bUseQuadtree && GDALGeoLoc<AccessorType>::GenerateBackMap(m_psTransform)));
207 bool GDALGeoLocDatasetAccessors::LoadGeoloc(
bool bIsRegularGrid)
212 const int nXSize = m_psTransform->nGeoLocXSize;
213 const int nYSize = m_psTransform->nGeoLocYSize;
216 if( poDriver ==
nullptr )
219 m_poGeolocTmpDataset = poDriver->Create(
225 m_aosGTiffCreationOptions.List());
226 if( m_poGeolocTmpDataset ==
nullptr )
240 double* padfTempX =
static_cast<double *
>(
242 double* padfTempY =
static_cast<double *
>(
244 if( padfTempX ==
nullptr || padfTempY ==
nullptr )
254 padfTempX, nXSize, 1,
257 for(
int j = 0; j < nYSize; j++ )
264 0, 0,
nullptr) != CE_None )
271 if( eErr == CE_None )
275 padfTempY, nYSize, 1,
278 for(
int i = 0; i < nXSize; i++ )
285 0, 0,
nullptr) != CE_None )
296 if( eErr != CE_None )
299 geolocXAccessor.
SetBand( poXBand );
300 geolocYAccessor.
SetBand( poYBand );
309 return GDALGeoLoc<GDALGeoLocDatasetAccessors>::LoadGeolocFinish(m_psTransform);