1#include "GdalIoHandler.h"
5#include "CubeCachingAlgorithm.h"
9#include "SpecialPixel.h"
20 GdalIoHandler::GdalIoHandler(QString &dataFilePath,
const QList<int> *virtualBandList, GDALDataType pixelType, GDALAccess eAccess) :
22 m_geodataSetPath = dataFilePath.toUtf8().constData();
23 m_geodataSet = GDALDataset::FromHandle(GDALOpen(m_geodataSetPath.c_str(), eAccess));
24 m_datasetOwner =
true;
25 m_pixelType = pixelType;
29 GdalIoHandler::GdalIoHandler(GDALDataset *geodataSet,
const QList<int> *virtualBandList, GDALDataType pixelType) :
30 ImageIoHandler(virtualBandList) {
31 m_geodataSet = geodataSet;
33 QString msg =
"Constructing GdalIoHandler failed. Null geodataSet pointer passed";
34 throw IException(IException::Programmer, msg, _FILEINFO_);
36 m_datasetOwner =
false;
37 m_pixelType = pixelType;
41 void GdalIoHandler::init() {
42 m_samples = m_geodataSet->GetRasterXSize();
43 m_lines = m_geodataSet->GetRasterYSize();
44 m_bands = m_geodataSet->GetRasterCount();
46 m_driverName = std::string(m_geodataSet->GetDriverName());
49 if ((m_geodataSet->GetAccess() == GA_Update) && (m_driverName !=
"ISIS3")) {
50 for (
int i = 1; i <= m_bands; i++) {
51 GDALRasterBand *band = m_geodataSet->GetRasterBand(i);
52 band->CreateMaskBand(GMF_ALPHA);
53 band->GetMaskBand()->Fill(255);
57 GDALRasterBand *band = m_geodataSet->GetRasterBand(1);
58 m_offset = band->GetOffset();
59 m_scale = band->GetScale();
60 int *pbSuccess =
new int;
61 m_gdalNoDataValue = band->GetNoDataValue(pbSuccess);
63 m_gdalNoDataValue = NULL8;
68 GdalIoHandler::~GdalIoHandler() {
73 if (m_geodataSet && m_datasetOwner) {
74 m_geodataSet->Close();
78 void GdalIoHandler::read(Buffer &bufferToFill)
const {
79 GDALRasterBand *poBand;
82 int maxBand = bufferToFill.BandDimension() + bufferToFill.Band() - 1;
83 for (
int band = bufferToFill.Band(); band <= maxBand; band++) {
86 vband = m_virtualBands->at(band - 1);
88 if (vband > m_bands) {
92 poBand = m_geodataSet->GetRasterBand(vband);
96 int lineStart = bufferToFill.Line() - 1;
97 int sampleStart = bufferToFill.Sample() - 1;
98 int lineSize = bufferToFill.LineDimension();
99 int sampleSize = bufferToFill.SampleDimension();
102 bool outOfBounds =
false;
107 if (lineStart + lineSize > m_lines) {
108 lineSize = m_lines - lineStart;
111 if (sampleStart < 0) {
115 if (sampleStart + sampleSize > m_samples) {
116 sampleSize = m_samples - sampleStart;
120 if (sampleSize > 0 && lineSize > 0) {
122 Brick boundedBrick(sampleSize, lineSize, bufferToFill.BandDimension(), GdalPixelToIsis(m_pixelType),
false);
123 boundedBrick.SetBasePosition(sampleStart + 1, lineStart + 1, bufferToFill.Band());
124 CPLErr err = poBand->RasterIO(GF_Read, sampleStart, lineStart,
125 sampleSize, lineSize,
126 boundedBrick.RawBuffer(),
127 sampleSize, lineSize,
131 if (err >= CE_Failure) {
132 QString msg =
"Failure when trying to read image";
133 throw IException(IException::Unknown, msg, _FILEINFO_);
137 char *buffersRawBuf = (
char *)boundedBrick.RawBuffer();
138 double *buffersDoubleBuf = boundedBrick.DoubleBuffer();
139 for (
int bufferIdx = 0; bufferIdx < boundedBrick.size(); bufferIdx++) {
140 readPixelType(buffersDoubleBuf, buffersRawBuf, bufferIdx);
142 bufferToFill.CopyOverlapFrom(boundedBrick);
145 CPLErr err = poBand->RasterIO(GF_Read, sampleStart, lineStart,
146 sampleSize, lineSize,
147 bufferToFill.RawBuffer(),
148 sampleSize, lineSize,
151 if (err >= CE_Failure) {
152 QString msg =
"Failure when trying to read image";
153 throw IException(IException::Unknown, msg, _FILEINFO_);
157 char *buffersRawBuf = (
char *)bufferToFill.RawBuffer();
158 double *buffersDoubleBuf = bufferToFill.DoubleBuffer();
159 for (
int bufferIdx = 0; bufferIdx < bufferToFill.size(); bufferIdx++) {
160 readPixelType(buffersDoubleBuf, buffersRawBuf, bufferIdx);
167 void GdalIoHandler::write(
const Buffer &bufferToWrite) {
169 GDALRasterBand *poBand;
171 int maxBand = bufferToWrite.BandDimension() + bufferToWrite.Band() - 1;
172 for (
int band = bufferToWrite.Band(); band <= maxBand; band++) {
175 vband = m_virtualBands->indexOf(band) + 1;
177 if (band > m_bands) {
181 poBand = m_geodataSet->GetRasterBand(vband);
183 int lineStart = bufferToWrite.Line() - 1;
184 int sampleStart = bufferToWrite.Sample() - 1;
185 int lineSize = bufferToWrite.LineDimension();
186 int sampleSize = bufferToWrite.SampleDimension();
191 if (lineStart + lineSize > m_lines) {
192 lineSize = m_lines - lineStart;
194 if (sampleStart < 0) {
197 if (sampleStart + sampleSize > m_samples) {
198 sampleSize = m_samples - sampleStart;
201 int bufferSize = sampleSize * lineSize;
202 int currentBandIdx = bufferSize * (vband - bufferToWrite.Band());
203 m_maskBuff = (
unsigned char *) CPLMalloc(
sizeof(
unsigned char) * bufferSize);
204 for (
int i = 0; i < bufferSize; i++) {
210 char *buffersRawBuf = &(((
char *)bufferToWrite.RawBuffer())[(
int)(currentBandIdx * SizeOf(bufferToWrite.PixelType()))]);
211 double *buffersDoubleBuf = &(bufferToWrite.DoubleBuffer()[currentBandIdx]);
213 for (
int bufferIdx = 0; bufferIdx < bufferSize; bufferIdx++) {
214 if (writePixelType(buffersDoubleBuf, buffersRawBuf, bufferIdx)) {
215 m_maskBuff[bufferIdx] = 0;
220 gdalerr = poBand->RasterIO(GF_Write, sampleStart, lineStart,
221 sampleSize, lineSize,
222 (
void *)buffersRawBuf,
223 sampleSize, lineSize,
226 if (gdalerr >= CE_Failure) {
227 QString msg =
"Failure when trying to write image";
228 throw IException(IException::Unknown, msg, _FILEINFO_);
231 if (m_driverName !=
"ISIS3") {
232 poBand = m_geodataSet->GetRasterBand(band)->GetMaskBand();
233 gdalerr = poBand->RasterIO(GF_Write, sampleStart, lineStart,
234 sampleSize, lineSize,
236 sampleSize, lineSize,
239 if (gdalerr >= CE_Failure) {
240 QString msg =
"Failure when trying to write msk file";
241 throw IException(IException::Unknown, msg, _FILEINFO_);
250 BigInt GdalIoHandler::getDataSize()
const {
259 PvlObject &core = labels.findObject(
"IsisCube").findObject(
"Core");
260 core.addKeyword(PvlKeyword(
"Format",
"GTiff"), PvlContainer::Replace);
263 void GdalIoHandler::readPixelType(
double *doubleBuff,
void *rawBuff,
int idx)
const {
264 double &bufferVal = doubleBuff[idx];
266 if (m_pixelType == GDT_Float64) {
267 bufferVal = ((
double *)rawBuff)[idx];
268 if (bufferVal == m_gdalNoDataValue) {
273 else if(m_pixelType == GDT_Float32) {
274 float raw = ((
float *)rawBuff)[idx];
277 if (raw == (
float) m_gdalNoDataValue) {
281 if(raw >= VALID_MIN4) {
282 bufferVal = (double) raw * m_scale + m_offset;
287 else if(raw == LOW_INSTR_SAT4)
288 bufferVal = LOW_INSTR_SAT8;
289 else if(raw == LOW_REPR_SAT4)
290 bufferVal = LOW_REPR_SAT8;
291 else if(raw == HIGH_INSTR_SAT4)
292 bufferVal = HIGH_INSTR_SAT8;
293 else if(raw == HIGH_REPR_SAT4)
294 bufferVal = HIGH_REPR_SAT8;
296 bufferVal = LOW_REPR_SAT8;
299 ((
float *)rawBuff)[idx] = raw;
302 else if(m_pixelType == GDT_Int32) {
303 int raw = ((
int *)rawBuff)[idx];
306 if (raw == (
int) m_gdalNoDataValue) {
310 if(raw >= VALID_MINI4) {
311 bufferVal = (double) raw * m_scale + m_offset;
316 else if (raw == LOW_INSTR_SATI4)
317 bufferVal = LOW_INSTR_SAT8;
318 else if (raw == LOW_REPR_SATI4)
319 bufferVal = LOW_REPR_SAT8;
320 else if (raw == HIGH_INSTR_SATI4)
321 bufferVal = HIGH_INSTR_SAT8;
322 else if (raw == HIGH_REPR_SATI4)
323 bufferVal = HIGH_REPR_SAT8;
325 bufferVal = LOW_REPR_SAT8;
327 ((
int *)rawBuff)[idx] = raw;
330 else if(m_pixelType == GDT_UInt32) {
331 unsigned int raw = ((
unsigned int *)rawBuff)[idx];
334 if (raw == (
unsigned int) m_gdalNoDataValue) {
338 if(raw >= VALID_MINUI4) {
339 bufferVal = (double) raw * m_scale + m_offset;
340 if (raw >= VALID_MAXUI4) {
341 if(raw == HIGH_INSTR_SATUI4)
342 bufferVal = HIGH_INSTR_SAT8;
343 else if(raw == HIGH_REPR_SATUI4)
344 bufferVal = HIGH_REPR_SAT8;
346 bufferVal = HIGH_REPR_SAT8;
352 else if(raw == LOW_INSTR_SATUI4)
353 bufferVal = LOW_INSTR_SAT8;
354 else if(raw == LOW_REPR_SATUI4)
355 bufferVal = LOW_REPR_SAT8;
357 bufferVal = LOW_REPR_SAT8;
359 ((
unsigned int *)rawBuff)[idx] = raw;
362 else if(m_pixelType == GDT_Int16) {
363 short raw = ((
short *)rawBuff)[idx];
366 if (raw == (
short) m_gdalNoDataValue) {
370 if(raw >= VALID_MIN2) {
371 bufferVal = (double) raw * m_scale + m_offset;
376 else if(raw == LOW_INSTR_SAT2)
377 bufferVal = LOW_INSTR_SAT8;
378 else if(raw == LOW_REPR_SAT2)
379 bufferVal = LOW_REPR_SAT8;
380 else if(raw == HIGH_INSTR_SAT2)
381 bufferVal = HIGH_INSTR_SAT8;
382 else if(raw == HIGH_REPR_SAT2)
383 bufferVal = HIGH_REPR_SAT8;
385 bufferVal = LOW_REPR_SAT8;
388 ((
short *)rawBuff)[idx] = raw;
391 else if(m_pixelType == GDT_UInt16) {
392 unsigned short raw = ((
unsigned short *)rawBuff)[idx];
395 if (raw == (
unsigned short) m_gdalNoDataValue) {
399 if(raw >= VALID_MINU2) {
400 bufferVal = (double) raw * m_scale + m_offset;
401 if (raw > VALID_MAXU2) {
402 if(raw == HIGH_INSTR_SATU2)
403 bufferVal = HIGH_INSTR_SAT8;
404 else if(raw == HIGH_REPR_SATU2)
405 bufferVal = HIGH_REPR_SAT8;
407 bufferVal = HIGH_REPR_SAT8;
413 else if(raw == LOW_INSTR_SATU2)
414 bufferVal = LOW_INSTR_SAT8;
415 else if(raw == LOW_REPR_SATU2)
416 bufferVal = LOW_REPR_SAT8;
418 bufferVal = LOW_REPR_SAT8;
420 ((
unsigned short *)rawBuff)[idx] = raw;
423 else if(m_pixelType == GDT_Int8) {
424 signed char raw = ((
signed char *)rawBuff)[idx];
425 if (raw == (
signed char) m_gdalNoDataValue) {
432 else if(raw == HIGH_REPR_SATS1) {
433 bufferVal = HIGH_REPR_SAT8;
436 bufferVal = (double) raw * m_scale + m_offset;
439 ((
signed char *)rawBuff)[idx] = raw;
442 else if(m_pixelType == GDT_Byte) {
443 unsigned char raw = ((
unsigned char *)rawBuff)[idx];
444 if (raw == (
char) m_gdalNoDataValue) {
451 else if(raw == HIGH_REPR_SAT1) {
452 bufferVal = HIGH_REPR_SAT8;
455 bufferVal = (double) raw * m_scale + m_offset;
458 ((
unsigned char *)rawBuff)[idx] = raw;
462 bool GdalIoHandler::writePixelType(
double *doubleBuff,
void *rawBuff,
int idx)
const {
463 double bufferVal = doubleBuff[idx];
464 bool isSpecial =
false;
465 if (m_pixelType == GDT_Float64) {
466 ((
double *)rawBuff)[idx] = bufferVal;
469 else if(m_pixelType == GDT_Float32) {
472 if(bufferVal >= VALID_MIN8) {
473 double filePixelValueDbl = (bufferVal - m_offset) /
476 if(filePixelValueDbl < (
double) VALID_MIN4) {
480 else if(filePixelValueDbl > (
double) VALID_MAX4) {
481 raw = HIGH_REPR_SAT4;
485 raw = (float) filePixelValueDbl;
489 if(bufferVal == NULL8) {
493 else if(bufferVal == LOW_INSTR_SAT8) {
494 raw = LOW_INSTR_SAT4;
497 else if(bufferVal == LOW_REPR_SAT8) {
501 else if(bufferVal == HIGH_INSTR_SAT8) {
502 raw = HIGH_INSTR_SAT4;
505 else if(bufferVal == HIGH_REPR_SAT8) {
506 raw = HIGH_REPR_SAT4;
514 ((
float *)rawBuff)[idx] = raw;
517 else if(m_pixelType == GDT_Int32) {
520 if(bufferVal >= VALID_MINI4) {
521 double filePixelValueDbl = (bufferVal - m_offset) /
523 if(filePixelValueDbl < VALID_MINI4 - 0.5) {
524 raw = LOW_REPR_SATI4;
527 if(filePixelValueDbl > VALID_MAXI4) {
528 raw = HIGH_REPR_SATI4;
532 int filePixelValue = (int)round(filePixelValueDbl);
534 if(filePixelValue < VALID_MINI4) {
535 raw = LOW_REPR_SATI4;
538 else if(filePixelValue > VALID_MAXI4) {
539 raw = HIGH_REPR_SATI4;
543 raw = filePixelValue;
548 if(bufferVal == NULL8) {
552 else if(bufferVal == LOW_INSTR_SAT8) {
553 raw = LOW_INSTR_SATI4;
556 else if(bufferVal == LOW_REPR_SAT8) {
557 raw = LOW_REPR_SATI4;
560 else if(bufferVal == HIGH_INSTR_SAT8) {
561 raw = HIGH_INSTR_SATI4;
564 else if(bufferVal == HIGH_REPR_SAT8) {
565 raw = HIGH_REPR_SATI4;
569 raw = LOW_REPR_SATI4;
573 ((
int *)rawBuff)[idx] = raw;
576 else if(m_pixelType == GDT_UInt32) {
579 if(bufferVal >= VALID_MINUI4) {
580 double filePixelValueDbl = (bufferVal - m_offset) /
582 if(filePixelValueDbl < VALID_MINUI4 - 0.5) {
583 raw = LOW_REPR_SATUI4;
586 if(filePixelValueDbl > VALID_MAXUI4) {
587 raw = HIGH_REPR_SATUI4;
591 unsigned int filePixelValue = (
unsigned int)round(filePixelValueDbl);
593 if(filePixelValue < VALID_MINUI4) {
594 raw = LOW_REPR_SATUI4;
597 else if(filePixelValue > VALID_MAXUI4) {
598 raw = HIGH_REPR_SATUI4;
602 raw = filePixelValue;
607 if(bufferVal == NULL8) {
611 else if(bufferVal == LOW_INSTR_SAT8) {
612 raw = LOW_INSTR_SATUI4;
615 else if(bufferVal == LOW_REPR_SAT8) {
616 raw = LOW_REPR_SATUI4;
619 else if(bufferVal == HIGH_INSTR_SAT8) {
620 raw = HIGH_INSTR_SATUI4;
623 else if(bufferVal == HIGH_REPR_SAT8) {
624 raw = HIGH_REPR_SATUI4;
628 raw = LOW_REPR_SATUI4;
632 ((
unsigned int *)rawBuff)[idx] = raw;
635 else if(m_pixelType == GDT_Int16) {
638 if(bufferVal >= VALID_MIN8) {
639 double filePixelValueDbl = (bufferVal - m_offset) /
641 if(filePixelValueDbl < VALID_MIN2 - 0.5) {
645 if(filePixelValueDbl > VALID_MAX2 + 0.5) {
646 raw = HIGH_REPR_SAT2;
650 int filePixelValue = (int)round(filePixelValueDbl);
652 if(filePixelValue < VALID_MIN2) {
656 else if(filePixelValue > VALID_MAX2) {
657 raw = HIGH_REPR_SAT2;
661 raw = filePixelValue;
666 if(bufferVal == NULL8) {
670 else if(bufferVal == LOW_INSTR_SAT8) {
671 raw = LOW_INSTR_SAT2;
674 else if(bufferVal == LOW_REPR_SAT8) {
678 else if(bufferVal == HIGH_INSTR_SAT8) {
679 raw = HIGH_INSTR_SAT2;
682 else if(bufferVal == HIGH_REPR_SAT8) {
683 raw = HIGH_REPR_SAT2;
691 ((
short *)rawBuff)[idx] = raw;
694 else if(m_pixelType == GDT_UInt16) {
697 if(bufferVal >= VALID_MIN8) {
698 double filePixelValueDbl = (bufferVal - m_offset) /
700 if(filePixelValueDbl < VALID_MINU2 - 0.5) {
701 raw = LOW_REPR_SATU2;
704 if(filePixelValueDbl > VALID_MAXU2 + 0.5) {
705 raw = HIGH_REPR_SATU2;
709 int filePixelValue = (int)round(filePixelValueDbl);
711 if(filePixelValue < VALID_MINU2) {
712 raw = LOW_REPR_SATU2;
715 else if(filePixelValue > VALID_MAXU2) {
716 raw = HIGH_REPR_SATU2;
720 raw = filePixelValue;
725 if(bufferVal == NULL8) {
729 else if(bufferVal == LOW_INSTR_SAT8) {
730 raw = LOW_INSTR_SATU2;
733 else if(bufferVal == LOW_REPR_SAT8) {
734 raw = LOW_REPR_SATU2;
737 else if(bufferVal == HIGH_INSTR_SAT8) {
738 raw = HIGH_INSTR_SATU2;
741 else if(bufferVal == HIGH_REPR_SAT8) {
742 raw = HIGH_REPR_SATU2;
746 raw = LOW_REPR_SATU2;
750 ((
unsigned short *)rawBuff)[idx] = raw;
753 else if(m_pixelType == GDT_Int8) {
756 if(bufferVal >= VALID_MIN8) {
757 double filePixelValueDbl = (bufferVal - m_offset) /
759 if(filePixelValueDbl < VALID_MINS1 - 0.5) {
760 raw = LOW_REPR_SATS1;
763 else if(filePixelValueDbl > VALID_MAXS1 + 0.5) {
764 raw = HIGH_REPR_SATS1;
768 int filePixelValue = (int)(filePixelValueDbl + 0.5);
769 if(filePixelValue < VALID_MINS1) {
770 raw = LOW_REPR_SATS1;
773 else if(filePixelValue > VALID_MAXS1) {
774 raw = HIGH_REPR_SATS1;
778 raw = (
signed char)(filePixelValue);
783 if(bufferVal == NULL8) {
787 else if(bufferVal == LOW_INSTR_SAT8) {
788 raw = LOW_INSTR_SATS1;
791 else if(bufferVal == LOW_REPR_SAT8) {
792 raw = LOW_REPR_SATS1;
795 else if(bufferVal == HIGH_INSTR_SAT8) {
796 raw = HIGH_INSTR_SATS1;
799 else if(bufferVal == HIGH_REPR_SAT8) {
800 raw = HIGH_REPR_SATS1;
804 raw = LOW_REPR_SATS1;
808 ((
signed char *)rawBuff)[idx] = raw;
811 else if(m_pixelType == GDT_Byte) {
814 if(bufferVal >= VALID_MIN8) {
815 double filePixelValueDbl = (bufferVal - m_offset) /
817 if(filePixelValueDbl < VALID_MIN1 - 0.5) {
821 else if(filePixelValueDbl > VALID_MAX1 + 0.5) {
822 raw = HIGH_REPR_SAT1;
826 int filePixelValue = (int)(filePixelValueDbl + 0.5);
827 if(filePixelValue < VALID_MIN1) {
831 else if(filePixelValue > VALID_MAX1) {
832 raw = HIGH_REPR_SAT1;
836 raw = (
unsigned char)(filePixelValue);
841 if(bufferVal == NULL8) {
845 else if(bufferVal == LOW_INSTR_SAT8) {
846 raw = LOW_INSTR_SAT1;
849 else if(bufferVal == LOW_REPR_SAT8) {
853 else if(bufferVal == HIGH_INSTR_SAT8) {
854 raw = HIGH_INSTR_SAT1;
857 else if(bufferVal == HIGH_REPR_SAT8) {
858 raw = HIGH_REPR_SAT1;
866 ((
unsigned char *)rawBuff)[idx] = raw;
virtual void updateLabels(Pvl &labels)
Function to update the labels with a Pvl object.
Handles converting buffers to and from disk.
This is free and unencumbered software released into the public domain.
This is free and unencumbered software released into the public domain.
Namespace for the standard library.