OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimOgrInfo.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: ossimOgrInfo.cpp 2645 2011-05-26 15:21:34Z oscar.kramer $
13 
14 #include <ossimOgrInfo.h>
15 #include <ossim/base/ossimTrace.h>
17 
18 #include <ogr_api.h>
19 
20 #include <fstream>
21 #include <iostream>
22 #include <iomanip>
23 #include <sstream>
24 
25 // Static trace for debugging
26 static ossimTrace traceDebug("ossimOgrInfo:debug");
27 static ossimTrace traceDump("ossimOgrInfo:dump"); // This will dump offsets.
28 
30  ossimString prefix,
31  ossimString metaNameValue,
32  ossimKeywordlist& kwl)
33 {
34  if (!metaNameValue.contains("{") && !metaNameValue.contains("}"))
35  {
36  std::vector<int> indexVector;
37  ossimString name = metaNameValue.split(":")[0].downcase().trim().substitute(" ", "_", true);
38  ossimString keyValue = ossimString(metaPrefix + prefix + name);
39  std::vector<ossimString> allMatchKeys;
40  kwl.findAllKeysThatMatch(allMatchKeys, keyValue);
41 
42  if (allMatchKeys.size() == 0)
43  {
44  return name;
45  }
46  else
47  {
48  for (ossim_uint32 i = 0; i < allMatchKeys.size(); i++)
49  {
50  ossimString keyMatchValue = allMatchKeys[i];
51  ossimString intValue = keyMatchValue.after(keyValue);
52  if (!intValue.empty())
53  {
54  indexVector.push_back(intValue.toInt());
55  }
56  }
57  if (indexVector.size() == 0) //only found one entry, e.g vpf.cat.Coverage_name
58  {
59  const char* tmpValue = kwl.find(keyValue);
60  ossimString metaValue = tmpValue;
61  kwl.remove(keyValue);
62  ossimString newPrefix = ossimString(prefix + name + ossimString::toString(0));
63  kwl.add(metaPrefix,
64  newPrefix,
65  metaValue,
66  true);
67  return ossimString(name + ossimString::toString(1));
68  }
69  else // e.g vpf.cat.Coverage_name0 found
70  {
71  double max = 0;
72  for (ossim_uint32 i = 0; i < indexVector.size(); i++)
73  {
74  if (max < indexVector.at(i))
75  {
76  max = indexVector.at(i);
77  }
78  }
79  return ossimString(name + ossimString::toString(max+1));
80  }
81  }
82  }
83  return ossimString("");
84 }
85 
87  : ossimInfoBase(),
88  m_file(),
89  m_ogrDatasource(0),
90  m_ogrDriver(0)
91 {
92 }
93 
95 {
96  if (m_ogrDatasource != NULL)
97  {
98  OGRDataSource::DestroyDataSource(m_ogrDatasource);
99  m_ogrDatasource = 0;
100  }
101 }
102 
104 {
105  if ( m_ogrDatasource )
106  {
107  OGRDataSource::DestroyDataSource(m_ogrDatasource);
108  m_ogrDatasource = 0;
109  }
110 
111  // Below interface removed in gdal.
112  // m_file = file;
113  // m_ogrDatasource = OGRSFDriverRegistrar::Open(file.c_str(), false, &m_ogrDriver);
114 
115  m_ogrDatasource = (OGRDataSource*) OGROpen( file.c_str(), false, NULL );
116  if ( m_ogrDatasource )
117  {
118  m_ogrDriver = (OGRSFDriver*) m_ogrDatasource->GetDriver();
119  if ( m_ogrDriver )
120  {
121  m_file = file;
122  }
123 
124  if ( !m_ogrDriver )
125  {
126  OGRDataSource::DestroyDataSource( m_ogrDatasource );
127  m_ogrDatasource = 0;
128  }
129  }
130 
131  return ( m_ogrDatasource ? true : false );
132 }
133 
135  ossimKeywordlist& kwl,
136  ossimString metaPrefix) const
137 {
138  std::vector<ossimString> metaList = metaData.split("\n");
139  bool isCat = false;
140  bool isLat = false;
141  bool isDht = false;
142  bool isLht = false;
143  bool isGrt = false;
144  bool isDqt = false;
145  bool isFcs = false;
146  bool isFca = false;
147 
148  ossimString catKeyPrefix = "cat.";
149  ossimString latKeyPrefix = "lat.";
150  ossimString dhtKeyPrefix = "dht.";
151  ossimString lhtKeyPrefix = "lht.";
152  ossimString grtKeyPrefix = "grt.";
153  ossimString dqtKeyPrefix = "dqt.";
154  ossimString fcsKeyPrefix = "fcs.";
155  ossimString fcaKeyPrefix = "fca.";
156 
157  for (ossim_uint32 i = 0; i < metaList.size(); i++)
158  {
159  ossimString metaNameValue = metaList[i].trim();
160  ossimString metaStr = metaList[i].downcase().trim();
161  if (metaStr.contains("(cat)"))
162  {
163  isCat = true;
164  isLat = false; //set others to false
165  isDht = false;
166  isLht = false;
167  isGrt = false;
168  isDqt = false;
169  isFcs = false;
170  isFca = false;
171  continue;
172  }
173  if (isCat)
174  {
175  if (metaStr.contains(":") &&
176  !metaStr.contains("(lat)") &&
177  !metaStr.contains("(dht)") &&
178  !metaStr.contains("(lht)") &&
179  !metaStr.contains("(grt)") &&
180  !metaStr.contains("(dqt)") &&
181  !metaStr.contains("(fcs)") &&
182  !metaStr.contains("} } } { family"))
183  {
184  ossimString keyValue = getKeyValue(metaPrefix, catKeyPrefix,
185  metaNameValue, kwl);
186  ossimString metaValue = metaNameValue.split(":")[1].trim();
187  ossimString prefix = ossimString(catKeyPrefix + keyValue);
188  kwl.add(metaPrefix,
189  prefix,
190  metaValue,
191  false);
192  }
193  }
194 
195  if (metaStr.contains("(lat)"))
196  {
197  isLat = true;
198  isCat = false; //set others to false
199  isDht = false;
200  isLht = false;
201  isGrt = false;
202  isDqt = false;
203  isFcs = false;
204  isFca = false;
205  continue;
206  }
207  if (isLat)
208  {
209  if (metaStr.contains(":") &&
210  !metaStr.contains("(cat)") &&
211  !metaStr.contains("(dht)") &&
212  !metaStr.contains("(lht)") &&
213  !metaStr.contains("(grt)") &&
214  !metaStr.contains("(dqt)") &&
215  !metaStr.contains("(fcs)") &&
216  !metaStr.contains("} } } { family"))
217  {
218  //do nothing. no need for lat info for now.
219  }
220  }
221 
222  if (metaStr.contains("(dht)"))
223  {
224  isDht = true;
225  isCat = false;
226  isLat = false;
227  isLht = false;
228  isGrt = false;
229  isDqt = false;
230  isFcs = false;
231  isFca = false;
232  continue;
233  }
234  if (isDht)
235  {
236  if (metaStr.contains(":") &&
237  !metaStr.contains("(lat)") &&
238  !metaStr.contains("(cat)") &&
239  !metaStr.contains("(lht)") &&
240  !metaStr.contains("(grt)") &&
241  !metaStr.contains("(dqt)") &&
242  !metaStr.contains("(fcs)") &&
243  !metaStr.contains("} } } { family"))
244  {
245  ossimString keyValue = getKeyValue(metaPrefix, dhtKeyPrefix,
246  metaNameValue, kwl);
247  ossimString metaValue = metaNameValue.split(":")[1].trim();
248  ossimString prefix = ossimString(dhtKeyPrefix + keyValue);
249  kwl.add(metaPrefix,
250  prefix,
251  metaValue,
252  false);
253  }
254  }
255 
256  if (metaStr.contains("(lht)"))
257  {
258  isLht = true;
259  isDht = false;
260  isCat = false;
261  isLat = false;
262  isGrt = false;
263  isDqt = false;
264  isFcs = false;
265  isFca = false;
266  continue;
267  }
268  if (isLht)
269  {
270  if (metaStr.contains(":") &&
271  !metaStr.contains("(lat)") &&
272  !metaStr.contains("(dht)") &&
273  !metaStr.contains("(cat)") &&
274  !metaStr.contains("(grt)") &&
275  !metaStr.contains("(dqt)") &&
276  !metaStr.contains("(fcs)") &&
277  !metaStr.contains("} } } { family"))
278  {
279  ossimString keyValue = getKeyValue(metaPrefix, lhtKeyPrefix,
280  metaNameValue, kwl);
281  ossimString metaValue = metaNameValue.split(":")[1].trim();
282  ossimString prefix = ossimString(lhtKeyPrefix + keyValue);
283  kwl.add(metaPrefix,
284  prefix,
285  metaValue,
286  false);
287  }
288  }
289 
290  if (metaStr.contains("(grt)"))
291  {
292  isGrt = true;
293  isLht = false;
294  isDht = false;
295  isCat = false;
296  isLat = false;
297  isDqt = false;
298  isFcs = false;
299  isFca = false;
300  continue;
301  }
302  if (isGrt)
303  {
304  if (metaStr.contains(":") &&
305  !metaStr.contains("(lat)") &&
306  !metaStr.contains("(dht)") &&
307  !metaStr.contains("(lht)") &&
308  !metaStr.contains("(cat)") &&
309  !metaStr.contains("(dqt)") &&
310  !metaStr.contains("(fcs)") &&
311  !metaStr.contains("} } } { family"))
312  {
313  ossimString keyValue = getKeyValue(metaPrefix, grtKeyPrefix,
314  metaNameValue, kwl);
315  ossimString metaValue = metaNameValue.split(":")[1].trim();
316  ossimString prefix = ossimString(grtKeyPrefix + keyValue);
317  kwl.add(metaPrefix,
318  prefix,
319  metaValue,
320  false);
321  }
322  }
323 
324  if (metaStr.contains("(dqt)"))
325  {
326  isDqt = true;
327  isGrt = false;
328  isLht = false;
329  isDht = false;
330  isCat = false;
331  isLat = false;
332  isFcs = false;
333  isFca = false;
334  continue;
335  }
336  if (isDqt)
337  {
338  if (metaStr.contains(":") &&
339  !metaStr.contains("(lat)") &&
340  !metaStr.contains("(dht)") &&
341  !metaStr.contains("(lht)") &&
342  !metaStr.contains("(grt)") &&
343  !metaStr.contains("(cat)") &&
344  !metaStr.contains("(fcs)") &&
345  !metaStr.contains("} } } { family"))
346  {
347  ossimString keyValue = getKeyValue(metaPrefix, dqtKeyPrefix,
348  metaNameValue, kwl);
349  ossimString metaValue = metaNameValue.split(":")[1].trim();
350  ossimString prefix = ossimString(dqtKeyPrefix + keyValue);
351  kwl.add(metaPrefix,
352  prefix,
353  metaValue,
354  false);
355  }
356  }
357 
358  if (metaStr.contains("(fcs)"))
359  {
360  isFcs = true;
361  isDqt = false;
362  isGrt = false;
363  isLht = false;
364  isDht = false;
365  isCat = false;
366  isLat = false;
367  isFca = false;
368  continue;
369  }
370  if (isFcs)
371  {
372  if (metaStr.contains(":") &&
373  !metaStr.contains("(lat)") &&
374  !metaStr.contains("(dht)") &&
375  !metaStr.contains("(lht)") &&
376  !metaStr.contains("(grt)") &&
377  !metaStr.contains("(dqt)") &&
378  !metaStr.contains("(cat)") &&
379  !metaStr.contains("} } } { family"))
380  {
381  ossimString keyValue = getKeyValue(metaPrefix, fcsKeyPrefix,
382  metaNameValue, kwl);
383  ossimString metaValue = metaNameValue.split(":")[1].trim();
384  ossimString prefix = ossimString(fcsKeyPrefix + keyValue);
385  kwl.add(metaPrefix,
386  prefix,
387  metaValue,
388  false);
389  }
390  }
391 
392  if (metaStr.contains("} } } { family"))
393  {
394  isFca = true;
395  isDqt = false;
396  isGrt = false;
397  isLht = false;
398  isDht = false;
399  isCat = false;
400  isLat = false;
401  isFcs = false;
402  }
403  if (isFca)
404  {
405  if (!metaStr.contains("(lat)") &&
406  !metaStr.contains("(dht)") &&
407  !metaStr.contains("(lht)") &&
408  !metaStr.contains("(grt)") &&
409  !metaStr.contains("(dqt)") &&
410  !metaStr.contains("(fcs)"))
411  {
412  std::vector<ossimString> fcaTmpVector = metaNameValue.split("}}");
413  ossimString fcaClassName;
414  for (ossim_uint32 i = 0; i < fcaTmpVector.size(); i++)
415  {
416  ossimString fcaTemp = fcaTmpVector[i].trim();
417  if (!fcaTemp.empty())
418  {
419  if (fcaTemp.contains("family"))
420  {
421  if (fcaTemp.split(" ").size() > 1)
422  {
423  fcaClassName = fcaTemp.split(" ")[2].trim();
424  }
425  }
426  else
427  {
428  std::vector<ossimString> fcaValues;
429  if (fcaTemp.contains("<Grassland>displaymetadata {"))
430  {
431  ossimString displaymetadataVector = fcaTemp.after("<Grassland>displaymetadata {").trim();
432  if (!displaymetadataVector.empty())
433  {
434  fcaValues = displaymetadataVector.split("{");
435  }
436  }
437  else
438  {
439  fcaValues = fcaTemp.split("{");
440  }
441 
442  if (fcaValues.size() > 2)
443  {
444  ossimString fcaKey = fcaValues[1].trim();
445  ossimString fcaValue = fcaValues[2].trim();
446 
447  ossimString prefix = ossimString(fcaKeyPrefix + fcaClassName + "." + fcaKey);
448  kwl.add(metaPrefix,
449  prefix,
450  fcaValue,
451  false);
452  }
453  }
454  }
455  }
456  }
457  }
458  }
459 }
460 
462 {
463  if (m_ogrDatasource != NULL)
464  {
465  ossimString driverName = getDriverName(ossimString(GDALGetDriverShortName(m_ogrDriver)).downcase());
466 
467  ossimString metaPrefix = ossimString(driverName + ".");
468 
469  //get meta data
470  ossimString strValue;
471  char** metaData = 0; // tmp drb m_ogrDatasource->GetMetadata("metadata");
472  ossimString keyName = "tableinfo";
473  size_t nLen = strlen(keyName.c_str());
474  if (metaData != NULL && driverName == "vpf")
475  {
476  while(*metaData != NULL)
477  {
478  if (EQUALN(*metaData, keyName.c_str(), nLen)
479  && ( (*metaData)[nLen] == '=' ||
480  (*metaData)[nLen] == ':' ) )
481  {
482  strValue = (*metaData)+nLen+1;
483  }
484  metaData++;
485  }
486 
487  if (!strValue.empty())
488  {
489  parseMetadata(strValue, kwl, metaPrefix);
490  }
491  }
492 
493  //get geometry data
494  ossimString geomType;
495  int layerCount = m_ogrDatasource->GetLayerCount();
496  ossimString prefixInt = ossimString(metaPrefix + "layer");
497  for(int i = 0; i < layerCount; ++i)
498  {
499  ossimString prefix = prefixInt + ossimString::toString(i) + ".";
500  ossimString specialPrefix = "layer" + ossimString::toString(i) + ".";
501 
502  OGRLayer* layer = m_ogrDatasource->GetLayer(i);
503  if(layer)
504  {
505  //get feature count and geometry type
506  int featureCount = layer->GetFeatureCount();
507  const char* layerName = layer->GetLayerDefn()->GetName();
508 
509  OGRFeature* feature = layer->GetFeature(0);
510  if(feature)
511  {
512  OGRGeometry* geom = feature->GetGeometryRef();
513  if(geom)
514  {
515  switch(geom->getGeometryType())
516  {
517  case wkbMultiPoint:
518  case wkbMultiPoint25D:
519  {
520  geomType = "Multi Points";
521  break;
522  }
523  case wkbPolygon25D:
524  case wkbPolygon:
525  {
526  geomType = "Polygon";
527  break;
528  }
529  case wkbLineString25D:
530  case wkbLineString:
531  {
532  geomType = "LineString";
533  break;
534  }
535  case wkbPoint:
536  case wkbPoint25D:
537  {
538  geomType = "Points";
539  break;
540  }
541  case wkbMultiPolygon25D:
542  case wkbMultiPolygon:
543  {
544  geomType = "Multi Polygon";
545  break;
546 
547  }
548  default:
549  {
550  geomType = "Unknown Type";
551  break;
552  }
553  }
554  }
555  }//end if feature
556  OGRFeature::DestroyFeature(feature);
557 
558  kwl.add(specialPrefix,
559  "features",
560  featureCount,
561  true);
562 
563  //get all attribute fields
564  OGRFeatureDefn* featureDefn = layer->GetLayerDefn();
565  if (featureDefn)
566  {
567  for(int iField = 0; iField < featureDefn->GetFieldCount(); iField++ )
568  {
569  OGRFieldDefn* fieldDefn = featureDefn->GetFieldDefn(iField);
570  ossimString fieldType;
571  if (fieldDefn)
572  {
573  ossimString fieldName = ossimString(fieldDefn->GetNameRef());
574  if( fieldDefn->GetType() == OFTInteger )
575  {
576  fieldType = "Integer";
577  }
578  else if( fieldDefn->GetType() == OFTReal )
579  {
580  fieldType = "Real";
581  }
582  else if( fieldDefn->GetType() == OFTString )
583  {
584  fieldType = "String";
585  }
586  else if ( fieldDefn->GetType() == OFTWideString)
587  {
588  fieldType = "WideString";
589  }
590  else if ( fieldDefn->GetType() == OFTBinary )
591  {
592  fieldType = "Binary";
593  }
594  else if ( fieldDefn->GetType() == OFTDate )
595  {
596  fieldType = "Date";
597  }
598  else if ( fieldDefn->GetType() == OFTTime )
599  {
600  fieldType = "Time";
601  }
602  else if ( fieldDefn->GetType() == OFTDateTime )
603  {
604  fieldType = "DateTime";
605  }
606  else
607  {
608  fieldType = "String";
609  }
610 
611  ossimString fieldInfo = ossimString(fieldName + " (" + fieldType + ")");
612 
613  ossimString colPrefix = prefix + "column" + ossimString::toString(iField);
614  kwl.add(colPrefix,
615  "",
616  fieldInfo,
617  true);
618  }
619  }
620  }
621 
622  kwl.add(specialPrefix,
623  "name",
624  layerName,
625  true);
626 
627  kwl.add(specialPrefix,
628  "geometry",
629  geomType,
630  true);
631  } //end if layer
632  }// end i
633  return true;
634  }// end if datasource
635  return false;
636 }
637 
639 {
640  static const char MODULE[] = "ossimOgrInfo::print";
641  if (traceDebug())
642  {
644  << MODULE << " DEBUG Entered...\n";
645  }
646  return out;
647 }
648 
650 {
651  if (driverName == "esri shapefile")
652  {
653  return "shp";
654  }
655  else if (driverName == "ogdi")
656  {
657  return "vpf";
658  }
659  else
660  {
661  return driverName;
662  }
663 }
Represents serializable keyword/value map.
void parseMetadata(ossimString metaData, ossimKeywordlist &kwl, ossimString metaPrefix) const
Parse the VPF metadata
const char * find(const char *key) const
bool contains(char aChar) const
Definition: ossimString.h:58
static ossimString toString(bool aValue)
Numeric to string methods.
OGRSFDriver * m_ogrDriver
Definition: ossimOgrInfo.h:82
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.
void findAllKeysThatMatch(std::vector< ossimString > &result, const ossimString &regularExpression) const
Finds keys that match regular expression.
virtual bool getKeywordlist(ossimKeywordlist &kwl) const
Method to dump info to a keyword list.
void push_back(char c)
Equivalent to insert(end(), c).
Definition: ossimString.h:905
void add(const char *prefix, const ossimKeywordlist &kwl, bool overwrite=true)
ossimOgrInfo()
default constructor
ossimString getDriverName(ossimString driverName) const
unsigned int ossim_uint32
Info Base.
Definition: ossimInfoBase.h:32
ossimString trim(const ossimString &valueToTrim=ossimString(" \\)) const
this will strip lead and trailing character passed in.
ossimString getKeyValue(ossimString metaPrefix, ossimString prefix, ossimString metaNameValue, ossimKeywordlist &kwl)
virtual ~ossimOgrInfo()
virtual destructor
static ossimString downcase(const ossimString &aString)
Definition: ossimString.cpp:48
#define max(a, b)
Definition: auxiliary.h:76
virtual std::ostream & print(std::ostream &out) const
Print method.
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
virtual bool open(const ossimFilename &file)
open method.
OGRDataSource * m_ogrDatasource
Definition: ossimOgrInfo.h:81
ossimString after(const ossimString &str, std::string::size_type pos=0) const
METHOD: after(str, pos) Returns string immediately after the token str.
ossimFilename m_file
Definition: ossimOgrInfo.h:80
void remove(const char *key)
int toInt() const
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
std::basic_ostream< char > ostream
Base class for char output streams.
Definition: ossimIosFwd.h:23