OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimRialtoReader.cpp
Go to the documentation of this file.
1 #include "ossimRialtoReader.h"
2 #include <set>
3 #include <vector>
5 #include <pdal/PointViewIter.hpp>
6 #include <rialto/GeoPackageCommon.hpp>
7 
8 RTTI_DEF1(ossimRialtoReader, "ossimRialtoReader" , ossimPdalReader)
9 
10 using namespace pdal;
11 using namespace rialto;
12 
13 
15 {
16 }
17 
19 {
20  close();
21 }
22 
24 {
25  m_inputFilename = db_name;
26  rewind();
27 
28  if (!m_inputFilename.ext().contains("gpkg"))
29  return false;
30  try
31  {
32  // Connect to Rialto:
33  m_pdalOptions.add("filename", m_inputFilename.string());
34  m_pdalPipe = new RialtoReader;
35  m_pdalOptions.add("verbose", LogLevel::Debug);
36  m_pdalPipe->setOptions(m_pdalOptions);
37  m_pointTable = PointTablePtr(new PointTable);
38  m_pdalPipe->prepare(*m_pointTable);
39  }
40  catch (std::exception& e)
41  {
42  ossimNotify() << e.what() << endl;
43  return false;
44  }
45 
46  m_geometry = new ossimPointCloudGeometry();
47 
48  establishMinMax();
49 
50  return true;
51 }
52 
54  ossimPointBlock& block,
55  ossim_uint32 /*np*/) const
56 {
57  // Rialto does not support file-based reads. Only allowed through the Db
58  ossimNotify(ossimNotifyLevel_WARN) << "ossimRialtoReader::getFileBlock() WARNING: "
59  "Rialto does not support file-based reads. Returning blank point block."<<endl;
60  block.clear();
61 }
62 
63 void ossimRialtoReader::getBlock(const ossimGrect& bounds, ossimPointBlock& block) const
64 {
65  // getBlock() (unlike getFileBlock) necessarily starts with an empty data buffer. Only the
66  // field code is referenced to know which fields to pick out of the PDAL table.
67  block.clear();
68 
69  // First set up the bounds to be understood by the PDAL rialto reader:
70  double minx = bounds.ul().lon;
71  double maxx = bounds.lr().lon;
72  double miny = bounds.lr().lat;
73  double maxy = bounds.ul().lat;
74  BOX2D bbox_rect (minx, miny, maxx, maxy);
75  std::string bbox_name ("bounds");
76  Option pdalOption;
77  pdalOption.setName(bbox_name);
78  m_pdalOptions.remove(pdalOption);
79  m_pdalOptions.add(bbox_name, bbox_rect);
80  m_pdalPipe->setOptions(m_pdalOptions);
81  m_pointTable = PointTablePtr(new PointTable);
82  m_pdalPipe->prepare(*m_pointTable);
83 
84  // Fetch the points:
85  m_pvs = m_pdalPipe->execute(*m_pointTable);
86 
87  // Set up loop over all point view sets:
88  m_currentPID = 0;
89  PointViewSet::iterator pvs_iter = m_pvs.begin();
90  while (pvs_iter != m_pvs.end())
91  {
92  // Set up loop over points in each PointView:
93  m_currentPV = *pvs_iter;
94  m_currentPvOffset = 0;
95  parsePointView(block);
96  ++pvs_iter;
97  }
98 }
99 
101 {
102  if (!m_pdalPipe)
103  return;
104 
105  if (!m_minRecord.valid())
106  {
107  m_minRecord = new ossimPointRecord;
108  m_maxRecord = new ossimPointRecord;
109  }
110 
111  m_availableFields = 0;
112  if (!m_pdalPipe)
113  return;
114 
115  ossimGpt minGpt, maxGpt;
116  RialtoReader* reader = (RialtoReader*) m_pdalPipe;
117  const GpkgMatrixSet& info = reader->getMatrixSet();
118  const std::vector<GpkgDimension>& dimList = info.getDimensions();
119  std::vector<GpkgDimension>::const_iterator dim_iter = dimList.begin();
120 
121  while (dim_iter != dimList.end())
122  {
123  double min_value = dim_iter->getMinimum();
124  double max_value = dim_iter->getMaximum();
125  ossimString dimName = dim_iter->getName();
126 
127  if (dimName.contains("X")) // longitude in rialto world
128  {
129  minGpt.lon = min_value;
130  maxGpt.lon = max_value;
131  }
132  if (dimName.contains("Y")) // latitude in rialto world
133  {
134  minGpt.lat = min_value;
135  maxGpt.lat = max_value;
136  }
137  if (dimName.contains("Z")) // height (meters) in rialto world
138  {
139  minGpt.hgt = min_value;
140  maxGpt.hgt = max_value;
141  }
142  if (dimName.contains("Intensity"))
143  {
144  m_availableFields |= ossimPointRecord::Intensity;
145  m_minRecord->setField(ossimPointRecord::Intensity, (float) min_value);
146  m_maxRecord->setField(ossimPointRecord::Intensity, (float) max_value);
147  }
148  else if (dimName.contains("ReturnNumber"))
149  {
150  m_availableFields |= ossimPointRecord::ReturnNumber;
151  m_minRecord->setField(ossimPointRecord::ReturnNumber, (float) min_value);
152  m_maxRecord->setField(ossimPointRecord::ReturnNumber, (float) max_value);
153  }
154  else if (dimName.contains("NumberOfReturns"))
155  {
156  m_availableFields |= ossimPointRecord::NumberOfReturns;
157  m_minRecord->setField(ossimPointRecord::NumberOfReturns, (float) min_value);
158  m_maxRecord->setField(ossimPointRecord::NumberOfReturns, (float) max_value);
159  }
160  else if (dimName.contains("Red"))
161  {
162  m_availableFields |= ossimPointRecord::Red;
163  m_minRecord->setField(ossimPointRecord::Red, (float) min_value);
164  m_maxRecord->setField(ossimPointRecord::Red, (float) max_value);
165  }
166  else if (dimName.contains("Green"))
167  {
168  m_availableFields |= ossimPointRecord::Green;
169  m_minRecord->setField(ossimPointRecord::Green, (float) min_value);
170  m_maxRecord->setField(ossimPointRecord::Green, (float) max_value);
171  }
172  else if (dimName.contains("Blue"))
173  {
174  m_availableFields |= ossimPointRecord::Blue;
175  m_minRecord->setField(ossimPointRecord::Blue, (float) min_value);
176  m_maxRecord->setField(ossimPointRecord::Blue, (float) max_value);
177  }
178  else if (dimName.contains("GpsTime"))
179  {
180  m_availableFields |= ossimPointRecord::GpsTime;
181  m_minRecord->setField(ossimPointRecord::GpsTime, (float) min_value);
182  m_maxRecord->setField(ossimPointRecord::GpsTime, (float) max_value);
183  }
184  else if (dimName.contains("Infrared"))
185  {
186  m_availableFields |= ossimPointRecord::Infrared;
187  m_minRecord->setField(ossimPointRecord::Infrared, (float) min_value);
188  m_maxRecord->setField(ossimPointRecord::Infrared, (float) max_value);
189  }
190  ++dim_iter;
191  }
192 
193  m_minRecord->setPosition(minGpt);
194  m_maxRecord->setPosition(maxGpt);
195 
196  // TODO: REMOVE DEBUG
197  {
198  cout<<"minPt: "<<*m_minRecord<<endl;
199  cout<<"maxPt: "<<*m_maxRecord<<endl;
200  }
201 }
202 
203 
204 
205 
206 
virtual void getFileBlock(ossim_uint32 offset, ossimPointBlock &block, ossim_uint32 np=0) const
Riaalto implementation does not support direct file reads, so this method is stubbed out with a warin...
virtual void establishMinMax()
Computes min and max records using points in the current PointViewSet.
std::shared_ptr< pdal::PointTable > PointTablePtr
bool contains(char aChar) const
Definition: ossimString.h:58
virtual ~ossimRialtoReader()
virtual destructor
virtual bool open(const ossimFilename &fname)
Accepts filename of Rialto database file.
ossim_float64 hgt
Height in meters above the ellipsiod.
Definition: ossimGpt.h:274
virtual void clear()
Resets any storage to empty.
ossim_float64 lon
Definition: ossimGpt.h:266
unsigned int ossim_uint32
const ossimGpt & ul() const
Definition: ossimGrect.h:252
ossimRialtoReader()
default constructor
ossim_float64 lat
Definition: ossimGpt.h:265
#define RTTI_DEF1(cls, name, b1)
Definition: ossimRtti.h:485
const ossimGpt & lr() const
Definition: ossimGrect.h:269
virtual void getBlock(const ossimGrect &bounds, ossimPointBlock &block) const
Fetches the block of points inside the block bounds.
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)