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);
50 template<
class Type>
struct CArrayAccessor
55 CArrayAccessor(Type* array,
size_t nXSize): m_array(array), m_nXSize(nXSize) {}
57 inline Type Get(
int nX,
int nY,
bool* pbSuccess =
nullptr)
61 return m_array[nY * m_nXSize + nX];
64 inline bool Set(
int nX,
int nY, Type val)
66 m_array[nY * m_nXSize + nX] = val;
71 CArrayAccessor<double> geolocXAccessor;
72 CArrayAccessor<double> geolocYAccessor;
73 CArrayAccessor<float> backMapXAccessor;
74 CArrayAccessor<float> backMapYAccessor;
75 CArrayAccessor<float> backMapWeightAccessor;
77 explicit GDALGeoLocCArrayAccessors(GDALGeoLocTransformInfo* psTransform):
78 m_psTransform(psTransform),
79 geolocXAccessor(nullptr, 0),
80 geolocYAccessor(nullptr, 0),
81 backMapXAccessor(nullptr, 0),
82 backMapYAccessor(nullptr, 0),
83 backMapWeightAccessor(nullptr, 0)
87 ~GDALGeoLocCArrayAccessors()
96 GDALGeoLocCArrayAccessors(
const GDALGeoLocCArrayAccessors&) =
delete;
97 GDALGeoLocCArrayAccessors& operator= (
const GDALGeoLocCArrayAccessors&) =
delete;
99 bool Load(
bool bIsRegularGrid,
bool bUseQuadtree);
101 bool AllocateBackMap();
104 static void FlushBackmapCaches() {}
105 static void ReleaseBackmapDataset(
GDALDataset* poDS) {
delete poDS; }
107 void FreeWghtsBackMap();
114 bool GDALGeoLocCArrayAccessors::AllocateBackMap()
116 m_pafBackMapX =
static_cast<float *
>(
118 m_psTransform->nBackMapHeight,
sizeof(
float)));
119 m_pafBackMapY =
static_cast<float *
>(
121 m_psTransform->nBackMapHeight,
sizeof(
float)));
123 m_wgtsBackMap =
static_cast<float *
>(
125 m_psTransform->nBackMapHeight,
sizeof(
float)));
127 if( m_pafBackMapX ==
nullptr ||
128 m_pafBackMapY ==
nullptr ||
129 m_wgtsBackMap ==
nullptr)
134 const size_t nBMXYCount =
static_cast<size_t>(m_psTransform->nBackMapWidth) *
135 m_psTransform->nBackMapHeight;
136 for(
size_t i = 0; i < nBMXYCount; i++ )
138 m_pafBackMapX[i] = 0;
139 m_pafBackMapY[i] = 0;
140 m_wgtsBackMap[i] = 0.0;
143 backMapXAccessor.m_array = m_pafBackMapX;
144 backMapXAccessor.m_nXSize = m_psTransform->nBackMapWidth;
146 backMapYAccessor.m_array = m_pafBackMapY;
147 backMapYAccessor.m_nXSize = m_psTransform->nBackMapWidth;
149 backMapWeightAccessor.m_array = m_wgtsBackMap;
150 backMapWeightAccessor.m_nXSize = m_psTransform->nBackMapWidth;
159 void GDALGeoLocCArrayAccessors::FreeWghtsBackMap()
162 m_wgtsBackMap =
nullptr;
163 backMapWeightAccessor.m_array =
nullptr;
164 backMapWeightAccessor.m_nXSize = 0;
171 GDALDataset* GDALGeoLocCArrayAccessors::GetBackmapDataset()
173 auto poMEMDS = MEMDataset::Create(
"",
174 m_psTransform->nBackMapWidth,
175 m_psTransform->nBackMapHeight,
178 for(
int i = 1; i <= 2; i++ )
180 void* ptr = (i == 1) ? m_pafBackMapX : m_pafBackMapY;
182 i,
static_cast<GByte*
>(ptr),
186 poMEMDS->AddMEMBand(hMEMBand);
187 poMEMDS->GetRasterBand(i)->SetNoDataValue(INVALID_BMXY);
196 bool GDALGeoLocCArrayAccessors::Load(
bool bIsRegularGrid,
bool bUseQuadtree)
198 return LoadGeoloc(bIsRegularGrid) &&
199 ((bUseQuadtree && GDALGeoLocBuildQuadTree(m_psTransform)) ||
200 (!bUseQuadtree && GDALGeoLoc<AccessorType>::GenerateBackMap(m_psTransform)));
207 bool GDALGeoLocCArrayAccessors::LoadGeoloc(
bool bIsRegularGrid)
210 const int nXSize = m_psTransform->nGeoLocXSize;
211 const int nYSize = m_psTransform->nGeoLocYSize;
213 m_padfGeoLocY =
static_cast<double *
>(
215 m_padfGeoLocX =
static_cast<double *
>(
218 if( m_padfGeoLocX ==
nullptr ||
219 m_padfGeoLocY ==
nullptr )
230 double* padfTempX =
static_cast<double *
>(
232 double* padfTempY =
static_cast<double *
>(
234 if( padfTempX ==
nullptr || padfTempY ==
nullptr )
244 padfTempX, nXSize, 1,
247 for(
size_t j = 0; j < static_cast<size_t>(nYSize); j++ )
249 memcpy( m_padfGeoLocX + j * nXSize,
251 nXSize *
sizeof(
double) );
254 if( eErr == CE_None )
258 padfTempY, nYSize, 1,
261 for(
size_t j = 0; j < static_cast<size_t>(nYSize); j++ )
263 for(
size_t i = 0; i < static_cast<size_t>(nXSize); i++ )
265 m_padfGeoLocY[j * nXSize + i] = padfTempY[j];
273 if( eErr != CE_None )
279 0, 0, nXSize, nYSize,
280 m_padfGeoLocX, nXSize, nYSize,
283 0, 0, nXSize, nYSize,
284 m_padfGeoLocY, nXSize, nYSize,
289 geolocXAccessor.m_array = m_padfGeoLocX;
290 geolocXAccessor.m_nXSize = m_psTransform->nGeoLocXSize;
292 geolocYAccessor.m_array = m_padfGeoLocY;
293 geolocYAccessor.m_nXSize = m_psTransform->nGeoLocXSize;
295 return GDALGeoLoc<GDALGeoLocCArrayAccessors>::LoadGeolocFinish(m_psTransform);