OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimHdfInfo.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: Mingjie Su
8 //
9 // Description: Ogr Info object.
10 //
11 //----------------------------------------------------------------------------
12 // $Id: ossimHdfInfo.cpp 2645 2011-05-26 15:21:34Z oscar.kramer $
13 
14 //gdal includes
15 #include <gdal_priv.h>
16 #include <cpl_string.h>
17 
18 //ossim includes
19 #include <ossim/base/ossimNotify.h>
20 #include <ossim/base/ossimTrace.h>
22 #include <ossimHdfInfo.h>
23 
24 // Static trace for debugging
25 static ossimTrace traceDebug("ossimHdfInfo:debug");
26 
28  : ossimInfoBase(),
29  theFile(),
30  m_hdfReader(0),
31  m_driverName()
32 {
33 }
34 
36 {
37  m_hdfReader = 0;
38  m_globalMeta.clear();
39  m_globalMetaVector.clear();
40 }
41 
43 {
44  static const char MODULE[] = "ossimHdfInfo::open";
45  if (traceDebug())
46  {
48  << MODULE << " entered...\n"
49  << "file: " << file << "\n";
50  }
51 
52  bool result = false;
53 
54  ossimString ext = file.ext();
55  ext.downcase();
56 
57  if ( ext == "hdf" || ext == "h4" || ext == "hdf4" ||
58  ext == "he4" || ext == "hdf5" || ext == "he5" || ext == "h5" ||
59  ext == "l1r")
60  {
62  m_hdfReader->setFilename(file);
63 
64  if ( m_hdfReader->open() )
65  {
67  if (m_driverName.contains("HDF4"))
68  {
69  m_driverName = "hdf4";
70  }
71  else if (m_driverName.contains("HDF5"))
72  {
73  m_driverName = "hdf5";
74  }
75 
76  theFile = file;
77  m_globalMeta.clear();
78  m_globalMetaVector.clear();
79  GDALDatasetH dataset = GDALOpen(theFile.c_str(), GA_ReadOnly);
80  if (dataset != 0)
81  {
82  char** papszMetadata = GDALGetMetadata(dataset, NULL);
83  if( CSLCount(papszMetadata) > 0 )
84  {
85  for(ossim_uint32 metaIndex = 0; papszMetadata[metaIndex] != 0; ++metaIndex)
86  {
87  ossimString metaInfo = papszMetadata[metaIndex];
88  if (metaInfo.contains("="))
89  {
90  std::vector<ossimString> metaInfos = metaInfo.split("=");
91  if (metaInfos.size() > 1)
92  {
93  ossimString key = metaInfos[0];
94  ossimString keyStr = key.substitute(":", ".", true);
95  keyStr = keyStr + ": ";
96  ossimString valueStr = metaInfos[1];
97  m_globalMeta[keyStr] = valueStr;
98  m_globalMetaVector.push_back(ossimString(keyStr + valueStr));
99  }
100  }
101  }
102  }
103  }
104  GDALClose(dataset);
105 
106  result = true;
107  }
108  }
109 
110  if (traceDebug())
111  {
113  << MODULE << " exit status = " << (result?"true\n":"false\n");
114  }
115 
116  return result;
117 }
118 
120 {
121  static const char MODULE[] = "ossimHdfInfo::print";
122  if (traceDebug())
123  {
124  ossimNotify(ossimNotifyLevel_DEBUG) << MODULE << " entered...\n";
125  }
126 
127  ossimString prefix = ossimString(m_driverName + ".").downcase();
128 
129  //print out global meta first
130  for (ossim_uint32 i = 0; i < m_globalMetaVector.size(); i++)
131  {
132  out << prefix << m_globalMetaVector[i] << "\n";
133  }
134 
136  for (ossim_uint32 i = 0; i < entryNum; i++)
137  {
138  ossimString imagePrefix = "image" + ossimString::toString(i) + ".";
139  ossimString fileName = m_hdfReader->getEntryString(i);
140  if (!fileName.empty())
141  {
142  GDALDatasetH dataset = GDALOpen(fileName.c_str(), GA_ReadOnly);
143  if (dataset != 0)
144  {
145  ossim_uint32 numOfBands = GDALGetRasterCount(dataset);
146  for (ossim_uint32 j = 0; j < numOfBands; j++)
147  {
148  ossimString bandPrefix = "band" + ossimString::toString(j) + ".";
149  ossimString prefixStr = prefix + imagePrefix + bandPrefix;
150  ossimString nameStr = "name: ";
151  ossimString subDatasetName = fileName;
152  std::vector<ossimString> subFileList = fileName.split(":");
153  if (subFileList.size() > 2)
154  {
155  if (m_driverName == "hdf4")
156  {
157  subDatasetName = subFileList[1] + ":" + subFileList[subFileList.size() - 2] + ":" + subFileList[subFileList.size() - 1];
158  }
159  else if (m_driverName == "hdf5")
160  {
161  subDatasetName = subFileList[subFileList.size() - 1];
162  }
163  }
164  out << prefixStr << nameStr << subDatasetName << "\n";
165 
166  char** papszMetadata = GDALGetMetadata(dataset, NULL);
167  if( CSLCount(papszMetadata) > 0 )
168  {
169  for(ossim_uint32 metaIndex = 0; papszMetadata[metaIndex] != 0; ++metaIndex)
170  {
171  ossimString metaInfo = papszMetadata[metaIndex];
172  if (metaInfo.contains("="))
173  {
174  std::vector<ossimString> metaInfos = metaInfo.split("=");
175  if (metaInfos.size() > 1)
176  {
177  ossimString key = metaInfos[0];
178  ossimString keyStr = key.substitute(":", ".", true);
179  keyStr = keyStr + ": ";
180  ossimString valueStr = metaInfos[1];
181  std::map<ossimString, ossimString, ossimStringLtstr>::const_iterator itSub = m_globalMeta.find(keyStr);
182  if (itSub == m_globalMeta.end())//avoid to print global again
183  {
184  out << prefixStr << keyStr << valueStr << "\n";
185  }
186  }
187  }
188  }
189  }
190  }
191  GDALClose(dataset);
192  }//end if (dataset != 0)
193  }//end if (!fileName.empty())
194  }//end for
195 
196  if (traceDebug())
197  {
198  ossimNotify(ossimNotifyLevel_DEBUG) << MODULE << " exited...\n";
199  }
200 
201  return out;
202 }
ossimString substitute(const ossimString &searchKey, const ossimString &replacementValue, bool replaceAll=false) const
Substitutes searchKey string with replacementValue and returns a string.
ossimHdfInfo()
default constructor
virtual bool open(const ossimFilename &file)
open method.
virtual ossim_uint32 getNumberOfEntries() const
bool contains(char aChar) const
Definition: ossimString.h:58
static ossimString toString(bool aValue)
Numeric to string methods.
virtual bool open()
Open method.
void split(std::vector< ossimString > &result, const ossimString &separatorList, bool skipBlankFields=false) const
Splits this string into a vector of strings (fields) using the delimiter list specified.
ossimString m_driverName
Definition: ossimHdfInfo.h:58
virtual void setFilename(const ossimFilename &filename)
Sets the filename.
unsigned int ossim_uint32
Info Base.
Definition: ossimInfoBase.h:32
virtual std::ostream & print(std::ostream &out) const
Print method.
std::vector< ossimString > m_globalMetaVector
Definition: ossimHdfInfo.h:60
static ossimString downcase(const ossimString &aString)
Definition: ossimString.cpp:48
virtual ~ossimHdfInfo()
virtual destructor
ossimString getDriverName()
ossimRefPtr< ossimHdfReader > m_hdfReader
Definition: ossimHdfInfo.h:57
ossimFilename theFile
Definition: ossimHdfInfo.h:56
ossimString getEntryString(ossim_uint32 entryId) 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 empty() const
Definition: ossimString.h:411
ossimString ext() const
std::map< ossimString, ossimString, ossimStringLtstr > m_globalMeta
Definition: ossimHdfInfo.h:59
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
std::basic_ostream< char > ostream
Base class for char output streams.
Definition: ossimIosFwd.h:23