OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimPointBlock.cpp
Go to the documentation of this file.
1 //**************************************************************************************************
2 //
3 // OSSIM (http://trac.osgeo.org/ossim/)
4 //
5 // License: LGPL -- See LICENSE.txt file in the top level directory for more details.
6 //
7 //**************************************************************************************************
9 
10 RTTI_DEF1(ossimPointBlock, "ossimPointBlock", ossimDataObject)
11 
13 : ossimDataObject(owner),
14  m_nullPCR(fields),
15  m_minMaxValid(false),
16  m_fieldCode(0),
17  m_isNormalized(false)
18 {
19 }
20 
22 {
23 
24 }
25 
27 {
28  if (empty())
29  value = ossim::nan();
30  else if (!m_minMaxValid)
31  scanForMinMax();
32 
33  value = m_minRecord.getField(field);
34 }
35 
37 {
38  if (empty())
39  value = ossim::nan();
40  else if (!m_minMaxValid)
41  scanForMinMax();
42 
43  value = m_maxRecord.getField(field);
44 }
45 
46 
47 void ossimPointBlock::getBounds(ossimGrect& block_bounds) const
48 {
49  if (!m_minMaxValid)
50  scanForMinMax();
51 
53 }
54 
56 {
57  if (point_offset < m_pointList.size())
58  return m_pointList[point_offset].get();
59  return 0;
60 }
61 
63 {
64  if (point_offset < m_pointList.size())
65  return m_pointList[point_offset].get();
66  return 0;
67 }
68 
70 {
71  ossim_uint32 numPoints = block.size();
72  if (numPoints == 0)
73  return *this;
74 
75  for (ossim_uint32 i=0; i<numPoints; ++i)
76  m_pointList.push_back(new ossimPointRecord(*(block[i])));
77 
78  m_nullPCR = block.m_nullPCR;
79  m_minRecord = block.m_minRecord;
80  m_maxRecord = block.m_maxRecord;
82  m_fieldCode = block.m_fieldCode;
84 
85  return *this;
86 }
87 
89 {
91  *copy = *this;
92  return copy;
93 }
94 
96 {
97  if (!m_pointList.empty())
99 
100  return m_fieldCode;
101 }
102 
103 vector<ossimPointRecord::FIELD_CODES> ossimPointBlock::getFieldCodesAsList() const
104 {
105  vector<ossimPointRecord::FIELD_CODES> code_list;
107  code_list.push_back(ossimPointRecord::Intensity);
109  code_list.push_back(ossimPointRecord::ReturnNumber);
111  code_list.push_back(ossimPointRecord::NumberOfReturns);
113  code_list.push_back(ossimPointRecord::Red);
115  code_list.push_back(ossimPointRecord::Green);
117  code_list.push_back(ossimPointRecord::Blue);
119  code_list.push_back(ossimPointRecord::GpsTime);
121  code_list.push_back(ossimPointRecord::Infrared);
122  return code_list;
123 }
124 
126 {
127  if (getFieldCode() != code)
128  clear();
129 
130  m_fieldCode = code;
131 }
132 
134 {
135  // First check that the fields match the expected. If not, sync up to this point:
136  if ((opr->getFieldCode() & m_fieldCode) != m_fieldCode)
137  m_fieldCode = opr->getFieldCode();
138 
140  m_minMaxValid = false;
141 }
142 
144 {
145  ossim_uint32 numPoints = size();
146  if (numPoints == 0)
147  return;
148 
149  // Latch first point:
150  m_minRecord = *(m_pointList[0].get());
152  ossimGpt minPos (m_minRecord.getPosition());
153  ossimGpt maxPos (minPos);
154 
155  // For shorthand later:
162 
163  // If color available, latch the min for all bands as one to minimize color distortion:
164  bool hasRGB = false;
165  if (m_minRecord.hasFields(R|G|B))
166  {
167  hasRGB = true;
168  ossim_float32 r = m_pointList[0]->getField(R);
169  ossim_float32 g = m_pointList[0]->getField(G);
170  ossim_float32 b = m_pointList[0]->getField(B);
171  float minC = std::min(r, std::min(g, b));
172  float maxC = std::max(r, std::max(g, b));
173  m_minRecord.setField(R, minC);
174  m_minRecord.setField(G, minC);
175  m_minRecord.setField(B, minC);
176  m_maxRecord.setField(R, maxC);
177  m_maxRecord.setField(G, maxC);
178  m_maxRecord.setField(B, maxC);
179  }
180 
181  // Now loop over all points in file to latch min/max:
182  for (ossim_uint32 i=0; i<numPoints; ++i)
183  {
184  if (m_pointList[i]->getPosition().lat < minPos.lat)
185  minPos.lat = m_pointList[i]->getPosition().lat;
186  if (m_pointList[i]->getPosition().lon < minPos.lon)
187  minPos.lon = m_pointList[i]->getPosition().lon;
188  if (m_pointList[i]->getPosition().hgt < minPos.hgt)
189  minPos.hgt = m_pointList[i]->getPosition().hgt;
190 
191  if (m_pointList[i]->getPosition().lat > maxPos.lat)
192  maxPos.lat = m_pointList[i]->getPosition().lat;
193  if (m_pointList[i]->getPosition().lon > maxPos.lon)
194  maxPos.lon = m_pointList[i]->getPosition().lon;
195  if (m_pointList[i]->getPosition().hgt > maxPos.hgt)
196  maxPos.hgt = m_pointList[i]->getPosition().hgt;
197 
198  if (m_minRecord.hasFields(I) && (m_minRecord.getField(I) > m_pointList[i]->getField(I)))
199  m_minRecord.setField(I, m_pointList[i]->getField(I));
200 
201  if (m_minRecord.hasFields(S) && (m_minRecord.getField(S) > m_pointList[i]->getField(S)))
202  m_minRecord.setField(S, m_pointList[i]->getField(S));
203 
204  if (m_minRecord.hasFields(N) && (m_minRecord.getField(N) > m_pointList[i]->getField(N)))
205  m_minRecord.setField(N, m_pointList[i]->getField(N));
206 
207  if (hasRGB)
208  {
209  ossim_float32 r = m_pointList[i]->getField(R);
210  ossim_float32 g = m_pointList[i]->getField(G);
211  ossim_float32 b = m_pointList[i]->getField(B);
212 
213  float minC = std::min(r, std::min(g, b));
214  if (m_minRecord.getField(R) > minC)
215  {
216  m_minRecord.setField(R, minC);
217  m_minRecord.setField(G, minC);
218  m_minRecord.setField(B, minC);
219  }
220 
221  float maxC = std::max(r, std::max(g, b));
222  if (m_maxRecord.getField(R) < maxC)
223  {
224  m_maxRecord.setField(R, maxC);
225  m_maxRecord.setField(G, maxC);
226  m_maxRecord.setField(B, maxC);
227  }
228  }
229  } // end loop over all points
230 
231  m_minRecord.setPosition(minPos);
232  m_maxRecord.setPosition(maxPos);
233  m_minMaxValid = true;
234 }
235 
236 
237 
238 
ossimPointRecord m_nullPCR
ossim_uint32 getFieldCode() const
Returns OR&#39;d mash-up of ossimPointRecord field codes being stored (or desired to be stored) ...
float ossim_float32
void getFieldMax(ossimPointRecord::FIELD_CODES field, ossim_float32 &value) const
double nan()
Method to return ieee floating point double precision NAN.
Definition: ossimCommon.h:135
ossim_float32 getField(FIELD_CODES fc) const
Return the float value of the requested field.
void getBounds(ossimGrect &block_bounds) const
virtual void clear()
Resets any storage to empty.
virtual void addPoint(ossimPointRecord *point)
Adds single point to the tail of the list.
virtual const ossimPointRecord * getPoint(ossim_uint32 point_offset) const
PointList m_pointList
unsigned int ossim_uint32
virtual bool hasFields(ossim_uint32 code_mashup) const
Argument can be mash-up of OR&#39;d codes for check of multiple fields.
bool empty() const
virtual ossim_uint32 size() const
Returns allocated size.
void scanForMinMax() const
ossimPointRecord m_minRecord
ossim_uint32 m_fieldCode
void getFieldMin(ossimPointRecord::FIELD_CODES field, ossim_float32 &value) const
virtual const ossimPointBlock & operator=(const ossimPointBlock &rhs)
#define max(a, b)
Definition: auxiliary.h:76
virtual ossim_uint32 getFieldCode() const
Returns mash-up of OR&#39;d codes of multiple fields being stored.
ossimPointBlock(ossimSource *owner=0, ossim_uint32 fields=0)
const ossimGpt & getPosition() const
Returns the 3D position vector in the dataset&#39;s coodinate reference system (available from the ossimP...
void setField(FIELD_CODES fc, ossim_float32 value)
#define RTTI_DEF1(cls, name, b1)
Definition: ossimRtti.h:485
vector< ossimPointRecord::FIELD_CODES > getFieldCodesAsList() const
void setFieldCode(ossim_uint32 code)
Initializes the desired fields to be stored.
void setPosition(const ossimGpt &p)
ossimPointRecord m_maxRecord
virtual ossimObject * dup() const
#define min(a, b)
Definition: auxiliary.h:75