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();
105 static void FlushBackmapCaches()
109 static void ReleaseBackmapDataset(
GDALDataset *poDS)
114 void FreeWghtsBackMap();
121 bool GDALGeoLocCArrayAccessors::AllocateBackMap()
123 m_pafBackMapX =
static_cast<float *
>(
125 m_psTransform->nBackMapHeight,
sizeof(
float)));
126 m_pafBackMapY =
static_cast<float *
>(
128 m_psTransform->nBackMapHeight,
sizeof(
float)));
130 m_wgtsBackMap =
static_cast<float *
>(
132 m_psTransform->nBackMapHeight,
sizeof(
float)));
134 if (m_pafBackMapX ==
nullptr || m_pafBackMapY ==
nullptr ||
135 m_wgtsBackMap ==
nullptr)
140 const size_t nBMXYCount =
141 static_cast<size_t>(m_psTransform->nBackMapWidth) *
142 m_psTransform->nBackMapHeight;
143 for (
size_t i = 0; i < nBMXYCount; i++)
145 m_pafBackMapX[i] = 0;
146 m_pafBackMapY[i] = 0;
147 m_wgtsBackMap[i] = 0.0;
150 backMapXAccessor.m_array = m_pafBackMapX;
151 backMapXAccessor.m_nXSize = m_psTransform->nBackMapWidth;
153 backMapYAccessor.m_array = m_pafBackMapY;
154 backMapYAccessor.m_nXSize = m_psTransform->nBackMapWidth;
156 backMapWeightAccessor.m_array = m_wgtsBackMap;
157 backMapWeightAccessor.m_nXSize = m_psTransform->nBackMapWidth;
166 void GDALGeoLocCArrayAccessors::FreeWghtsBackMap()
169 m_wgtsBackMap =
nullptr;
170 backMapWeightAccessor.m_array =
nullptr;
171 backMapWeightAccessor.m_nXSize = 0;
178 GDALDataset *GDALGeoLocCArrayAccessors::GetBackmapDataset()
180 auto poMEMDS = MEMDataset::Create(
"", m_psTransform->nBackMapWidth,
181 m_psTransform->nBackMapHeight, 0,
184 for (
int i = 1; i <= 2; i++)
186 void *ptr = (i == 1) ? m_pafBackMapX : m_pafBackMapY;
189 poMEMDS->AddMEMBand(hMEMBand);
190 poMEMDS->GetRasterBand(i)->SetNoDataValue(INVALID_BMXY);
199 bool GDALGeoLocCArrayAccessors::Load(
bool bIsRegularGrid,
bool bUseQuadtree)
201 return LoadGeoloc(bIsRegularGrid) &&
202 ((bUseQuadtree && GDALGeoLocBuildQuadTree(m_psTransform)) ||
204 GDALGeoLoc<AccessorType>::GenerateBackMap(m_psTransform)));
211 bool GDALGeoLocCArrayAccessors::LoadGeoloc(
bool bIsRegularGrid)
214 const int nXSize = m_psTransform->nGeoLocXSize;
215 const int nYSize = m_psTransform->nGeoLocYSize;
217 m_padfGeoLocY =
static_cast<double *
>(
219 m_padfGeoLocX =
static_cast<double *
>(
222 if (m_padfGeoLocX ==
nullptr || m_padfGeoLocY ==
nullptr)
237 if (padfTempX ==
nullptr || padfTempY ==
nullptr)
248 for (
size_t j = 0; j < static_cast<size_t>(nYSize); j++)
250 memcpy(m_padfGeoLocX + j * nXSize, padfTempX,
251 nXSize *
sizeof(
double));
259 for (
size_t j = 0; j < static_cast<size_t>(nYSize); j++)
261 for (
size_t i = 0; i < static_cast<size_t>(nXSize); i++)
263 m_padfGeoLocY[j * nXSize + i] = padfTempY[j];
285 geolocXAccessor.m_array = m_padfGeoLocX;
286 geolocXAccessor.m_nXSize = m_psTransform->nGeoLocXSize;
288 geolocYAccessor.m_array = m_padfGeoLocY;
289 geolocYAccessor.m_nXSize = m_psTransform->nGeoLocXSize;
291 GDALGeoLoc<GDALGeoLocCArrayAccessors>::LoadGeolocFinish(m_psTransform);
A set of associated raster bands, usually from one file.
Definition: gdal_priv.h:503
#define CPLFree
Alias of VSIFree()
Definition: cpl_conv.h:98
CPLErr
Error category.
Definition: cpl_error.h:53
unsigned char GByte
Unsigned byte type.
Definition: cpl_port.h:185
#define VSI_MALLOC3_VERBOSE(nSize1, nSize2, nSize3)
VSI_MALLOC3_VERBOSE.
Definition: cpl_vsi.h:363
#define VSI_MALLOC2_VERBOSE(nSize1, nSize2)
VSI_MALLOC2_VERBOSE.
Definition: cpl_vsi.h:355
void VSIFree(void *)
Analog of free() for data allocated with VSIMalloc(), VSICalloc(), VSIRealloc()
Definition: cpl_vsisimple.cpp:844
@ GDT_Float64
Definition: gdal.h:75
@ GDT_Float32
Definition: gdal.h:74
@ GF_Read
Definition: gdal.h:133
void * GDALRasterBandH
Opaque type used for the C bindings of the C++ GDALRasterBand class.
Definition: gdal.h:294
CPLErr GDALRasterIO(GDALRasterBandH hRBand, GDALRWFlag eRWFlag, int nDSXOff, int nDSYOff, int nDSXSize, int nDSYSize, void *pBuffer, int nBXSize, int nBYSize, GDALDataType eBDataType, int nPixelSpace, int nLineSpace)
Read/write a region of image data for this band.
Definition: gdalrasterband.cpp:449