OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimH5Reader.cpp
Go to the documentation of this file.
1 //----------------------------------------------------------------------------
2 //
3 // License: LGPL
4 //
5 // See LICENSE.txt file in the top level directory for more details.
6 //
7 // Author: David Burken
8 //
9 // Description: OSSIM HDF5 Reader.
10 //
11 //----------------------------------------------------------------------------
12 // $Id: ossimH5Reader.cpp 19878 2011-07-28 16:27:26Z dburken $
13 
14 #include "ossimH5Reader.h"
15 #include "ossimH5Util.h"
16 #include "ossimH5Options.h"
17 #include "ossimH5GridModel.h"
18 
20 #include <ossim/base/ossimIpt.h>
21 #include <ossim/base/ossimDpt.h>
22 #include <ossim/base/ossimEndian.h>
23 #include <ossim/base/ossimGpt.h>
24 #include <ossim/base/ossimIrect.h>
27 #include <ossim/base/ossimNotify.h>
30 #include <ossim/base/ossimString.h>
32 #include <ossim/base/ossimTrace.h>
33 
39 
43 
44 //---
45 // This includes everything! Note the H5 includes are order dependent; hence,
46 // the mongo include.
47 //---
48 #include <hdf5.h>
49 #include <H5Cpp.h>
50 
52 
53 #ifdef OSSIM_ID_ENABLED
54  static const char OSSIM_ID[] = "$Id$";
55 #endif
56 
57 static ossimTrace traceDebug("ossimH5Reader:debug");
58 
59 static const std::string LAYER_KW = "layer";
60 
62  :
64  m_h5File(0),
65  m_entries(),
66  m_currentEntry(0),
67  m_tile(0),
68  m_projection(0),
69  m_mutex()
70 {
71  // traceDebug.setTraceFlag(true);
72 
73  if (traceDebug())
74  {
76  << "ossimH5Reader::ossimH5Reader entered..." << std::endl;
77 #ifdef OSSIM_ID_ENABLED
79  << "OSSIM_ID: " << OSSIM_ID << endl;
80 #endif
81  }
82 }
83 
85 {
86  if (isOpen())
87  {
88  close();
89  }
90 }
91 
93 {
94  m_mutex.lock();
96  m_tile->initialize();
97  m_mutex.unlock();
98 }
99 
101  const ossimIrect& rect, ossim_uint32 resLevel)
102 {
103  if ( m_tile.valid() == false ) // First time through.
104  {
105  allocate();
106  }
107 
108  if (m_tile.valid())
109  {
110  // Image rectangle must be set prior to calling getTile.
111  m_mutex.lock();
112  m_tile->setImageRectangle(rect);
113  m_mutex.unlock();
114 
115  if ( getTile( m_tile.get(), resLevel ) == false )
116  {
117  m_mutex.lock();
119  {
120  m_tile->makeBlank();
121  }
122  m_mutex.unlock();
123  }
124  }
125 
126  return m_tile;
127 }
128 
130 {
131  bool status = false;
132 
133  m_mutex.lock();
134 
135  //---
136  // Not open, this tile source bypassed, or invalid res level,
137  // return a blank tile.
138  //---
139  if( isOpen() && isSourceEnabled() && isValidRLevel(resLevel) &&
140  result && (result->getNumberOfBands() == getNumberOfOutputBands()) )
141  {
142  result->ref(); // Increment ref count.
143 
144  //---
145  // Check for overview tile. Some overviews can contain r0 so always
146  // call even if resLevel is 0. Method returns true on success, false
147  // on error.
148  //---
149  status = getOverviewTile(resLevel, result);
150 
151  if (!status) // Did not get an overview tile.
152  {
153  status = true;
154 
155  ossimIrect tile_rect = result->getImageRectangle();
156 
157  if ( ! tile_rect.completely_within(getImageRectangle(0)) )
158  {
159  // We won't fill totally so make blank first.
160  result->makeBlank();
161  }
162 
163  if (getImageRectangle(0).intersects(tile_rect))
164  {
165  // Make a clip rect.
166  ossimIrect clipRect = tile_rect.clipToRect(getImageRectangle(0));
167 
168  if (tile_rect.completely_within( clipRect) == false)
169  {
170  // Not filling whole tile so blank it out first.
171  result->makeBlank();
172  }
173 
174  // Create buffer to hold the clip rect for a single band.
175  ossim_uint32 clipRectSizeInBytes = clipRect.area() *
177  vector<char> dataBuffer(clipRectSizeInBytes);
178 
179  // Get the data.
180  for (ossim_uint32 band = 0; band < getNumberOfInputBands(); ++band)
181  {
182  // Hdf5 file to buffer:
183  m_entries[m_currentEntry].getTileBuf(&dataBuffer.front(), clipRect, band);
184 
186  {
187  //---
188  // NPP VIIRS data has null of "-999.3".
189  // Scan and fix non-standard null value.
190  //---
191  const ossim_float32 NP = getNullPixelValue(band);
192  const ossim_uint32 COUNT = clipRect.area();
193  ossim_float32* float_buffer = (ossim_float32*)&dataBuffer.front();
194  for ( ossim_uint32 i = 0; i < COUNT; ++i )
195  {
196  if ( float_buffer[i] <= -999.0 ) float_buffer[i] = NP;
197  }
198  }
199 
200  // Buffer to tile:
201  result->loadBand((void*)&dataBuffer.front(), clipRect, band);
202  }
203 
204  // Validate the tile, i.e. full, partial, empty.
205  result->validate();
206  }
207  else // No intersection...
208  {
209  result->makeBlank();
210  }
211  }
212 
213  result->unref(); // Decrement ref count.
214  }
215 
216  m_mutex.unlock();
217 
218  return status;
219 }
220 
223 {
224  return ossimIrect(0,
225  0,
226  getNumberOfSamples(reduced_res_level) - 1,
227  getNumberOfLines(reduced_res_level) - 1);
228 }
229 
231  const char* prefix) const
232 {
233  return ossimImageHandler::saveState(kwl, prefix);
234 }
235 
237  const char* prefix)
238 {
239  if (ossimImageHandler::loadState(kwl, prefix))
240  {
241  return open();
242  }
243 
244  return false;
245 }
246 
248 {
249  static const char MODULE[] = "ossimH5Reader::open";
250 
251  if (traceDebug())
252  {
254  << MODULE << " entered..."
255  << "File: " << theImageFile.c_str()
256  << std::endl;
257  }
258 
259  bool status = false;
260 
261  // Start with a clean slate.
262  if (isOpen())
263  {
264  close();
265  }
266 
267  // Check for empty filename.
268  if (theImageFile.size())
269  {
270  try
271  {
272  //--
273  // Turn off the auto-printing when failure occurs so that we can
274  // handle the errors appropriately
275  //---
276  // H5::Exception::dontPrint();
277 
279 
280  if ( H5::H5File::isHdf5( theImageFile.c_str() ) )
281  {
282  m_h5File = new H5::H5File();
283 
284  H5::FileAccPropList access_plist = H5::FileAccPropList::DEFAULT;
285 
286  m_h5File->openFile( theImageFile.string(), H5F_ACC_RDONLY, access_plist );
287 
288  std::vector<std::string> names;
290 
291  if ( names.size() )
292  {
293  if ( traceDebug() )
294  {
296  << MODULE << " DEBUG\nDataset names:\n";
297  for ( ossim_uint32 i = 0; i < names.size(); ++i )
298  {
300  << "dataset[" << i << "]: " << names[i] << "\n";
301  }
302  }
303 
304  // Add the image dataset entries.
305  addImageDatasetEntries( names );
306  if ( m_entries.size() )
307  {
308  // Set the return status.
309  status = true;
310  }
311  else
312  {
313  m_h5File->close();
314  delete m_h5File;
315  m_h5File = 0;
316  }
317  }
318  }
319 
320  } // End: try block
321 
322  catch( const H5::FileIException& error )
323  {
324  if ( traceDebug() )
325  {
326  error.printError();
327  }
328  }
329 
330  // catch failure caused by the DataSet operations
331  catch( const H5::DataSetIException& error )
332  {
333  if ( traceDebug() )
334  {
335  error.printError();
336  }
337  }
338 
339  // catch failure caused by the DataSpace operations
340  catch( const H5::DataSpaceIException& error )
341  {
342  if ( traceDebug() )
343  {
344  error.printError();
345  }
346  }
347 
348  // catch failure caused by the DataSpace operations
349  catch( const H5::DataTypeIException& error )
350  {
351  if ( traceDebug() )
352  {
353  error.printError();
354  }
355  }
356  catch( ... )
357  {
358 
359  }
360 
361  if ( status )
362  {
363  completeOpen();
364  }
365  }
366 
367  return status;
368 }
369 
370 void ossimH5ImageHandler::addImageDatasetEntries(const std::vector<std::string>& names)
371 {
372  if ( m_h5File && names.size() )
373  {
374  std::vector<std::string>::const_iterator i = names.begin();
375  while ( i != names.end() )
376  {
377  if ( ossimH5Options::instance()->isDatasetRenderable(*i))//ossim_hdf5::isExcludedDataset( *i ) == false )
378  {
379  H5::DataSet dataset = m_h5File->openDataSet( *i );
380 
381  // Get the class of the datatype that is used by the dataset.
382  H5T_class_t type_class = dataset.getTypeClass();
383  if ( ( type_class == H5T_INTEGER ) || ( type_class == H5T_FLOAT ) )
384  {
385  // Get the extents:
386  std::vector<ossim_uint32> extents;
387  ossim_hdf5::getExtents( &dataset, extents );
388  if ( extents.size() >= 2 )
389  {
390  if ( ( extents[0] > 1 ) && ( extents[1] > 1 ) )
391  {
392  ossimH5ImageDataset hids;
393  hids.initialize( dataset, *i );
394  m_entries.push_back( hids );
395  }
396  }
397  }
398 
399  dataset.close();
400  }
401 
402  ++i;
403  }
404  }
405 
406 #if 0 /* Please leave for debug. (drb) */
407  std::vector<ossimH5ImageDataset>::const_iterator i = m_entries.begin();
408  while ( i != m_entries.end() )
409  {
410  std::cout << (*i) << endl;
411  ++i;
412  }
413 #endif
414 
415 } // End: ossimH5Reader::addImageDatasetEntries
416 
418 {
419  ossim_uint32 result = 0;
420 
421  if ( (reduced_res_level == 0) && ( m_currentEntry < m_entries.size() ) )
422  {
423  result = m_entries[m_currentEntry].getNumberOfLines();
424  }
425  else if ( theOverview.valid() )
426  {
427  result = theOverview->getNumberOfLines(reduced_res_level);
428  }
429 
430  return result;
431 }
432 
434 {
435  ossim_uint32 result = 0;
436 
437  if ( (reduced_res_level == 0) && ( m_currentEntry < m_entries.size() ) )
438  {
439  result = m_entries[m_currentEntry].getNumberOfSamples();
440  }
441  else if ( theOverview.valid() )
442  {
443  result = theOverview->getNumberOfSamples(reduced_res_level);
444  }
445 
446  return result;
447 }
448 
450 {
451  return 0; // Not tiled format.
452 }
453 
455 {
456  return 0; // Not tiled format.
457 }
458 
460 {
461  return ossimString("ossim_hdf5_reader");
462 }
463 
465 {
466  return ossimString("ossim hdf5 reader");
467 }
468 
470 {
471  return ossimString("ossimH5Reader");
472 }
473 
475 {
476  ossim_uint32 result = 1;
477 
478  if ( m_currentEntry < m_entries.size() )
479  {
480  result = m_entries[m_currentEntry].getNumberOfBands();
481  }
482 
483  return result;
484 }
485 
487 {
488  // Currently not band selectable.
489  return getNumberOfInputBands();
490 }
491 
493 {
495 
496  if ( m_currentEntry < m_entries.size() )
497  {
498  result = m_entries[m_currentEntry].getScalarType();
499  }
500 
501  return result;
502 }
503 
505 {
506  return ( ( m_h5File != 0 ) &&
507  m_entries.size() &&
508  ( m_currentEntry < m_entries.size() ) ) ? true : false ;
509 }
510 
512 {
513  // Close the datasets.
514  m_entries.clear();
515 
516  // Then the file.
517  if ( m_h5File )
518  {
519  m_h5File->close();
520  delete m_h5File;
521  m_h5File = 0;
522  }
523 
524  // ossimRefPtr so assign to 0(unreferencing) will handle memory.
525  m_tile = 0;
526  m_projection = 0;
527 
529 }
530 
532 {
533  return (ossim_uint32)m_entries.size();
534 }
535 
536 void ossimH5ImageHandler::getEntryNames(std::vector<ossimString>& entryNames) const
537 {
538  entryNames.clear();
539  for (ossim_uint32 i=0; i<m_entries.size(); ++i )
540  {
541  entryNames.push_back(m_entries[i].getName());
542  }
543 }
544 
545 void ossimH5ImageHandler::getEntryList(std::vector<ossim_uint32>& entryList) const
546 {
547  const ossim_uint32 SIZE = m_entries.size();
548  entryList.resize( SIZE );
549  for ( ossim_uint32 i = 0; i < SIZE; ++i )
550  {
551  entryList[i] = i;
552  }
553 }
554 
556 {
557  bool result = true;
558  if (m_currentEntry != entryIdx)
559  {
560  if ( isOpen() )
561  {
562  // Entries always start at zero and increment sequentially..
563  if ( entryIdx < m_entries.size() )
564  {
565  // Clear the geometry.
566  theGeometry = 0;
567 
568  // Must clear or openOverview will use last entries.
570 
571  m_currentEntry = entryIdx;
572 
573  //---
574  // Since we were previously open and the the entry has changed we
575  // need to reinitialize some things. Setting tile to 0 will force an
576  // allocate call on first getTile.
577  //---
578 
579  // ossimRefPtr so assign to 0(unreferencing) will handle memory.
580  m_tile = 0;
581 
582  completeOpen();
583  }
584  else
585  {
586  result = false; // Entry index out of range.
587  }
588  }
589  else
590  {
591  //---
592  // Not open.
593  // Allow this knowing that open will check for out of range.
594  //---
595  m_currentEntry = entryIdx;
596  }
597  }
598 
599  return result;
600 }
601 
603 {
604  return m_currentEntry;
605 }
606 
608 {
609  if ( !theGeometry )
610  {
611  //---
612  // Check for external geom:
613  //---
615 
616  if ( !theGeometry )
617  {
618  //---
619  // WARNING:
620  // Must create/set the geometry at this point or the next call to
621  // ossimImageGeometryRegistry::extendGeometry will put us in an infinite loop
622  // as it does a recursive call back to ossimImageHandler::getImageGeometry().
623  //---
624 
625  // Check the internal geometry first to avoid a factory call.
626  m_mutex.lock();
628  m_mutex.unlock();
629 
630  // At this point it is assured theGeometry is set.
631 
632  // Check for set projection.
633  if ( !theGeometry->getProjection() )
634  {
635  // Try factories for projection.
637  }
638  }
639 
640  // Set image things the geometry object should know about.
642  }
643 
644  return theGeometry;
645 }
646 
648 {
650 
651  if ( m_projection.valid() )
652  {
653  // Stored projection, currently shared by all entries.
654  geom->setProjection( m_projection.get() );
655  }
656  else if ( isOpen() )
657  {
658  // Find the "Latitude" and "Longitude" datasets if present.
659  std::string latName;
660  std::string lonName;
661  if ( getLatLonDatasetNames( m_h5File, latName, lonName ) )
662  {
663  H5::DataSet latDataSet = m_h5File->openDataSet( latName );
664  H5::DataSet lonDataSet = m_h5File->openDataSet( lonName );
665 
666  // Get the valid rectangle of the dataset.
667  ossimIrect validRect = m_entries[m_currentEntry].getValidImageRect();
668 
669  // Try for a coarse projection first:
671  processCoarseGridProjection( latDataSet,
672  lonDataSet,
673  validRect );
674 
675  if ( proj.valid() == false )
676  {
677  ossimIrect rect;
678  proj = ossim_hdf5::getBilinearProjection( latDataSet, lonDataSet, validRect );
679  }
680 
681  if ( proj.valid() )
682  {
683  // Store it for next time:
684  m_projection = proj;
685 
686  // Set the geometry projection
687  geom->setProjection( proj.get() );
688  }
689 
690  latDataSet.close();
691  lonDataSet.close();
692  }
693  }
694 
695  return geom;
696 }
697 
699  H5::DataSet& latDataSet,
700  H5::DataSet& lonDataSet,
701  const ossimIrect& validRect ) const
702 {
704 
706 
707  try
708  {
709  if ( model->setGridNodes( &latDataSet,
710  &lonDataSet,
711  validRect ) )
712  {
713  proj = model.get();
714  }
715  }
716  catch ( const ossimException& e )
717  {
718  if ( traceDebug() )
719  {
721  << "ossimH5Reader::processCoarseGridProjection caught exception\n"
722  << e.what() << std::endl;
723  }
724  }
725 
726  return proj;
727 }
728 
730  std::string& latName,
731  std::string& lonName ) const
732 {
733  bool result = false;
734 
735  if ( h5File )
736  {
737  latName.clear();
738  lonName.clear();
739 
740  // Get the list of datasets.
741  std::vector<std::string> datasetNames;
742  ossim_hdf5::getDatasetNames( h5File, datasetNames );
743 
744  if ( datasetNames.size() )
745  {
746  std::vector<std::string>::const_iterator i = datasetNames.begin();
747  while ( i != datasetNames.end() )
748  {
749  ossimString os = *i;
750  if ( os.contains( "Latitude" ) )
751  {
752  latName = *i;
753  }
754  else if ( os.contains( "Longitude" ) )
755  {
756  lonName = *i;
757  }
758 
759  if ( latName.size() && lonName.size() )
760  {
761  result = true;
762  break;
763  }
764 
765  ++i;
766  }
767  }
768  }
769 
770  return result;
771 
772 } // End: ossimH5Reader::getLatLonDatasetNames
773 
774 bool ossimH5ImageHandler::getLatLonDatasets( H5::H5File* h5File,
775  H5::DataSet& latDataSet,
776  H5::DataSet& lonDataSet ) const
777 {
778  bool status = false;
779 
780  if ( h5File )
781  {
782  std::string latName;
783  std::string lonName;
784  if ( getLatLonDatasetNames( h5File, latName, lonName ) )
785  {
786  // Set the return status:
787  status = true;
788  latDataSet = h5File->openDataSet( latName );
789  lonDataSet = h5File->openDataSet( lonName );
790  }
791  else
792  {
793  // Look for the key: /N_GEO_Ref
794  std::string group = "/";
795  std::string key = "N_GEO_Ref";
796  std::string value;
797 
798  if ( ossim_hdf5::getGroupAttributeValue( h5File, group, key, value ) )
799  {
800  ossimFilename f = value;
801  ossimFilename latLonFile = theImageFile.path();
802  latLonFile = latLonFile.dirCat( f );
803 
804  if ( latLonFile.exists() )
805  {
806  if ( H5::H5File::isHdf5( latLonFile.string() ) )
807  {
808  H5::H5File* h5File = new H5::H5File();
809 
810  H5::FileAccPropList access_plist = H5::FileAccPropList::DEFAULT;
811  h5File->openFile( latLonFile.string(), H5F_ACC_RDONLY, access_plist );
812 
813  if ( getLatLonDatasetNames( h5File, latName, lonName ) )
814  {
815  // Set the return status:
816  status = true;
817  latDataSet = h5File->openDataSet( latName );
818  lonDataSet = h5File->openDataSet( lonName );
819  }
820  h5File->close();
821  delete h5File;
822  h5File = 0;
823  }
824  }
825  }
826  }
827  }
828 
829  return status;
830 
831 } // End: ossimH5Reader::getLatLonDatasets( ... )
832 
833 bool ossimH5ImageHandler::isNppMission( H5::H5File* h5File ) const
834 {
835  bool result = false;
836 
837  // Look for "Mission_Name"
838  const std::string GROUP = "/";
839  const std::string KEY = "Mission_Name";
840  std::string value;
841 
842  if ( ossim_hdf5::getGroupAttributeValue( h5File, GROUP, KEY, value ) )
843  {
844  if ( value == "NPP" )
845  {
846  result = true;
847  }
848  }
849 
850  return result;
851 }
852 
854 {
856 #if 0
857  double result;
859  if ( scalar == OSSIM_FLOAT32 )
860  {
861  result = -9999.0;
862  }
863  else
864  {
865  result = ossimImageHandler::getNullPixelValue( band );
866  }
867  return result;
868 #endif
869 }
870 
872 {
873  if ( property.valid() )
874  {
875  if ( property->getName().string() == LAYER_KW )
876  {
877  ossimString s;
878  property->valueToString(s);
879  ossim_uint32 SIZE = (ossim_uint32)m_entries.size();
880  for ( ossim_uint32 i = 0; i < SIZE; ++i )
881  {
882  if ( m_entries[i].getName() == s.string() )
883  {
884  setCurrentEntry( i );
885  }
886  }
887  }
888  else
889  {
891  }
892  }
893 }
894 
896 {
898  if ( name.string() == LAYER_KW )
899  {
900  if ( m_currentEntry < m_entries.size() )
901  {
902  ossimString value = m_entries[m_currentEntry].getName();
903  prop = new ossimStringProperty(name, value);
904  }
905  }
906  else
907  {
908  prop = ossimImageHandler::getProperty(name);
909  }
910  return prop;
911 }
912 
913 void ossimH5ImageHandler::getPropertyNames(std::vector<ossimString>& propertyNames)const
914 {
915  propertyNames.push_back( ossimString("layer") );
917 }
918 
919 
920 void ossimH5ImageHandler::addMetadata( ossimKeywordlist* kwl, const std::string& prefix ) const
921 {
922  // Note: hdf5 library throws exception if groupd is not found:
923 
924  if ( kwl && m_h5File )
925  {
926  // Look for country code(s): hdf5.CountryCodes: CA,MX,US
927  std::string group = "/";
928  std::string key = "CountryCodes";
929  std::string value;
930 
931  if ( ossim_hdf5::getGroupAttributeValue( m_h5File, group, key, value ) )
932  {
933  key = "country_code";
934  kwl->addPair( prefix, key, value );
935  }
936 
937  // Look for mission id: hdf5.Mission_Name: NPP
938  key = "Mission_Name";
939  if ( ossim_hdf5::getGroupAttributeValue( m_h5File, group, key, value ) )
940  {
941  key = "mission_id";
942  kwl->addPair( prefix, key, value );
943  }
944 
945 
946  //---
947  // Look for sensor type:
948  // hdf5.Data_Products.VIIRS-DNB-SDR.Instrument_Short_Name: VIIRS
949  //---
950  group = "/Data_Products/VIIRS-DNB-SDR";
951  key = "Instrument_Short_Name";
952  if ( ossim_hdf5::getGroupAttributeValue( m_h5File, group, key, value ) )
953  {
954  key = "sensor_id";
955  kwl->addPair( prefix, key, value );
956  }
957 
958  //---
959  // Look for acquisition date:
960  // hdf5.Data_Products.VIIRS-DNB-SDR.VIIRS-DNB-SDR_Aggr.AggregateBeginningDate: 20140113
961  // hdf5.Data_Products.VIIRS-DNB-SDR.VIIRS-DNB-SDR_Aggr.AggregateBeginningTime: 082810.354645Z
962  //---
963  group = "Data_Products/VIIRS-DNB-SDR/VIIRS-DNB-SDR_Aggr";
964  key = "AggregateBeginningDate";
965  if ( ossim_hdf5::getDatasetAttributeValue( m_h5File, group, key, value ) )
966  {
967  std::string time;
968  key = "AggregateBeginningTime";
969  if ( ossim_hdf5::getDatasetAttributeValue( m_h5File, group, key, time ) )
970  {
971  // Only grab yyyymmddmmss in the form ISO 8601: 2014-01-26T10:32:28Z
972  if ( (value.size() >= 8) && ( time.size() >= 6 ) )
973  {
974  std::string dateTime =
975  ossimString( ossimString(value.begin(), value.begin() + 4) + "-"
976  + ossimString(value.begin() + 4, value.begin() + 6) + "-"
977  + ossimString(value.begin() + 6, value.begin() + 8) + "T"
978  + ossimString(time.begin(), time.begin() + 2) + ":"
979  + ossimString(time.begin() + 2, time.begin() + 4) + ":"
980  + ossimString(time.begin() + 4, time.begin() + 6) + "Z" ).string();
981  key = "acquisition_date";
982  kwl->addPair( prefix, key, dateTime );
983  }
984  }
985  }
986  }
987 }
virtual void loadBand(const void *src, const ossimIrect &src_rect, ossim_uint32 band)
void clear()
Erases the entire container.
Definition: ossimString.h:432
virtual bool isSourceEnabled() const
Definition: ossimSource.cpp:79
virtual ossimString getLongName() const
static ossimImageGeometryRegistry * instance()
ossimRefPtr< ossimImageGeometry > theGeometry
void setProjection(ossimProjection *projection)
Sets the projection to be used for local-to-world coordinate transformation.
virtual ossimString getShortName() const
virtual ossim_uint32 getNumberOfBands() const
ossimFilename theImageFile
virtual void setImageRectangle(const ossimIrect &rect)
Represents serializable keyword/value map.
bool valid() const
Definition: ossimRefPtr.h:75
ossimFilename expand() const
Method to do file name expansion.
float ossim_float32
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
Method to the load (recreate) the state of an object from a keyword list.
virtual bool loadState(const ossimKeywordlist &kwl, const char *prefix=0)
Method to the load (recreate) the state of an object from a keyword list.
virtual ossim_uint32 getNumberOfLines(ossim_uint32 resLevel=0) const =0
Pure virtual, derived classes must implement.
bool contains(char aChar) const
Definition: ossimString.h:58
void addImageDatasetEntries(const std::vector< std::string > &names)
Adds image datasets from list of names.
ossimScalarType getScalarType(const H5::DataSet *dataset)
void allocate()
Allocates the tile.
virtual double getNullPixelValue(ossim_uint32 band=0) const
virtual void getEntryList(std::vector< ossim_uint32 > &entryList) const
virtual ossimDataObjectStatus getDataObjectStatus() const
static ossimH5Options * instance()
void addPair(const std::string &key, const std::string &value, bool overwrite=true)
32 bit floating point
virtual void setProperty(ossimRefPtr< ossimProperty > property)
virtual bool extendGeometry(ossimImageHandler *handler) const
void ref() const
increment the reference count by one, indicating that this object has another pointer which is refere...
virtual void initialize()
Initialize the data buffer.
ossimH5ImageHandler()
default constructor
virtual bool isValidRLevel(ossim_uint32 resLevel) const
Determines if the passed in reslution level is valid.
bool completely_within(const ossimIrect &rect) const
Definition: ossimIrect.cpp:425
virtual void getPropertyNames(std::vector< ossimString > &propertyNames) const
virtual bool getOverviewTile(ossim_uint32 resLevel, ossimImageData *result)
Method to get an overview tile.
static ossimImageDataFactory * instance()
virtual ossimDataObjectStatus validate() const
bool exists() const
virtual void addMetadata(ossimKeywordlist *kwl, const std::string &prefix) const
Adds metadata to keyword list.
virtual const char * what() const
Returns the error message.
bool getDatasetAttributeValue(H5::H5File *file, const std::string &objectName, const std::string &key, std::string &value)
Gets string value for attribute key.
std::string::size_type size() const
Definition: ossimString.h:405
virtual ossim_uint32 getImageTileHeight() const
Returns the tile width of the image or 0 if the image is not tiled.
unsigned int ossim_uint32
bool isNppMission(H5::H5File *h5File) const
virtual ossimRefPtr< ossimImageData > getTile(const ossimIrect &rect, ossim_uint32 resLevel=0)
Returns a pointer to a tile given an origin representing the upper left corner of the tile to grab fr...
virtual ossimIrect getImageRectangle() const
OSSIM_DLL ossim_uint32 scalarSizeInBytes(ossimScalarType scalarType)
virtual void getEntryNames(std::vector< ossimString > &entryNames) const
Get the name of entry as a string.
virtual void close()
Deletes the overview and clears the valid image vertices.
virtual void getPropertyNames(std::vector< ossimString > &propertyNames) const
Get propterty names.
virtual ossimRefPtr< ossimImageGeometry > getImageGeometry()
Returns the image geometry object associated with this tile source or NULL if non defined...
bool getLatLonDatasets(H5::H5File *h5File, H5::DataSet &latDataSet, H5::DataSet &lonDataSet) const
virtual ossimRefPtr< ossimImageData > create(ossimSource *owner, ossimScalarType scalar, ossim_uint32 bands=1) const
void initImageParameters(ossimImageGeometry *geom) const
Convenience method to set things needed in the image geometry from the image handler.
ossimIrect clipToRect(const ossimIrect &rect) const
Definition: ossimIrect.cpp:501
virtual ossimIrect getImageRectangle(ossim_uint32 reduced_res_level=0) const
Returns the zero based image rectangle for the reduced resolution data set (rrds) passed in...
virtual bool setCurrentEntry(ossim_uint32 entryIdx)
virtual ossimScalarType getOutputScalarType() const
Returns the output pixel type of the tile source.
ossimRefPtr< ossimImageData > m_tile
virtual ossim_uint32 getNumberOfSamples(ossim_uint32 reduced_res_level=0) const
Returns the number of samples in the image.
ossim_uint32 m_currentEntry
Container class that holds both 2D transform and 3D projection information for an image Only one inst...
ossimScalarType
void unref() const
decrement the reference count by one, indicating that a pointer to this object is referencing it...
virtual ~ossimH5ImageHandler()
virtual destructor
virtual ossimRefPtr< ossimProperty > getProperty(const ossimString &name) const
Get propterty method.
virtual ossimRefPtr< ossimImageGeometry > getExternalImageGeometry() const
Returns the image geometry object associated with this tile source or NULL if non defined...
virtual void close()
Close method.
virtual ossim_uint32 getNumberOfLines(ossim_uint32 reduced_res_level=0) const
Returns the number of lines in the image.
return status
virtual ossimRefPtr< ossimProperty > getProperty(const ossimString &name) const
virtual void makeBlank()
Initializes data to null pixel values.
bool isOpen() const
Derived classes must implement this method to be concrete.
const ossimProjection * getProjection() const
Access methods for projection (may be NULL pointer).
virtual void completeOpen()
Will complete the opening process.
virtual ossim_uint32 getNumberOfOutputBands() const
Returns the number of bands in a tile returned from this TileSource.
virtual void setProperty(ossimRefPtr< ossimProperty > property)
Set propterty method.
ossimRefPtr< ossimImageHandler > theOverview
This class defines an abstract Handler which all image handlers(loaders) should derive from...
virtual ossim_uint32 getNumberOfInputBands() const
Returns the number of bands in the image.
H5::H5File * m_h5File
bool getGroupAttributeValue(H5::H5File *file, const std::string &group, const std::string &key, std::string &value)
Gets string value for attribute key.
ossimRefPtr< ossimProjection > getBilinearProjection(H5::DataSet &latDataSet, H5::DataSet &lonDataSet, const ossimIrect &validRect)
Gets bilinear projection from Latitude, Longitude layer.
ossimRefPtr< ossimProjection > m_projection
ossimRefPtr< ossimProjection > processCoarseGridProjection(H5::DataSet &latDataSet, H5::DataSet &lonDataSet, const ossimIrect &validRect) const
Gets projection from Latitude, Longitude, Height datasets if present.
void getExtents(const H5::DataSet *dataset, std::vector< ossim_uint32 > &extents)
ossim_uint32 area() const
Definition: ossimIrect.h:396
virtual ossimRefPtr< ossimImageGeometry > getInternalImageGeometry()
Method to get geometry from hdf file.
ossimFilename dirCat(const ossimFilename &file) const
const char * c_str() const
Returns a pointer to a null-terminated array of characters representing the string&#39;s contents...
Definition: ossimString.h:396
bool isDatasetRenderable(const std::string &datasetName) const
ossimFilename theOverviewFile
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
Method to save the state of an object to a keyword list.
bool getLatLonDatasetNames(H5::H5File *h5File, std::string &latName, std::string &lonName) const
Get dataset names for Latiitude and Longitude datasets.
virtual ossim_uint32 getNumberOfSamples(ossim_uint32 resLevel=0) const =0
Pure virtual, derived classes must implement.
virtual bool open()
open method.
virtual ossimString getClassName() const
#define RTTI_DEF1(cls, name, b1)
Definition: ossimRtti.h:485
Class encapsulates a HDF5 Data set that can be loaded as an image.
bool initialize(const H5::DataSet &dataset, const std::string &datasetName)
Opens datasetName and initializes all data members on success.
virtual ossim_uint32 getNumberOfEntries() const
void getDatasetNames(H5::H5File *file, std::vector< std::string > &names)
virtual ossim_uint32 getCurrentEntry() const
std::vector< ossimH5ImageDataset > m_entries
virtual double getNullPixelValue(ossim_uint32 band=0) const
Each band has a null pixel associated with it.
ossimFilename path() const
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
virtual bool saveState(ossimKeywordlist &kwl, const char *prefix=0) const
Method to save the state of an object to a keyword list.
const ossimString & getName() const
const std::string & string() const
Definition: ossimString.h:414
virtual ossim_uint32 getImageTileWidth() const
Returns the tile width of the image or 0 if the image is not tiled.