Helios++
Helios software for LiDAR simulations
LasWriterSpec.h
1 #pragma once
2 
3 #include <helios_version.h>
4 
5 #include <laswriter.hpp>
6 #include <glm/glm.hpp>
7 
8 #include <string>
9 #include <sstream>
10 
11 namespace helios { namespace filems{
12 
13 using std::string;
14 
24 public:
25  // *** ATTRIBUTES *** //
26  // ******************** //
30  LASwriteOpener lwOpener;
34  LASheader lwHeader;
39  LASpoint lp;
47  double scaleFactor;
63  glm::dvec3 offset;
68  double minIntensity;
73  double maxIntensity;
96  I32 ewAttrIdx;
125 
126  // *** CONSTRUCTION / DESTRUCTION *** //
127  // ************************************ //
131  LasWriterSpec() = default;
141  explicit LasWriterSpec(
142  const string &path,
143  double const scaleFactor = 0.0001,
144  glm::dvec3 const offset = glm::dvec3(0, 0, 0),
145  double const minIntensity = 0.0,
146  double const deltaIntensity = 1000000.0
147  ) :
149  offset(offset),
152  {}
159  scaleFactor = lws.scaleFactor;
161  offset = lws.offset;
166  ewAttrIdx = lws.ewAttrIdx;
167  fwiAttrIdx = lws.fwiAttrIdx;
168  hoiAttrIdx = lws.hoiAttrIdx;
169  ampAttrIdx = lws.ampAttrIdx;
170  ewAttrStart = lws.ewAttrStart;
174  }
175  virtual ~LasWriterSpec() = default;
176 
177  // *** C R A F T I N G *** //
178  // *************************** //
182  void craft(){
183  // Prepare
184  std::stringstream ss;
188 
189 
190  // Build header
191  ss << "HELIOS++V" << HELIOS_VERSION;
192  std::string ssStr = ss.str();
193  size_t n = ssStr.length();
194  if(n > 31) n = 31;
195  memcpy(
196  lwHeader.generating_software,
197  ssStr.c_str(),
198  sizeof(char) * n
199  );
200  lwHeader.generating_software[n] = 0;
201  ss.str("");
202  lwHeader.version_major = U8(1);
203  lwHeader.version_minor = U8(0); // las version 1.0
204  time_t now = time(0);
205  tm *gmtm = gmtime(&now);
206  lwHeader.file_creation_day = gmtm->tm_yday;
207  lwHeader.file_creation_year = 1900 + gmtm->tm_year;
208  lwHeader.point_data_format = 1;
209  lwHeader.point_data_record_length = 28;
210  lwHeader.x_scale_factor = scaleFactor;
211  lwHeader.y_scale_factor = scaleFactor;
212  lwHeader.z_scale_factor = scaleFactor;
213  lwHeader.x_offset = F64(offset.x);
214  lwHeader.y_offset = F64(offset.y);
215  lwHeader.z_offset = F64(offset.z);
216  lwHeader.global_encoding = 0;
217  }
221  void craft14(){
222  // Craft LAS 1.0 version
223  craft();
224 
225  // Update Header to 1.4 specification
226  lwHeader.version_minor = U8(4);
227 
228  // Update Point Data Format to support new return number / classes
229  lwHeader.point_data_format = 6;
230  lwHeader.point_data_record_length = 50;
231 
232  // Adds the byte difference between LAS 1.4 and LAS 1.0 (350 - 227)
233  lwHeader.header_size += 148;
234 
235  // Adds the byte difference to the data point offset
236  lwHeader.offset_to_point_data += 148;
237  }
238 
239  // *** EXTRA ATTRIBUTES *** //
240  // ************************** //
245  // Extra bytes
246  ewAttrIdx = -1;
247  fwiAttrIdx = -1;
248  hoiAttrIdx = -1;
249  ampAttrIdx = -1;
250  try{
251  I32 ewType = 9; // double
252  I32 fwiType = 5; // int
253  I32 hoiType = 5; // int
254  I32 ampType = 9; // double
255  LASattribute ewAttr(
256  ewType,
257  "echo_width",
258  "Helios++ echo width"
259  );
260  LASattribute fwiAttr(
261  fwiType,
262  "fullwaveIndex",
263  "Helios++ fullwave index"
264  );
265  LASattribute hoiAttr(
266  hoiType,
267  "hitObjectId",
268  "Helios++ hit object ID"
269  );
270  LASattribute ampAttr(
271  ampType,
272  "heliosAmplitude",
273  "Helios++ Amplitude"
274  );
275  ewAttrIdx = lwHeader.add_attribute(ewAttr);
276  fwiAttrIdx = lwHeader.add_attribute(fwiAttr);
277  hoiAttrIdx = lwHeader.add_attribute(hoiAttr);
278  ampAttrIdx = lwHeader.add_attribute(ampAttr);
279  }
280  catch(std::exception &e){
281  std::stringstream ss;
282  ss << "LasSyncFileWriter failed.\n\tEXCEPTION: "
283  << e.what();
284  logging::WARN(ss.str());
285  }
286 
287  lwHeader.update_extra_bytes_vlr();
288  lwHeader.point_data_record_length += lwHeader.get_attributes_size();
289  ewAttrStart = lwHeader.get_attribute_start(ewAttrIdx);
290  fwiAttrStart = lwHeader.get_attribute_start(fwiAttrIdx);
291  hoiAttrStart = lwHeader.get_attribute_start(hoiAttrIdx);
292  ampAttrStart = lwHeader.get_attribute_start(ampAttrIdx);
293  }
294 
295  // *** INIT LAS POINT *** //
296  // ************************ //
300  void initLASPoint(){
301  lp.init(
302  &lwHeader,
303  lwHeader.point_data_format,
304  lwHeader.point_data_record_length,
305  0
306  );
307  }
308 
309  // *** MAKE WRITER *** //
310  // ********************* //
315  shared_ptr<LASwriter> makeWriter(
316  std::string const &path, bool const compress
317  ){
318  // Create LAS writer from specification
319  lwOpener.set_file_name(path.c_str());
320  if(compress) lwOpener.set_format(LAS_TOOLS_FORMAT_LAZ);
321  else lwOpener.set_format(LAS_TOOLS_FORMAT_LAS);
322  return std::shared_ptr<LASwriter>(lwOpener.open(&lwHeader));
323  }
324 
325  // *** F I N I S H *** //
326  // ********************** //
332  void finish(){
333  lwHeader.remove_attribute(ewAttrIdx);
334  lwHeader.remove_attribute(fwiAttrIdx);
335  lwHeader.remove_attribute(hoiAttrIdx);
336  lwHeader.remove_attribute(ampAttrIdx);
337  free(lwHeader.attributes);
338  free(lwHeader.attribute_starts);
339  free(lwHeader.attribute_sizes);
340  }
341 
342 };
343 
344 
345 }}
Class representing the specification defining a LasWriter (not the writer itself)
Definition: LasWriterSpec.h:23
LASheader lwHeader
Header definition for the LAS file.
Definition: LasWriterSpec.h:34
void craft14()
Craft the header of the LAS File for version 1.4.
Definition: LasWriterSpec.h:221
LASpoint lp
LASpoint used to build different points which shall be written to LAS output file.
Definition: LasWriterSpec.h:39
void addExtraAttributes()
Creation of extra attributes to be added to each record.
Definition: LasWriterSpec.h:244
double deltaIntensity
The difference between max and min intensity.
Definition: LasWriterSpec.h:81
void initLASPoint()
Initialize the LAS point structure with data from header.
Definition: LasWriterSpec.h:300
I32 fwiAttrIdx
Index of full wave index attribute in LAS header definition.
Definition: LasWriterSpec.h:100
double maxIntensity
Maximum value for intensity. Values greater than this will be clipped to maxIntensity.
Definition: LasWriterSpec.h:73
I32 ampAttrStart
Helios amplitude attribute start (LAS extra bytes format)
Definition: LasWriterSpec.h:124
I32 ewAttrIdx
Index of echo width attribute in LAS header definition.
Definition: LasWriterSpec.h:96
I32 hoiAttrIdx
Index of hit object ID attribute in LAS header definition.
Definition: LasWriterSpec.h:104
glm::dvec3 offset
Offset for coordinates.
Definition: LasWriterSpec.h:63
I32 fwiAttrStart
Full wave index attribute start (LAS extra bytes format)
Definition: LasWriterSpec.h:116
I32 hoiAttrStart
Hit object ID attribute start (LAS extra bytes format)
Definition: LasWriterSpec.h:120
double scaleFactor
Scale factor for coordinates.
Definition: LasWriterSpec.h:47
I32 ewAttrStart
Echo width attribute start (LAS extra bytes format)
Definition: LasWriterSpec.h:112
void craft()
Craft the header of the LAS File for version 1.0.
Definition: LasWriterSpec.h:182
void finish()
Remove and release everything that has been initialized in the process of building the writer from th...
Definition: LasWriterSpec.h:332
double scaleFactorInverse
Inverse of the scale factor.
Definition: LasWriterSpec.h:55
double intensityCoefficient
Precomputed intensity coefficient.
Definition: LasWriterSpec.h:92
shared_ptr< LASwriter > makeWriter(std::string const &path, bool const compress)
Build a LAS writer from this specification.
Definition: LasWriterSpec.h:315
LasWriterSpec(const string &path, double const scaleFactor=0.0001, glm::dvec3 const offset=glm::dvec3(0, 0, 0), double const minIntensity=0.0, double const deltaIntensity=1000000.0)
LAS writer specification constructor.
Definition: LasWriterSpec.h:141
double minIntensity
Minimum value for intensity. Values less than this will be clipped to minIntensity.
Definition: LasWriterSpec.h:68
LasWriterSpec()=default
Default constructor for LasWriterSpec.
LASwriteOpener lwOpener
LASwriter opener. Used to instantiate LASwriter lw.
Definition: LasWriterSpec.h:30
I32 ampAttrIdx
Index of helios amplitude attribute in LAS header definition.
Definition: LasWriterSpec.h:108
LasWriterSpec(LasWriterSpec const &lws)
Copy constructor. It must be overridden to prevent segmentation fault when copying the LAS attributes...
Definition: LasWriterSpec.h:158