35 class GDALGeoLocCArrayAccessors
37 typedef class GDALGeoLocCArrayAccessors AccessorType;
39 GDALGeoLocTransformInfo *m_psTransform;
40 double *m_padfGeoLocX =
nullptr;
41 double *m_padfGeoLocY =
nullptr;
42 float *m_pafBackMapX =
nullptr;
43 float *m_pafBackMapY =
nullptr;
44 float *m_wgtsBackMap =
nullptr;
46 bool LoadGeoloc(
bool bIsRegularGrid);
49 template <
class Type>
struct CArrayAccessor
54 CArrayAccessor(Type *array,
size_t nXSize)
55 : m_array(array), m_nXSize(nXSize)
59 inline Type Get(
int nX,
int nY,
bool *pbSuccess =
nullptr)
63 return m_array[nY * m_nXSize + nX];
66 inline bool Set(
int nX,
int nY, Type val)
68 m_array[nY * m_nXSize + nX] = val;
73 CArrayAccessor<double> geolocXAccessor;
74 CArrayAccessor<double> geolocYAccessor;
75 CArrayAccessor<float> backMapXAccessor;
76 CArrayAccessor<float> backMapYAccessor;
77 CArrayAccessor<float> backMapWeightAccessor;
79 explicit GDALGeoLocCArrayAccessors(GDALGeoLocTransformInfo *psTransform)
80 : m_psTransform(psTransform), geolocXAccessor(nullptr, 0),
81 geolocYAccessor(nullptr, 0), backMapXAccessor(nullptr, 0),
82 backMapYAccessor(nullptr, 0), backMapWeightAccessor(nullptr, 0)
86 ~GDALGeoLocCArrayAccessors()
95 GDALGeoLocCArrayAccessors(
const GDALGeoLocCArrayAccessors &) =
delete;
96 GDALGeoLocCArrayAccessors &
97 operator=(
const GDALGeoLocCArrayAccessors &) =
delete;
99 bool Load(
bool bIsRegularGrid,
bool bUseQuadtree);
101 bool AllocateBackMap();
104 static void FlushBackmapCaches()
107 static void ReleaseBackmapDataset(
GDALDataset *poDS)
112 void FreeWghtsBackMap();
119 bool GDALGeoLocCArrayAccessors::AllocateBackMap()
121 m_pafBackMapX =
static_cast<float *
>(
123 m_psTransform->nBackMapHeight,
sizeof(
float)));
124 m_pafBackMapY =
static_cast<float *
>(
126 m_psTransform->nBackMapHeight,
sizeof(
float)));
128 m_wgtsBackMap =
static_cast<float *
>(
130 m_psTransform->nBackMapHeight,
sizeof(
float)));
132 if (m_pafBackMapX ==
nullptr || m_pafBackMapY ==
nullptr ||
133 m_wgtsBackMap ==
nullptr)
138 const size_t nBMXYCount =
139 static_cast<size_t>(m_psTransform->nBackMapWidth) *
140 m_psTransform->nBackMapHeight;
141 for (
size_t i = 0; i < nBMXYCount; i++)
143 m_pafBackMapX[i] = 0;
144 m_pafBackMapY[i] = 0;
145 m_wgtsBackMap[i] = 0.0;
148 backMapXAccessor.m_array = m_pafBackMapX;
149 backMapXAccessor.m_nXSize = m_psTransform->nBackMapWidth;
151 backMapYAccessor.m_array = m_pafBackMapY;
152 backMapYAccessor.m_nXSize = m_psTransform->nBackMapWidth;
154 backMapWeightAccessor.m_array = m_wgtsBackMap;
155 backMapWeightAccessor.m_nXSize = m_psTransform->nBackMapWidth;
164 void GDALGeoLocCArrayAccessors::FreeWghtsBackMap()
167 m_wgtsBackMap =
nullptr;
168 backMapWeightAccessor.m_array =
nullptr;
169 backMapWeightAccessor.m_nXSize = 0;
176 GDALDataset *GDALGeoLocCArrayAccessors::GetBackmapDataset()
178 auto poMEMDS = MEMDataset::Create(
"", m_psTransform->nBackMapWidth,
179 m_psTransform->nBackMapHeight, 0,
182 for (
int i = 1; i <= 2; i++)
184 void *ptr = (i == 1) ? m_pafBackMapX : m_pafBackMapY;
187 poMEMDS->AddMEMBand(hMEMBand);
188 poMEMDS->GetRasterBand(i)->SetNoDataValue(INVALID_BMXY);
197 bool GDALGeoLocCArrayAccessors::Load(
bool bIsRegularGrid,
bool bUseQuadtree)
199 return LoadGeoloc(bIsRegularGrid) &&
200 ((bUseQuadtree && GDALGeoLocBuildQuadTree(m_psTransform)) ||
202 GDALGeoLoc<AccessorType>::GenerateBackMap(m_psTransform)));
209 bool GDALGeoLocCArrayAccessors::LoadGeoloc(
bool bIsRegularGrid)
212 const int nXSize = m_psTransform->nGeoLocXSize;
213 const int nYSize = m_psTransform->nGeoLocYSize;
215 m_padfGeoLocY =
static_cast<double *
>(
217 m_padfGeoLocX =
static_cast<double *
>(
220 if (m_padfGeoLocX ==
nullptr || m_padfGeoLocY ==
nullptr)
235 if (padfTempX ==
nullptr || padfTempY ==
nullptr)
246 for (
size_t j = 0; j < static_cast<size_t>(nYSize); j++)
248 memcpy(m_padfGeoLocX + j * nXSize, padfTempX,
249 nXSize *
sizeof(
double));
257 for (
size_t j = 0; j < static_cast<size_t>(nYSize); j++)
259 for (
size_t i = 0; i < static_cast<size_t>(nXSize); i++)
261 m_padfGeoLocY[j * nXSize + i] = padfTempY[j];
283 geolocXAccessor.m_array = m_padfGeoLocX;
284 geolocXAccessor.m_nXSize = m_psTransform->nGeoLocXSize;
286 geolocYAccessor.m_array = m_padfGeoLocY;
287 geolocYAccessor.m_nXSize = m_psTransform->nGeoLocXSize;
289 GDALGeoLoc<GDALGeoLocCArrayAccessors>::LoadGeolocFinish(m_psTransform);