Helios++
Helios software for LiDAR simulations
LasMeasurementWriteStrategy.h
1 #pragma once
2 
3 #include <filems/write/strategies/WriteStrategy.h>
4 #include <scanner/Measurement.h>
5 
6 #include <laswriter.hpp>
7 #include <glm/glm.hpp>
8 
9 
10 namespace helios { namespace filems{
11 
12 
22  public WriteStrategy<Measurement const &, glm::dvec3 const &>
23 {
24 public:
25  // *** CONSTANTS *** //
26  // ******************* //
30  static const U8 CLASSIFICATION_MASK = 31;
31 protected:
32  // *** ATTRIBUTES *** //
33  // ******************** //
38  LASwriter &lw;
44  LASpoint &lp;
48  double const &scaleFactorInverse;
52  glm::dvec3 const &offset;
56  double const &minIntensity;
60  double const &maxIntensity;
64  double const &intensityCoefficient;
68  I32 const &ewAttrStart;
72  I32 const &fwiAttrStart;
76  I32 const &hoiAttrStart;
80  I32 const &ampAttrStart;
81 
82 public:
83  // *** CONSTRUCTION / DESTRUCTION *** //
84  // ************************************ //
91  LASwriter &lw,
92  LASpoint &lp,
93  double const &scaleFactorInverse,
94  glm::dvec3 const &offset,
95  double const &minIntensity,
96  double const &maxIntensity,
97  double const &intensityCoefficient,
98  I32 const &ewAttrStart,
99  I32 const &fwiAttrStart,
100  I32 const &hoiAttrStart,
101  I32 const &ampAttrStart
102  ) :
103  lw(lw),
104  lp(lp),
106  offset(offset),
114  {}
115  virtual ~LasMeasurementWriteStrategy() = default;
116 
117  // *** WRITE STRATEGY INTERFACE *** //
118  // ********************************** //
125  void write(Measurement const &m, glm::dvec3 const &shift) override {
126  measurementToPoint(m, shift);
127  lw.write_point(&lp);
128  lw.update_inventory(&lp);
129  }
130 
131 protected:
132  // *** UTILS *** //
133  // **************** //
139  virtual void measurementToPoint(
140  Measurement const &m,
141  glm::dvec3 const &shift
142  ){
143  // Compute shifted position (new impl. shift .las as .xyz)
144  //glm::dvec3 shifted = m.position + shift - offset; // Old impl.
145  glm::dvec3 const &shifted = m.position; // New, because offset=shift
146 
147  // Populate LAS point (base attributes)
148  lp.set_X(I32(shifted.x * scaleFactorInverse));
149  lp.set_Y(I32(shifted.y * scaleFactorInverse));
150  lp.set_Z(I32(shifted.z * scaleFactorInverse));
151  double intensityf = m.intensity;
152  if(intensityf < minIntensity) intensityf = minIntensity;
153  if(intensityf > maxIntensity) intensityf = maxIntensity;
154  U16 intensity = U16(
155  intensityCoefficient * (intensityf - minIntensity)
156  );
157  lp.set_intensity(intensity);
158 
159  lp.set_return_number(U8(m.returnNumber));
160  lp.set_extended_return_number(U8(m.returnNumber));
161 
162  lp.set_number_of_returns(U8(m.pulseReturnNumber));
163  lp.set_extended_number_of_returns(U8(m.pulseReturnNumber));
164 
165  lp.set_classification(U8(m.classification) & CLASSIFICATION_MASK);
166  lp.set_extended_classification(U8(m.classification) & CLASSIFICATION_MASK);
167 
168  lp.set_gps_time(F64((m.gpsTime)/1000000000.0));
169 
170  // Populate LAS point (extra bytes attributes)
171  lp.set_attribute(ewAttrStart, F64(m.echo_width));
172  lp.set_attribute(fwiAttrStart, I32(m.fullwaveIndex));
173  lp.set_attribute(hoiAttrStart, I32(std::stoi(m.hitObjectId)));
174  lp.set_attribute(ampAttrStart, F64(m.intensity));
175  }
176 };
177 
178 
179 }}
Class representing a measurement.
Definition: Measurement.h:13
int pulseReturnNumber
Pulse return number.
Definition: Measurement.h:61
std::string hitObjectId
ID of hit object.
Definition: Measurement.h:29
int fullwaveIndex
Full wave index.
Definition: Measurement.h:65
double gpsTime
Measurement GPS time.
Definition: Measurement.h:73
double intensity
Point intensity.
Definition: Measurement.h:49
double echo_width
Echo width.
Definition: Measurement.h:53
int returnNumber
Measurement return number.
Definition: Measurement.h:57
int classification
Point class.
Definition: Measurement.h:69
glm::dvec3 position
Definition: Measurement.h:33
Concrete class specializing WriteStrategy to directly write measurements to a file with LAS format.
Definition: LasMeasurementWriteStrategy.h:23
LasMeasurementWriteStrategy(LASwriter &lw, LASpoint &lp, double const &scaleFactorInverse, glm::dvec3 const &offset, double const &minIntensity, double const &maxIntensity, double const &intensityCoefficient, I32 const &ewAttrStart, I32 const &fwiAttrStart, I32 const &hoiAttrStart, I32 const &ampAttrStart)
Default constructor for LAS measurement write strategy.
Definition: LasMeasurementWriteStrategy.h:90
static const U8 CLASSIFICATION_MASK
Classification mask constant for LAS format.
Definition: LasMeasurementWriteStrategy.h:30
virtual void measurementToPoint(Measurement const &m, glm::dvec3 const &shift)
Build a LAS point from measurement data.
Definition: LasMeasurementWriteStrategy.h:139
double const & scaleFactorInverse
Definition: LasMeasurementWriteStrategy.h:48
I32 const & ewAttrStart
Definition: LasMeasurementWriteStrategy.h:68
double const & maxIntensity
Definition: LasMeasurementWriteStrategy.h:60
double const & minIntensity
Definition: LasMeasurementWriteStrategy.h:56
LASwriter & lw
The LASwriter to write points to LAS file.
Definition: LasMeasurementWriteStrategy.h:38
glm::dvec3 const & offset
Definition: LasMeasurementWriteStrategy.h:52
void write(Measurement const &m, glm::dvec3 const &shift) override
Write measurement to LAS file.
Definition: LasMeasurementWriteStrategy.h:125
I32 const & hoiAttrStart
Definition: LasMeasurementWriteStrategy.h:76
I32 const & ampAttrStart
Definition: LasMeasurementWriteStrategy.h:80
I32 const & fwiAttrStart
Definition: LasMeasurementWriteStrategy.h:72
LASpoint & lp
The LASpoint configured to build points for the desired LAS output format.
Definition: LasMeasurementWriteStrategy.h:44
double const & intensityCoefficient
Definition: LasMeasurementWriteStrategy.h:64
Interface that must be implemented by any class which supports write implementations for file writers...
Definition: WriteStrategy.h:14