19class GDALGeoLocCArrayAccessors
21 typedef class GDALGeoLocCArrayAccessors AccessorType;
23 GDALGeoLocTransformInfo *m_psTransform;
24 double *m_padfGeoLocX =
nullptr;
25 double *m_padfGeoLocY =
nullptr;
26 float *m_pafBackMapX =
nullptr;
27 float *m_pafBackMapY =
nullptr;
28 float *m_wgtsBackMap =
nullptr;
30 bool LoadGeoloc(
bool bIsRegularGrid);
33 template <
class Type>
struct CArrayAccessor
38 CArrayAccessor(Type *array,
size_t nXSize)
39 : m_array(array), m_nXSize(nXSize)
43 inline Type Get(
int nX,
int nY,
bool *pbSuccess =
nullptr)
47 return m_array[nY * m_nXSize + nX];
50 inline bool Set(
int nX,
int nY, Type val)
52 m_array[nY * m_nXSize + nX] = val;
57 CArrayAccessor<double> geolocXAccessor;
58 CArrayAccessor<double> geolocYAccessor;
59 CArrayAccessor<float> backMapXAccessor;
60 CArrayAccessor<float> backMapYAccessor;
61 CArrayAccessor<float> backMapWeightAccessor;
63 explicit GDALGeoLocCArrayAccessors(GDALGeoLocTransformInfo *psTransform)
64 : m_psTransform(psTransform), geolocXAccessor(nullptr, 0),
65 geolocYAccessor(nullptr, 0), backMapXAccessor(nullptr, 0),
66 backMapYAccessor(nullptr, 0), backMapWeightAccessor(nullptr, 0)
70 ~GDALGeoLocCArrayAccessors()
79 GDALGeoLocCArrayAccessors(
const GDALGeoLocCArrayAccessors &) =
delete;
80 GDALGeoLocCArrayAccessors &
81 operator=(
const GDALGeoLocCArrayAccessors &) =
delete;
83 bool Load(
bool bIsRegularGrid,
bool bUseQuadtree);
85 bool AllocateBackMap();
89 static void FlushBackmapCaches()
93 static void ReleaseBackmapDataset(
GDALDataset *poDS)
98 void FreeWghtsBackMap();
105bool GDALGeoLocCArrayAccessors::AllocateBackMap()
107 m_pafBackMapX =
static_cast<float *
>(
109 m_psTransform->nBackMapHeight,
sizeof(
float)));
110 m_pafBackMapY =
static_cast<float *
>(
112 m_psTransform->nBackMapHeight,
sizeof(
float)));
114 m_wgtsBackMap =
static_cast<float *
>(
116 m_psTransform->nBackMapHeight,
sizeof(
float)));
118 if (m_pafBackMapX ==
nullptr || m_pafBackMapY ==
nullptr ||
119 m_wgtsBackMap ==
nullptr)
124 const size_t nBMXYCount =
125 static_cast<size_t>(m_psTransform->nBackMapWidth) *
126 m_psTransform->nBackMapHeight;
127 for (
size_t i = 0; i < nBMXYCount; i++)
129 m_pafBackMapX[i] = 0;
130 m_pafBackMapY[i] = 0;
131 m_wgtsBackMap[i] = 0.0;
134 backMapXAccessor.m_array = m_pafBackMapX;
135 backMapXAccessor.m_nXSize = m_psTransform->nBackMapWidth;
137 backMapYAccessor.m_array = m_pafBackMapY;
138 backMapYAccessor.m_nXSize = m_psTransform->nBackMapWidth;
140 backMapWeightAccessor.m_array = m_wgtsBackMap;
141 backMapWeightAccessor.m_nXSize = m_psTransform->nBackMapWidth;
150void GDALGeoLocCArrayAccessors::FreeWghtsBackMap()
153 m_wgtsBackMap =
nullptr;
154 backMapWeightAccessor.m_array =
nullptr;
155 backMapWeightAccessor.m_nXSize = 0;
162GDALDataset *GDALGeoLocCArrayAccessors::GetBackmapDataset()
164 auto poMEMDS = MEMDataset::Create(
"", m_psTransform->nBackMapWidth,
165 m_psTransform->nBackMapHeight, 0,
168 for (
int i = 1; i <= 2; i++)
170 void *ptr = (i == 1) ? m_pafBackMapX : m_pafBackMapY;
173 poMEMDS->AddMEMBand(hMEMBand);
174 poMEMDS->GetRasterBand(i)->SetNoDataValue(INVALID_BMXY);
183bool GDALGeoLocCArrayAccessors::Load(
bool bIsRegularGrid,
bool bUseQuadtree)
185 return LoadGeoloc(bIsRegularGrid) &&
186 ((bUseQuadtree && GDALGeoLocBuildQuadTree(m_psTransform)) ||
188 GDALGeoLoc<AccessorType>::GenerateBackMap(m_psTransform)));
195bool GDALGeoLocCArrayAccessors::LoadGeoloc(
bool bIsRegularGrid)
198 const int nXSize = m_psTransform->nGeoLocXSize;
199 const int nYSize = m_psTransform->nGeoLocYSize;
201 m_padfGeoLocY =
static_cast<double *
>(
203 m_padfGeoLocX =
static_cast<double *
>(
206 if (m_padfGeoLocX ==
nullptr || m_padfGeoLocY ==
nullptr)
221 if (padfTempX ==
nullptr || padfTempY ==
nullptr)
232 for (
size_t j = 0; j < static_cast<size_t>(nYSize); j++)
234 memcpy(m_padfGeoLocX + j * nXSize, padfTempX,
235 nXSize *
sizeof(
double));
243 for (
size_t j = 0; j < static_cast<size_t>(nYSize); j++)
245 for (
size_t i = 0; i < static_cast<size_t>(nXSize); i++)
247 m_padfGeoLocY[j * nXSize + i] = padfTempY[j];
269 geolocXAccessor.m_array = m_padfGeoLocX;
270 geolocXAccessor.m_nXSize = m_psTransform->nGeoLocXSize;
272 geolocYAccessor.m_array = m_padfGeoLocY;
273 geolocYAccessor.m_nXSize = m_psTransform->nGeoLocXSize;
275 GDALGeoLoc<GDALGeoLocCArrayAccessors>::LoadGeolocFinish(m_psTransform);
A set of associated raster bands, usually from one file.
Definition: gdal_priv.h:495
#define CPLFree
Alias of VSIFree()
Definition: cpl_conv.h:82
CPLErr
Error category.
Definition: cpl_error.h:37
unsigned char GByte
Unsigned byte type.
Definition: cpl_port.h:169
#define VSI_MALLOC3_VERBOSE(nSize1, nSize2, nSize3)
VSI_MALLOC3_VERBOSE.
Definition: cpl_vsi.h:347
#define VSI_MALLOC2_VERBOSE(nSize1, nSize2)
VSI_MALLOC2_VERBOSE.
Definition: cpl_vsi.h:339
void VSIFree(void *)
Analog of free() for data allocated with VSIMalloc(), VSICalloc(), VSIRealloc()
Definition: cpl_vsisimple.cpp:828
@ GDT_Float64
Definition: gdal.h:59
@ GDT_Float32
Definition: gdal.h:58
@ GF_Read
Definition: gdal.h:118
void * GDALRasterBandH
Opaque type used for the C bindings of the C++ GDALRasterBand class.
Definition: gdal.h:379
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:457