48 : m_handler(obj.m_handler),
50 m_dataset(obj.m_dataset),
51 m_scalar(obj.m_scalar),
54 m_samples(obj.m_samples),
56 m_validRect(obj.m_validRect)
102 H5::DataSpace imageDataspace =
m_dataset.getSpace();
103 int rank = imageDataspace.getSimpleExtentNdims();
108 std::vector<hsize_t> inputSize(rank);
109 imageDataspace.getSimpleExtentDims( &inputSize.front(), 0 );
121 catch(
const H5::Exception& e )
123 std::cout <<
"ERROR:" << e.getDetailMsg()<<
" \n";
137 H5::DataSpace imageDataspace =
m_dataset.getSpace();
138 const ossim_int32 IN_DIM_COUNT = imageDataspace.getSimpleExtentNdims();
140 if ( IN_DIM_COUNT == 2 )
143 std::vector<hsize_t> dimsOut(IN_DIM_COUNT);
144 imageDataspace.getSimpleExtentDims( &dimsOut.front(), 0 );
146 if ( dimsOut[0] && dimsOut[1] )
154 static_cast<ossim_int32>( dimsOut[1]-1 ),
155 static_cast<ossim_int32>( dimsOut[0]-1 ) );
159 std::vector<hsize_t> inputCount(IN_DIM_COUNT);
160 std::vector<hsize_t> inputOffset(IN_DIM_COUNT);
166 inputCount[1] = WIDTH;
170 std::vector<hsize_t> outputCount(OUT_DIM_COUNT);
173 outputCount[2] = WIDTH;
176 std::vector<hsize_t> outputOffset(OUT_DIM_COUNT);
185 H5::DataType datatype =
m_dataset.getDataType();
188 H5::DataSpace bufferDataSpace( OUT_DIM_COUNT, &outputCount.front());
189 bufferDataSpace.selectHyperslab( H5S_SELECT_SET,
190 &outputCount.front(),
191 &outputOffset.front() );
205 const ossim_float32 NULL_VALUE2 = ( name ==
"/All_Data/VIIRS-DNB-SDR_All/Radiance" )
206 ? -1.5e-9 : NULL_VALUE;
210 std::vector<ossim_float32> values( WIDTH );
219 inputOffset[0] =
static_cast<hsize_t
>(ulIpt.
y);
220 imageDataspace.selectHyperslab( H5S_SELECT_SET,
222 &inputOffset.front() );
225 m_dataset.read( (
void*)&values.front(), datatype, bufferDataSpace, imageDataspace );
230 m_endian->
swap( scalar, (
void*)&values.front(), WIDTH );
239 ( values[index] > NULL_VALUE ) )
265 inputOffset[0] =
static_cast<hsize_t
>(lrIpt.
y);
266 imageDataspace.selectHyperslab( H5S_SELECT_SET,
268 &inputOffset.front() );
271 m_dataset.read( (
void*)&values.front(), datatype, bufferDataSpace, imageDataspace );
276 m_endian->
swap( scalar, (
void*)&values.front(), WIDTH );
286 ( values[index] > NULL_VALUE ) )
312 <<
"ossimHdf5ImageDataset:"<<__LINE__<<
" WARNING!" 313 <<
"\nUnhandled scalar type: " 330 H5::DataSpace imageDataspace =
m_dataset.getSpace();
331 H5::DataType dataType =
m_dataset.getDataType();
336 hsize_t imageOffset[2] = { 0, 0 };
339 char *rowBuf =
new char[elem_size*
m_samples];
340 char *fill_value =
new char[elem_size];
343 H5::DataSpace bufferDataSpace( 2, rowSize);
344 bufferDataSpace.selectHyperslab( H5S_SELECT_SET, rowSize, imageOffset );
347 H5Pget_fill_value(
m_dataset.getId(), dataType.getId(), fill_value);
351 bool found_valid =
false;
352 for (; (ulIpt.y<(int)
m_lines) && !found_valid; ulIpt.y++)
354 imageOffset[0] = ulIpt.y;
355 imageDataspace.selectHyperslab( H5S_SELECT_SET, rowSize, imageOffset);
356 m_dataset.read(rowBuf, dataType, bufferDataSpace, imageDataspace );
360 for (ulIpt.x=0; (ulIpt.x<(
int)
m_samples) && !found_valid; ulIpt.x++, rowOffset+=elem_size)
361 found_valid = (memcmp(&rowBuf[rowOffset], fill_value, elem_size) != 0);
369 for (; (lrIpt.
y>ulIpt.y) && !found_valid; lrIpt.
y--)
371 imageOffset[0] = lrIpt.
y;
372 imageDataspace.selectHyperslab( H5S_SELECT_SET, rowSize, imageOffset);
373 m_dataset.read(rowBuf, dataType, bufferDataSpace, imageDataspace );
377 for (lrIpt.
x=
m_samples-1; (lrIpt.
x>ulIpt.x) && !found_valid; lrIpt.
x-- , rowOffset-=elem_size)
378 found_valid = (memcmp(&rowBuf[rowOffset], fill_value, elem_size) != 0);
386 imageDataspace.close();
389 delete [] fill_value;
392 catch(
const H5::Exception& e )
422 vector<char> dataBuffer(bufSizeInBytes);
442 for (
int y=ulIpt.y;
y<=lrIpt.y;
y++)
447 getTileBuf(&dataBuffer.front(), clipRect, band,
false);
477 if (ossim::almostEqual<ossim_float32>(value, nullpix, epsilon))
525 H5T_class_t typeClass =
m_dataset.getTypeClass();
526 if ( ( typeClass != H5T_INTEGER ) && ( typeClass != H5T_FLOAT ) )
529 hid_t mem_type_id = H5Dget_type(
m_dataset.getId() );
530 if( mem_type_id < 0 )
533 hid_t native_type = H5Tget_native_type(mem_type_id, H5T_DIR_DEFAULT);
534 if( H5Tequal(H5T_NATIVE_CHAR, native_type) )
536 else if ( H5Tequal( H5T_NATIVE_UCHAR, native_type) )
538 else if( H5Tequal( H5T_NATIVE_SHORT, native_type) )
540 else if(H5Tequal(H5T_NATIVE_USHORT, native_type))
542 else if(H5Tequal( H5T_NATIVE_INT, native_type))
544 else if(H5Tequal( H5T_NATIVE_UINT, native_type ) )
546 else if(H5Tequal( H5T_NATIVE_LONG, native_type))
548 else if(H5Tequal( H5T_NATIVE_ULONG, native_type))
550 else if(H5Tequal( H5T_NATIVE_LLONG, native_type))
552 else if(H5Tequal( H5T_NATIVE_ULLONG, native_type))
554 else if(H5Tequal( H5T_NATIVE_FLOAT, native_type))
556 else if(H5Tequal( H5T_NATIVE_DOUBLE, native_type))
562 catch(
const H5::Exception& e )
604 static const char MODULE[] =
"ossimHdf5ImageDataset::getTileBuf";
620 H5::DataSpace imageDataSpace =
m_dataset.getSpace();
623 const ossim_int32 IN_DIM_COUNT = imageDataSpace.getSimpleExtentNdims();
626 H5::DataType dataType =
m_dataset.getDataType();
628 std::vector<hsize_t> inputCount(IN_DIM_COUNT);
629 std::vector<hsize_t> inputOffset(IN_DIM_COUNT);
631 if ( IN_DIM_COUNT == 2 )
633 inputOffset[0] = irect.
ul().
y;
634 inputOffset[1] = irect.
ul().
x;
636 inputCount[0] = irect.
height();
637 inputCount[1] = irect.
width();
641 inputOffset[0] = band;
642 inputOffset[1] = irect.
ul().
y;
643 inputOffset[2] = irect.
ul().
x;
646 inputCount[1] = irect.
height();
647 inputCount[2] = irect.
width();
651 imageDataSpace.selectHyperslab( H5S_SELECT_SET,
653 &inputOffset.front() );
657 std::vector<hsize_t> outputCount(OUT_DIM_COUNT);
659 outputCount[1] = irect.
height();
660 outputCount[2] = irect.
width();
663 std::vector<hsize_t> outputOffset(OUT_DIM_COUNT);
664 outputOffset[0] = band;
669 H5::DataSpace bufferDataSpace( OUT_DIM_COUNT, &outputCount.front());
670 bufferDataSpace.selectHyperslab( H5S_SELECT_SET,
671 &outputCount.front(),
672 &outputOffset.front() );
675 m_dataset.read( buffer, dataType, bufferDataSpace, imageDataSpace );
762 bufferDataSpace.close();
764 imageDataSpace.close();
766 catch(
const H5::Exception& error )
809 out <<
"ossimH5ImageDataset: " 810 <<
"\nH5::DataSet::id: " <<
m_dataset.getId()
817 <<
"\nswap_flage: " << (
m_endian?
"true":
"false")
820 catch(
const H5::Exception& e )
830 return obj.
print( out );
bool initialize(const H5::DataSet &dataset)
Opens datasetName and initializes all data members on success.
const H5::DataSet * getDataset() const
Get const pointer to dataset.
ossimHdf5ImageDataset(ossimHdf5ImageHandler *owner=0)
default constructor
bool determineScalarType()
virtual ossimString getEntryString(ossim_int32 entry_number) const
bool almostEqual(T x, T y, T tolerance=FLT_EPSILON)
bool determineExtents()
Returns true if datasets's endianness differs from this platform.
const ossimIrect & getValidImageRect() const
double getMinPixelValue(ossim_uint32 band=0) const
This is the base class for all imagery using HDF5 as the file format.
ossim_uint32 height() const
void getTileBuf(void *buffer, const ossimIrect &rect, ossim_uint32 band, bool scale=true)
Method to grab a tile(rectangle) from image.
const ossimIpt & ul() const
std::ostream & print(std::ostream &out) const
print method.
OSSIM_DLL ossimByteOrder byteOrder()
void close()
Calls H5::DataSet::close then deletes data set.
Class encapsulates a HDF5 Data set that can be loaded as an image.
ossimRefPtr< ossimHdf5 > m_hdf5
unsigned short ossim_uint16
ossimIrect m_validRect
H5 data can have null rows on the front or end.
~ossimHdf5ImageDataset()
destructor
bool isMaxPixelSet() const
ossimRefPtr< ossimHdf5 > m_hdf5
double getMaxPixelValue(ossim_uint32 band=0) const
void set_ul(const ossimIpt &pt)
static ossimScalarTypeLut * instance()
Returns the static instance of an ossimScalarTypeLut object.
OSSIM_DLL double defaultMin(ossimScalarType scalarType)
static ossimByteOrder getByteOrder(const H5::AbstractDs *obj)
signed short ossim_sint16
unsigned int ossim_uint32
std::vector< ossim_float32 > m_maxValue
std::ostream & operator<<(std::ostream &out, const ossimHdf5ImageDataset &obj)
OSSIM_DLL ossim_uint32 scalarSizeInBytes(ossimScalarType scalarType)
ossim_uint32 getNumberOfSamples() const
const ossimIpt & lr() const
ossim_uint32 width() const
const ossimIpt & ur() const
#define OSSIM_DEFAULT_MAX_PIX_FLOAT
#define OSSIM_DEFAULT_MIN_PIX_FLOAT
OSSIM_DLL double defaultMax(ossimScalarType scalarType)
void set_lr(const ossimIpt &pt)
const ossimHdf5ImageDataset & operator=(const ossimHdf5ImageDataset &rhs)
ossim_uint32 getNumberOfLines() const
H5::DataSpace m_dataSpace
bool scanForValidImageRect()
bool isMinPixelSet() const
ossim_uint32 area() const
const ossimIpt & getSubImageOffset() const
ossimScalarType getScalarType() const
ossim_uint32 getNumberOfBands() const
std::vector< ossim_float32 > m_minValue
virtual double getNullPixelValue(ossim_uint32 band=0) const
ossimRefPtr< ossimHdf5ImageHandler > m_handler
std::string getName() const
unsigned char ossim_uint8
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
std::basic_ostream< char > ostream
Base class for char output streams.