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 &
51 operator=(
const GDALGeoLocDatasetAccessors &) =
delete;
53 bool LoadGeoloc(
bool bIsRegularGrid);
56 static constexpr
int TILE_SIZE = 1024;
64 explicit GDALGeoLocDatasetAccessors(GDALGeoLocTransformInfo *psTransform)
65 : m_psTransform(psTransform), geolocXAccessor(nullptr),
66 geolocYAccessor(nullptr), backMapXAccessor(nullptr),
67 backMapYAccessor(nullptr), backMapWeightAccessor(nullptr)
69 m_aosGTiffCreationOptions.SetNameValue(
"TILED",
"YES");
70 m_aosGTiffCreationOptions.SetNameValue(
"INTERLEAVE",
"BAND");
71 m_aosGTiffCreationOptions.SetNameValue(
"BLOCKXSIZE",
73 m_aosGTiffCreationOptions.SetNameValue(
"BLOCKYSIZE",
77 ~GDALGeoLocDatasetAccessors();
79 bool Load(
bool bIsRegularGrid,
bool bUseQuadtree);
81 bool AllocateBackMap();
84 void FlushBackmapCaches();
89 void FreeWghtsBackMap();
96 GDALGeoLocDatasetAccessors::~GDALGeoLocDatasetAccessors()
105 delete m_poGeolocTmpDataset;
106 delete m_poBackmapTmpDataset;
113 bool GDALGeoLocDatasetAccessors::AllocateBackMap()
116 if (poDriver ==
nullptr)
119 m_poBackmapTmpDataset = poDriver->Create(
121 m_psTransform->nBackMapWidth, m_psTransform->nBackMapHeight, 2,
123 if (m_poBackmapTmpDataset ==
nullptr)
132 backMapXAccessor.
SetBand(poBandX);
133 backMapYAccessor.
SetBand(poBandY);
135 m_poBackmapWeightsTmpDataset = poDriver->Create(
137 m_psTransform->nBackMapWidth, m_psTransform->nBackMapHeight, 1,
139 if (m_poBackmapWeightsTmpDataset ==
nullptr)
155 void GDALGeoLocDatasetAccessors::FreeWghtsBackMap()
157 if (m_poBackmapWeightsTmpDataset)
160 delete m_poBackmapWeightsTmpDataset;
161 m_poBackmapWeightsTmpDataset =
nullptr;
169 GDALDataset *GDALGeoLocDatasetAccessors::GetBackmapDataset()
174 poBandY->SetNoDataValue(INVALID_BMXY);
175 return m_poBackmapTmpDataset;
182 void GDALGeoLocDatasetAccessors::FlushBackmapCaches()
192 bool GDALGeoLocDatasetAccessors::Load(
bool bIsRegularGrid,
bool bUseQuadtree)
194 return LoadGeoloc(bIsRegularGrid) &&
195 ((bUseQuadtree && GDALGeoLocBuildQuadTree(m_psTransform)) ||
197 GDALGeoLoc<AccessorType>::GenerateBackMap(m_psTransform)));
204 bool GDALGeoLocDatasetAccessors::LoadGeoloc(
bool bIsRegularGrid)
209 const int nXSize = m_psTransform->nGeoLocXSize;
210 const int nYSize = m_psTransform->nGeoLocYSize;
213 if (poDriver ==
nullptr)
216 m_poGeolocTmpDataset = poDriver->Create(
218 nYSize, 2,
GDT_Float64, m_aosGTiffCreationOptions.List());
219 if (m_poGeolocTmpDataset ==
nullptr)
237 if (padfTempX ==
nullptr || padfTempY ==
nullptr)
248 for (
int j = 0; j < nYSize; j++)
250 if (poXBand->RasterIO(
GF_Write, 0, j, nXSize, 1, padfTempX, nXSize,
263 for (
int i = 0; i < nXSize; i++)
265 if (poYBand->RasterIO(
GF_Write, i, 0, 1, nYSize, padfTempY, 1,
281 geolocXAccessor.
SetBand(poXBand);
282 geolocYAccessor.
SetBand(poYBand);
292 GDALGeoLoc<GDALGeoLocDatasetAccessors>::LoadGeolocFinish(m_psTransform);