lasreader.cpp
Go to the documentation of this file.
1 /*
2 ===============================================================================
3 
4  FILE: lasreader.cpp
5 
6  CONTENTS:
7 
8  see corresponding header file
9 
10  PROGRAMMERS:
11 
12  martin.isenburg@gmail.com
13 
14  COPYRIGHT:
15 
16  (c) 2007-2011, Martin Isenburg, LASSO - tools to catch reality
17 
18  This is free software; you can redistribute and/or modify it under the
19  terms of the GNU Lesser General Licence as published by the Free Software
20  Foundation. See the COPYING file for more information.
21 
22  This software is distributed WITHOUT ANY WARRANTY and without even the
23  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
24 
25  CHANGE HISTORY:
26 
27  see corresponding header file
28 
29 ===============================================================================
30 */
31 #include "lasreader.hpp"
32 
33 #include "lasindex.hpp"
34 #include "lasfilter.hpp"
35 #include "lastransform.hpp"
36 
37 #include "lasreader_las.hpp"
38 #include "lasreader_bin.hpp"
39 #include "lasreader_shp.hpp"
40 #include "lasreader_qfit.hpp"
41 #include "lasreader_txt.hpp"
42 #include "lasreadermerged.hpp"
43 
44 #include <stdlib.h>
45 #include <string.h>
46 
48 {
49  npoints = 0;
50  p_count = 0;
52  read_complex = 0;
53  index = 0;
54  filter = 0;
55  transform = 0;
56  r_min_x = 0;
57  r_min_y = 0;
58  r_max_x = 0;
59  r_max_y = 0;
60  t_ll_x = 0;
61  t_ll_y = 0;
62  t_size = 0;
63  t_ur_x = 0;
64  t_ur_y = 0;
65  c_center_x = 0;
66  c_center_y = 0;
67  c_radius = 0;
68  c_radius_squared = 0;
69 }
70 
72 {
73  if (index) delete index;
74 }
75 
77 {
78  if (this->index) delete this->index;
79  this->index = index;
80 }
81 
83 {
84  return index;
85 }
86 
88 {
89  this->filter = filter;
90  if (filter && transform)
91  {
93  }
94  else if (filter)
95  {
97  }
98  else if (transform)
99  {
101  }
103 }
104 
106 {
107  this->transform = transform;
108  if (filter && transform)
109  {
111  }
112  else if (filter)
113  {
115  }
116  else if (transform)
117  {
119  }
121 }
122 
124 {
125  if (filter) filter->reset();
126 }
127 
128 BOOL LASreader::inside_tile(const F32 ll_x, const F32 ll_y, const F32 size)
129 {
130  t_ll_x = ll_x;
131  t_ll_y = ll_y;
132  t_size = size;
133  t_ur_x = ll_x + size;
134  t_ur_y = ll_y + size;
135  header.min_x = ll_x;
136  header.min_y = ll_y;
137  header.max_x = ll_x + size - 0.001f * header.x_scale_factor;
138  header.max_y = ll_y + size - 0.001f * header.y_scale_factor;
139  if (index) index->intersect_tile(ll_x, ll_y, size);
140  if (filter || transform)
141  {
142  if (index)
144  else
146  }
147  else
148  {
149  if (index)
151  else
153  }
154  return TRUE;
155 }
156 
157 BOOL LASreader::inside_circle(const F64 center_x, const F64 center_y, const F64 radius)
158 {
159  c_center_x = center_x;
160  c_center_y = center_y;
161  c_radius = radius;
162  c_radius_squared = radius*radius;
163  header.min_x = center_x - radius;
164  header.min_y = center_y - radius;
165  header.max_x = center_x + radius;
166  header.max_y = center_y + radius;
167  if (index) index->intersect_circle(center_x, center_y, radius);
168  if (filter || transform)
169  {
170  if (index)
172  else
174  }
175  else
176  {
177  if (index)
179  else
181  }
182  return TRUE;
183 }
184 
185 BOOL LASreader::inside_rectangle(const F64 min_x, const F64 min_y, const F64 max_x, const F64 max_y)
186 {
187  r_min_x = min_x;
188  r_min_y = min_y;
189  r_max_x = max_x;
190  r_max_y = max_y;
191  header.min_x = min_x;
192  header.min_y = min_y;
193  header.max_x = max_x;
194  header.max_y = max_y;
195  if (index) index->intersect_rectangle(min_x, min_y, max_x, max_y);
196  if (filter || transform)
197  {
198  if (index)
200  else
202  }
203  else
204  {
205  if (index)
207  else
209  }
210  return TRUE;
211 }
212 
214 {
215  while (read_point_default())
216  {
217  if (point.inside_tile(t_ll_x, t_ll_y, t_ur_x, t_ur_y)) return TRUE;
218  }
219  return FALSE;
220 }
221 
223 {
224  while (index->seek_next((LASreader*)this))
225  {
227  }
228  return FALSE;
229 }
230 
232 {
233  while (read_point_default())
234  {
236  }
237  return FALSE;
238 }
239 
241 {
242  while (index->seek_next((LASreader*)this))
243  {
245  }
246  return FALSE;
247 }
248 
250 {
251  while (read_point_default())
252  {
254  }
255  return FALSE;
256 }
257 
259 {
260  while (index->seek_next((LASreader*)this))
261  {
263  }
264  return FALSE;
265 }
266 
268 {
269  while ((this->*read_complex)())
270  {
271  if (!filter->filter(&point)) return TRUE;
272  }
273  return FALSE;
274 }
275 
277 {
278  if ((this->*read_complex)())
279  {
280  transform->transform(&point);
281  return TRUE;
282  }
283  return FALSE;
284 }
285 
287 {
288  if (read_point_filtered())
289  {
290  transform->transform(&point);
291  return TRUE;
292  }
293  return FALSE;
294 }
295 
297 {
298  return (!file_names && use_stdin);
299 }
300 
302 {
303  return (populate_header || (file_name && (strstr(file_name, ".las") || strstr(file_name, ".laz") || strstr(file_name, ".LAS") || strstr(file_name, ".LAZ"))));
304 }
305 
307 {
308  file_name_current = 0;
309  file_name = 0;
310 }
311 
313 {
314  if (file_names)
315  {
316  use_stdin = FALSE;
317  if (file_name_current == file_name_number) return 0;
318  if ((file_name_number > 1) && merged)
319  {
320  LASreaderMerged* lasreadermerged = new LASreaderMerged();
321  if (use_alternate) lasreadermerged->use_alternate_reader();
322  lasreadermerged->set_scale_factor(scale_factor);
323  lasreadermerged->set_offset(offset);
324  lasreadermerged->set_parse_string(parse_string);
325  lasreadermerged->set_skip_lines(skip_lines);
326  lasreadermerged->set_populate_header(populate_header);
327  lasreadermerged->set_translate_intensity(translate_intensity);
328  lasreadermerged->set_scale_intensity(scale_intensity);
329  lasreadermerged->set_translate_scan_angle(translate_scan_angle);
330  lasreadermerged->set_scale_scan_angle(scale_scan_angle);
331  for (file_name_current = 0; file_name_current < file_name_number; file_name_current++) lasreadermerged->add_file_name(file_names[file_name_current]);
332  if (!lasreadermerged->open())
333  {
334  fprintf(stderr,"ERROR: cannot open lasreadermerged with %d file names\n", file_name_number);
335  delete lasreadermerged;
336  return 0;
337  }
338  if (filter) lasreadermerged->set_filter(filter);
339  if (transform) lasreadermerged->set_transform(transform);
340  if (inside_tile) lasreadermerged->inside_tile(inside_tile[0], inside_tile[1], inside_tile[2]);
341  if (inside_circle) lasreadermerged->inside_circle(inside_circle[0], inside_circle[1], inside_circle[2]);
343  return lasreadermerged;
344  }
345  else
346  {
347  file_name = file_names[file_name_current];
348  file_name_current++;
349  if (strstr(file_name, ".las") || strstr(file_name, ".laz") || strstr(file_name, ".LAS") || strstr(file_name, ".LAZ"))
350  {
351  LASreaderLAS* lasreaderlas;
352  if (scale_factor == 0 && offset == 0)
353  lasreaderlas = new LASreaderLAS();
354  else if (scale_factor != 0 && offset == 0)
355  lasreaderlas = new LASreaderLASrescale(scale_factor[0], scale_factor[1], scale_factor[2]);
356  else if (scale_factor == 0 && offset != 0)
357  lasreaderlas = new LASreaderLASreoffset(offset[0], offset[1], offset[2]);
358  else
359  lasreaderlas = new LASreaderLASrescalereoffset(scale_factor[0], scale_factor[1], scale_factor[2], offset[0], offset[1], offset[2]);
360  if (!lasreaderlas->open(file_name))
361  {
362  fprintf(stderr,"ERROR: cannot open lasreaderlas with file name '%s'\n", file_name);
363  delete lasreaderlas;
364  return 0;
365  }
366  LASindex* index = new LASindex();
367  if (index->read(file_name))
368  lasreaderlas->set_index(index);
369  else
370  delete index;
371  if (filter) lasreaderlas->set_filter(filter);
372  if (transform) lasreaderlas->set_transform(transform);
373  if (inside_tile) lasreaderlas->inside_tile(inside_tile[0], inside_tile[1], inside_tile[2]);
376  return lasreaderlas;
377  }
378  else if (strstr(file_name, ".bin") || strstr(file_name, ".BIN"))
379  {
380  LASreaderBIN* lasreaderbin;
381  if (scale_factor == 0 && offset == 0)
382  lasreaderbin = new LASreaderBIN();
383  else if (scale_factor != 0 && offset == 0)
384  lasreaderbin = new LASreaderBINrescale(scale_factor[0], scale_factor[1], scale_factor[2]);
385  else if (scale_factor == 0 && offset != 0)
386  lasreaderbin = new LASreaderBINreoffset(offset[0], offset[1], offset[2]);
387  else
388  lasreaderbin = new LASreaderBINrescalereoffset(scale_factor[0], scale_factor[1], scale_factor[2], offset[0], offset[1], offset[2]);
389  if (!lasreaderbin->open(file_name))
390  {
391  fprintf(stderr,"ERROR: cannot open lasreaderbin with file name '%s'\n", file_name);
392  delete lasreaderbin;
393  return 0;
394  }
395  LASindex* index = new LASindex();
396  if (index->read(file_name))
397  lasreaderbin->set_index(index);
398  else
399  delete index;
400  if (filter) lasreaderbin->set_filter(filter);
401  if (transform) lasreaderbin->set_transform(transform);
402  if (inside_tile) lasreaderbin->inside_tile(inside_tile[0], inside_tile[1], inside_tile[2]);
405  return lasreaderbin;
406  }
407  else if (strstr(file_name, ".shp") || strstr(file_name, ".SHP"))
408  {
409  LASreaderSHP* lasreadershp;
410  if (scale_factor == 0 && offset == 0)
411  lasreadershp = new LASreaderSHP();
412  else if (scale_factor != 0 && offset == 0)
413  lasreadershp = new LASreaderSHPrescale(scale_factor[0], scale_factor[1], scale_factor[2]);
414  else if (scale_factor == 0 && offset != 0)
415  lasreadershp = new LASreaderSHPreoffset(offset[0], offset[1], offset[2]);
416  else
417  lasreadershp = new LASreaderSHPrescalereoffset(scale_factor[0], scale_factor[1], scale_factor[2], offset[0], offset[1], offset[2]);
418  if (!lasreadershp->open(file_name))
419  {
420  fprintf(stderr,"ERROR: cannot open lasreadershp with file name '%s'\n", file_name);
421  delete lasreadershp;
422  return 0;
423  }
424  if (filter) lasreadershp->set_filter(filter);
425  if (transform) lasreadershp->set_transform(transform);
426  if (inside_tile) lasreadershp->inside_tile(inside_tile[0], inside_tile[1], inside_tile[2]);
429  return lasreadershp;
430  }
431  else if (strstr(file_name, ".qi") || strstr(file_name, ".QI"))
432  {
433  LASreaderQFIT* lasreaderqfit;
434  if (scale_factor == 0 && offset == 0)
435  lasreaderqfit = new LASreaderQFIT();
436  else if (scale_factor != 0 && offset == 0)
437  lasreaderqfit = new LASreaderQFITrescale(scale_factor[0], scale_factor[1], scale_factor[2]);
438  else if (scale_factor == 0 && offset != 0)
439  lasreaderqfit = new LASreaderQFITreoffset(offset[0], offset[1], offset[2]);
440  else
441  lasreaderqfit = new LASreaderQFITrescalereoffset(scale_factor[0], scale_factor[1], scale_factor[2], offset[0], offset[1], offset[2]);
442  if (!lasreaderqfit->open(file_name))
443  {
444  fprintf(stderr,"ERROR: cannot open lasreaderqfit with file name '%s'\n", file_name);
445  delete lasreaderqfit;
446  return 0;
447  }
448  LASindex* index = new LASindex();
449  if (index->read(file_name))
450  lasreaderqfit->set_index(index);
451  else
452  delete index;
453  if (filter) lasreaderqfit->set_filter(filter);
454  if (transform) lasreaderqfit->set_transform(transform);
455  if (inside_tile) lasreaderqfit->inside_tile(inside_tile[0], inside_tile[1], inside_tile[2]);
456  if (inside_circle) lasreaderqfit->inside_circle(inside_circle[0], inside_circle[1], inside_circle[2]);
458  return lasreaderqfit;
459  }
460  else
461  {
462  LASreaderTXT* lasreadertxt = new LASreaderTXT();
463  lasreadertxt->set_translate_intensity(translate_intensity);
464  lasreadertxt->set_scale_intensity(scale_intensity);
465  lasreadertxt->set_translate_scan_angle(translate_scan_angle);
466  lasreadertxt->set_scale_scan_angle(scale_scan_angle);
467  lasreadertxt->set_scale_factor(scale_factor);
468  lasreadertxt->set_offset(offset);
469  if (number_extra_attributes)
470  {
471  for (I32 i = 0; i < number_extra_attributes; i++)
472  {
473  lasreadertxt->add_extra_attribute(extra_attribute_data_types[i], extra_attribute_names[i], extra_attribute_descriptions[i], extra_attribute_scales[i], extra_attribute_offsets[i]);
474  }
475  }
476  if (!lasreadertxt->open(file_name, parse_string, skip_lines, populate_header))
477  {
478  fprintf(stderr,"ERROR: cannot open lasreadertxt with file name '%s'\n", file_name);
479  delete lasreadertxt;
480  return 0;
481  }
482  if (filter) lasreadertxt->set_filter(filter);
483  if (transform) lasreadertxt->set_transform(transform);
484  if (inside_tile) lasreadertxt->inside_tile(inside_tile[0], inside_tile[1], inside_tile[2]);
487  return lasreadertxt;
488  }
489  }
490  }
491  else if (use_stdin)
492  {
493  use_stdin = FALSE; populate_header = TRUE;
494  LASreaderLAS* lasreaderlas;
495  if (scale_factor == 0 && offset == 0)
496  lasreaderlas = new LASreaderLAS();
497  else if (scale_factor != 0 && offset == 0)
498  lasreaderlas = new LASreaderLASrescale(scale_factor[0], scale_factor[1], scale_factor[2]);
499  else if (scale_factor == 0 && offset != 0)
500  lasreaderlas = new LASreaderLASreoffset(offset[0], offset[1], offset[2]);
501  else
502  lasreaderlas = new LASreaderLASrescalereoffset(scale_factor[0], scale_factor[1], scale_factor[2], offset[0], offset[1], offset[2]);
503  if (!lasreaderlas->open(stdin))
504  {
505  fprintf(stderr,"ERROR: cannot open lasreaderlas from stdin \n");
506  delete lasreaderlas;
507  return 0;
508  }
509  if (filter) lasreaderlas->set_filter(filter);
510  if (transform) lasreaderlas->set_transform(transform);
511  if (inside_tile) lasreaderlas->inside_tile(inside_tile[0], inside_tile[1], inside_tile[2]);
514  return lasreaderlas;
515  }
516  else
517  {
518  return 0;
519  }
520 }
521 
523 {
524  if (file_names)
525  {
526  if ((file_name_number > 1) && merged)
527  {
528  LASreaderMerged* lasreadermerged = (LASreaderMerged*)lasreader;
529  if (!lasreadermerged->reopen())
530  {
531  fprintf(stderr,"ERROR: cannot reopen lasreadermerged\n");
532  return FALSE;
533  }
534  if (filter) lasreadermerged->reset_filter();
535  if (inside_tile) lasreadermerged->inside_tile(inside_tile[0], inside_tile[1], inside_tile[2]);
536  if (inside_circle) lasreadermerged->inside_circle(inside_circle[0], inside_circle[1], inside_circle[2]);
538  return TRUE;
539  }
540  else
541  {
542  if (!file_name) return FALSE;
543  if (strstr(file_name, ".las") || strstr(file_name, ".laz") || strstr(file_name, ".LAS") || strstr(file_name, ".LAZ"))
544  {
545  LASreaderLAS* lasreaderlas = (LASreaderLAS*)lasreader;
546  if (!lasreaderlas->open(file_name))
547  {
548  fprintf(stderr,"ERROR: cannot reopen lasreaderlas with file name '%s'\n", file_name);
549  return FALSE;
550  }
551  if (filter) lasreaderlas->reset_filter();
552  if (inside_tile) lasreaderlas->inside_tile(inside_tile[0], inside_tile[1], inside_tile[2]);
555  return TRUE;
556  }
557  else if (strstr(file_name, ".bin") || strstr(file_name, ".BIN"))
558  {
559  LASreaderBIN* lasreaderbin = (LASreaderBIN*)lasreader;
560  if (!lasreaderbin->open(file_name))
561  {
562  fprintf(stderr,"ERROR: cannot reopen lasreaderbin with file name '%s'\n", file_name);
563  return FALSE;
564  }
565  if (filter) lasreaderbin->reset_filter();
566  if (inside_tile) lasreaderbin->inside_tile(inside_tile[0], inside_tile[1], inside_tile[2]);
569  return TRUE;
570  }
571  else if (strstr(file_name, ".shp") || strstr(file_name, ".SHP"))
572  {
573  LASreaderSHP* lasreadershp = (LASreaderSHP*)lasreader;
574  if (!lasreadershp->reopen(file_name))
575  {
576  fprintf(stderr,"ERROR: cannot reopen lasreadershp with file name '%s'\n", file_name);
577  return FALSE;
578  }
579  if (filter) lasreadershp->reset_filter();
580  if (inside_tile) lasreadershp->inside_tile(inside_tile[0], inside_tile[1], inside_tile[2]);
583  return TRUE;
584  }
585  else if (strstr(file_name, ".qi") || strstr(file_name, ".QI"))
586  {
587  LASreaderQFIT* lasreaderqfit = (LASreaderQFIT*)lasreader;
588  if (!lasreaderqfit->reopen(file_name))
589  {
590  fprintf(stderr,"ERROR: cannot reopen lasreaderqfit with file name '%s'\n", file_name);
591  return FALSE;
592  }
593  if (filter) lasreaderqfit->reset_filter();
594  if (inside_tile) lasreaderqfit->inside_tile(inside_tile[0], inside_tile[1], inside_tile[2]);
595  if (inside_circle) lasreaderqfit->inside_circle(inside_circle[0], inside_circle[1], inside_circle[2]);
597  return TRUE;
598  }
599  else
600  {
601  LASreaderTXT* lasreadertxt = (LASreaderTXT*)lasreader;
602  if (!lasreadertxt->reopen(file_name))
603  {
604  fprintf(stderr,"ERROR: cannot reopen lasreadertxt with file name '%s'\n", file_name);
605  return FALSE;
606  }
607  if (filter) lasreadertxt->reset_filter();
608  if (inside_tile) lasreadertxt->inside_tile(inside_tile[0], inside_tile[1], inside_tile[2]);
611  return TRUE;
612  }
613  }
614  }
615  else
616  {
617  fprintf(stderr,"ERROR: no lasreader input specified\n");
618  return FALSE;
619  }
620 }
621 
623 {
624  if (lasheader->point_data_format < 4) return 0;
625  if (lasheader->vlr_wave_packet_descr == 0) return 0;
626  if (get_file_name() == 0) return 0;
627  LASwaveform13reader* waveform13reader = new LASwaveform13reader();
628  if ((lasheader->global_encoding & 2) && (lasheader->start_of_waveform_data_packet_record > lasheader->offset_to_point_data))
629  {
630  if (waveform13reader->open(get_file_name(), lasheader->start_of_waveform_data_packet_record, lasheader->vlr_wave_packet_descr))
631  {
632  return waveform13reader;
633  }
634  }
635  else
636  {
637  if (waveform13reader->open(get_file_name(), 0, lasheader->vlr_wave_packet_descr))
638  {
639  return waveform13reader;
640  }
641  }
642  delete waveform13reader;
643  return 0;
644 }
645 
647 {
648  fprintf(stderr,"Supported LAS Inputs\n");
649  fprintf(stderr," -i lidar.las\n");
650  fprintf(stderr," -i lidar.laz\n");
651  fprintf(stderr," -i lidar1.las lidar2.las lidar3.las -merged\n");
652  fprintf(stderr," -i *.las\n");
653  fprintf(stderr," -i flight0??.laz flight1??.laz -single\n");
654  fprintf(stderr," -i terrasolid.bin\n");
655  fprintf(stderr," -i esri.shp\n");
656  fprintf(stderr," -i nasa.qi\n");
657  fprintf(stderr," -i lidar.txt -iparse xyzti -iskip 2 (on-the-fly from ASCII)\n");
658  fprintf(stderr," -i lidar.txt -iparse xyzi -itranslate_intensity 1024\n");
659  fprintf(stderr," -lof file_list.txt\n");
660  fprintf(stderr," -stdin (pipe from stdin)\n");
661  fprintf(stderr," -rescale 0.1 0.1 0.1\n");
662  fprintf(stderr," -reoffset 600000 4000000 0\n");
663 }
664 
666 {
667  int i;
668  for (i = 1; i < argc; i++)
669  {
670  if (argv[i][0] == '\0')
671  {
672  continue;
673  }
674  else if (strcmp(argv[i],"-h") == 0 || strcmp(argv[i],"-help") == 0)
675  {
676  LASfilter().usage();
677  LAStransform().usage();
678  usage();
679  return TRUE;
680  }
681  else if (strcmp(argv[i],"-i") == 0)
682  {
683  if ((i+1) >= argc)
684  {
685  fprintf(stderr,"ERROR: '%s' needs at least 1 argument: file_name or wild_card\n", argv[i]);
686  return FALSE;
687  }
688  *argv[i]='\0';
689  i+=1;
690  do
691  {
692 #ifdef _WIN32
693  add_file_name_windows(argv[i]);
694 #else
695  add_file_name(argv[i]);
696 #endif
697  *argv[i]='\0';
698  i+=1;
699  } while (i < argc && *argv[i] != '-');
700  i-=1;
701  }
702  else if (strcmp(argv[i],"-inside_tile") == 0)
703  {
704  if ((i+3) >= argc)
705  {
706  fprintf(stderr,"ERROR: '%s' needs 3 arguments: ll_x, ll_y, size\n", argv[i]);
707  return FALSE;
708  }
709  if (inside_tile == 0) inside_tile = new F32[3];
710  inside_tile[0] = (F32)atof(argv[i+1]);
711  inside_tile[1] = (F32)atof(argv[i+2]);
712  inside_tile[2] = (F32)atof(argv[i+3]);
713  *argv[i]='\0'; *argv[i+1]='\0'; *argv[i+2]='\0'; *argv[i+3]='\0'; i+=3;
714  }
715  else if (strcmp(argv[i],"-inside_circle") == 0)
716  {
717  if ((i+3) >= argc)
718  {
719  fprintf(stderr,"ERROR: '%s' needs 3 arguments: center_x, center_y, radius\n", argv[i]);
720  return FALSE;
721  }
722  if (inside_circle == 0) inside_circle = new F64[3];
723  inside_circle[0] = atof(argv[i+1]);
724  inside_circle[1] = atof(argv[i+2]);
725  inside_circle[2] = atof(argv[i+3]);
726  *argv[i]='\0'; *argv[i+1]='\0'; *argv[i+2]='\0'; *argv[i+3]='\0'; i+=3;
727  }
728  else if (strcmp(argv[i],"-inside") == 0 || strcmp(argv[i],"-inside_rectangle") == 0)
729  {
730  if ((i+4) >= argc)
731  {
732  fprintf(stderr,"ERROR: '%s' needs 4 arguments: min_x, min_y, max_x, max_y\n", argv[i]);
733  return FALSE;
734  }
735  if (inside_rectangle == 0) inside_rectangle = new F64[4];
736  inside_rectangle[0] = atof(argv[i+1]);
737  inside_rectangle[1] = atof(argv[i+2]);
738  inside_rectangle[2] = atof(argv[i+3]);
739  inside_rectangle[3] = atof(argv[i+4]);
740  *argv[i]='\0'; *argv[i+1]='\0'; *argv[i+2]='\0'; *argv[i+3]='\0'; *argv[i+4]='\0'; i+=4;
741  }
742  else if (strcmp(argv[i],"-stdin") == 0)
743  {
744  use_stdin = TRUE;
745  *argv[i]='\0';
746  }
747  else if (strcmp(argv[i],"-lof") == 0)
748  {
749  if ((i+1) >= argc)
750  {
751  fprintf(stderr,"ERROR: '%s' needs 1 argument: list_of_files\n", argv[i]);
752  return FALSE;
753  }
754  FILE* file = fopen(argv[i+1], "r");
755  if (file == 0)
756  {
757  fprintf(stderr, "ERROR: cannot open '%s'\n", argv[i+1]);
758  return FALSE;
759  }
760  char line[1024];
761  while (fgets(line, 1024, file))
762  {
763  // find end of line
764  size_t len = strlen(line) - 1;
765  // remove extra white spaces and line return at the end
766  while (len > 0 && ((line[len] == '\n') || (line[len] == ' ') || (line[len] == '\t') || (line[len] == '\012')))
767  {
768  line[len] = '\0';
769  len--;
770  }
771  add_file_name(line);
772  }
773  *argv[i]='\0'; *argv[i+1]='\0'; i+=1;
774  }
775  else if (strcmp(argv[i],"-rescale") == 0)
776  {
777  if ((i+3) >= argc)
778  {
779  fprintf(stderr,"ERROR: '%s' needs 3 arguments: rescale_x, rescale_y, rescale_z\n", argv[i]);
780  return FALSE;
781  }
782  F64 scale_factor[3];
783  scale_factor[0] = atof(argv[i+1]);
784  scale_factor[1] = atof(argv[i+2]);
785  scale_factor[2] = atof(argv[i+3]);
786  set_scale_factor(scale_factor);
787  *argv[i]='\0'; *argv[i+1]='\0'; *argv[i+2]='\0'; *argv[i+3]='\0'; i+=3;
788  }
789  else if (strcmp(argv[i],"-reoffset") == 0)
790  {
791  if ((i+3) >= argc)
792  {
793  fprintf(stderr,"ERROR: '%s' needs 3 arguments: reoffset_x, reoffset_y, reoffset_z\n", argv[i]);
794  return FALSE;
795  }
796  F64 offset[3];
797  offset[0] = atof(argv[i+1]);
798  offset[1] = atof(argv[i+2]);
799  offset[2] = atof(argv[i+3]);
800  set_offset(offset);
801  *argv[i]='\0'; *argv[i+1]='\0'; *argv[i+2]='\0'; *argv[i+3]='\0'; i+=3;
802  }
803  else if (strcmp(argv[i],"-files_are_flightlines") == 0)
804  {
805  use_alternate = TRUE;
806  *argv[i]='\0';
807  }
808  else if (strcmp(argv[i],"-itranslate_intensity") == 0)
809  {
810  if ((i+1) >= argc)
811  {
812  fprintf(stderr,"ERROR: '%s' needs 1 argument: offset\n", argv[i]);
813  return FALSE;
814  }
815  set_translate_intensity((F32)atof(argv[i+1]));
816  *argv[i]='\0'; *argv[i+1]='\0'; i+=1;
817  }
818  else if (strcmp(argv[i],"-iscale_intensity") == 0)
819  {
820  if ((i+1) >= argc)
821  {
822  fprintf(stderr,"ERROR: '%s' needs 1 argument: scale\n", argv[i]);
823  return FALSE;
824  }
825  set_scale_intensity((F32)atof(argv[i+1]));
826  *argv[i]='\0'; *argv[i+1]='\0'; i+=1;
827  }
828  else if (strcmp(argv[i],"-itranslate_scan_angle") == 0)
829  {
830  if ((i+1) >= argc)
831  {
832  fprintf(stderr,"ERROR: '%s' needs 1 argument: offset\n", argv[i]);
833  return FALSE;
834  }
835  set_translate_scan_angle((F32)atof(argv[i+1]));
836  *argv[i]='\0'; *argv[i+1]='\0'; i+=1;
837  }
838  else if (strcmp(argv[i],"-iscale_scan_angle") == 0)
839  {
840  if ((i+1) >= argc)
841  {
842  fprintf(stderr,"ERROR: '%s' needs 1 argument: scale\n", argv[i]);
843  return FALSE;
844  }
845  set_scale_scan_angle((F32)atof(argv[i+1]));
846  *argv[i]='\0'; *argv[i+1]='\0'; i+=1;
847  }
848  else if (strcmp(argv[i],"-iadd_extra") == 0)
849  {
850  if ((i+3) >= argc)
851  {
852  fprintf(stderr,"ERROR: '%s' needs 3 arguments: data_type name description\n", argv[i]);
853  return FALSE;
854  }
855  if (((i+4) < argc) && (argv[i+4][0] != '-'))
856  {
857  if (((i+5) < argc) && (argv[i+5][0] != '-'))
858  {
859  add_extra_attribute(atoi(argv[i+1]), argv[i+2], argv[i+3], atof(argv[i+4]), atof(argv[i+5]));
860  *argv[i]='\0'; *argv[i+1]='\0'; *argv[i+2]='\0'; *argv[i+3]='\0'; *argv[i+4]='\0'; *argv[i+5]='\0'; i+=5;
861  }
862  else
863  {
864  add_extra_attribute(atoi(argv[i+1]), argv[i+2], argv[i+3], atof(argv[i+4]));
865  *argv[i]='\0'; *argv[i+1]='\0'; *argv[i+2]='\0'; *argv[i+3]='\0'; *argv[i+4]='\0'; i+=4;
866  }
867  }
868  else
869  {
870  add_extra_attribute(atoi(argv[i+1]), argv[i+2], argv[i+3]);
871  *argv[i]='\0'; *argv[i+1]='\0'; *argv[i+2]='\0'; *argv[i+3]='\0'; i+=3;
872  }
873  }
874  else if (strcmp(argv[i],"-iparse") == 0)
875  {
876  if ((i+1) >= argc)
877  {
878  fprintf(stderr,"ERROR: '%s' needs 1 argument: string\n", argv[i]);
879  return FALSE;
880  }
881  set_parse_string(argv[i+1]);
882  *argv[i]='\0'; *argv[i+1]='\0'; i+=1;
883  }
884  else if (strcmp(argv[i],"-iskip") == 0)
885  {
886  if ((i+1) >= argc)
887  {
888  fprintf(stderr,"ERROR: '%s' needs 1 argument: number_of_lines\n", argv[i]);
889  return FALSE;
890  }
891  set_skip_lines(atoi(argv[i+1]));
892  *argv[i]='\0'; *argv[i+1]='\0'; i+=1;
893  }
894  else if (strcmp(argv[i],"-single") == 0)
895  {
896  set_merged(FALSE);
897  *argv[i]='\0';
898  }
899  else if (strcmp(argv[i],"-merged") == 0)
900  {
901  set_merged(TRUE);
902  *argv[i]='\0';
903  }
904  else if (strcmp(argv[i],"-populate") == 0)
905  {
906  set_populate_header(TRUE);
907  *argv[i]='\0';
908  }
909  else if (strcmp(argv[i],"-do_not_populate") == 0)
910  {
911  set_populate_header(FALSE);
912  *argv[i]='\0';
913  }
914  }
915 
916  if (filter) filter->clean();
917  else filter = new LASfilter();
918  if (!filter->parse(argc, argv))
919  {
920  delete filter;
921  return FALSE;
922  }
923  if (!filter->active())
924  {
925  delete filter;
926  filter = 0;
927  }
928 
929  if (transform) transform->clean();
930  else transform = new LAStransform();
931  if (!transform->parse(argc, argv))
932  {
933  delete transform;
934  return FALSE;
935  }
936  if (!transform->active())
937  {
938  delete transform;
939  transform = 0;
940  }
941 
942  return TRUE;
943 }
944 
945 const char* LASreadOpener::get_file_name() const
946 {
947  if (file_name)
948  return file_name;
949  if (file_name_number)
950  return file_names[0];
951  return 0;
952 }
953 
954 const char* LASreadOpener::get_file_name(U32 number) const
955 {
956  return file_names[number];
957 }
958 
960 {
961  if (strstr(file_names[number], ".las") || strstr(file_names[number], ".LAS"))
962  {
963  return LAS_TOOLS_FORMAT_LAS;
964  }
965  else if (strstr(file_names[number], ".laz") || strstr(file_names[number], ".LAZ"))
966  {
967  return LAS_TOOLS_FORMAT_LAZ;
968  }
969  else if (strstr(file_names[number], ".bin") || strstr(file_names[number], ".BIN"))
970  {
971  return LAS_TOOLS_FORMAT_BIN;
972  }
973  else if (strstr(file_names[number], ".shp") || strstr(file_names[number], ".SHP"))
974  {
975  return LAS_TOOLS_FORMAT_SHP;
976  }
977  else if (strstr(file_names[number], ".qi") || strstr(file_names[number], ".QI"))
978  {
979  return LAS_TOOLS_FORMAT_QFIT;
980  }
981  else
982  {
983  return LAS_TOOLS_FORMAT_TXT;
984  }
985 }
986 
987 void LASreadOpener::set_merged(const BOOL merged)
988 {
989  this->merged = merged;
990 }
991 
993 {
994  return merged;
995 }
996 
997 void LASreadOpener::set_file_name(const char* file_name, BOOL unique)
998 {
999 #ifdef _WIN32
1000  add_file_name_windows(file_name, unique);
1001 #else
1002  add_file_name(file_name, unique);
1003 #endif
1004 }
1005 
1006 BOOL LASreadOpener::add_file_name(const char* file_name, BOOL unique)
1007 {
1008  if (unique)
1009  {
1010  U32 i;
1011  for (i = 0; i < file_name_number; i++)
1012  {
1013  if (strcmp(file_names[i], file_name) == 0)
1014  {
1015  return FALSE;
1016  }
1017  }
1018  }
1019  if (file_name_number == file_name_allocated)
1020  {
1021  if (file_names)
1022  {
1023  file_name_allocated *= 2;
1024  file_names = (char**)realloc(file_names, sizeof(char*)*file_name_allocated);
1025  }
1026  else
1027  {
1028  file_name_allocated = 16;
1029  file_names = (char**)malloc(sizeof(char*)*file_name_allocated);
1030  }
1031  if (file_names == 0)
1032  {
1033  fprintf(stderr, "ERROR: alloc for file_names pointer array failed at %d\n", file_name_allocated);
1034  }
1035  }
1036  file_names[file_name_number] = strdup(file_name);
1037  file_name_number++;
1038  return TRUE;
1039 }
1040 
1042 {
1043  if (file_name_id < file_name_number)
1044  {
1045  U32 i;
1046  free(file_names[file_name_id]);
1047  for (i = file_name_id+1; i < file_name_number; i++)
1048  {
1049  file_names[i-1] = file_names[i];
1050  }
1051  }
1052  file_name_number--;
1053 }
1054 
1056 {
1057  if (file_name_id < file_name_number)
1058  {
1059  file_name_current = file_name_id;
1060  return TRUE;
1061  }
1062  return FALSE;
1063 }
1064 
1065 #ifdef _WIN32
1066 #include <windows.h>
1067 void LASreadOpener::add_file_name_windows(const char* file_name, BOOL unique)
1068 {
1069  HANDLE h;
1070  WIN32_FIND_DATA info;
1071  h = FindFirstFile(file_name, &info);
1072  if (h != INVALID_HANDLE_VALUE)
1073  {
1074  // find the path
1075  size_t len = strlen(file_name);
1076  while (len && file_name[len] != '\\') len--;
1077  if (len)
1078  {
1079  len++;
1080  char full_file_name[512];
1081  strncpy(full_file_name, file_name, len);
1082  do
1083  {
1084  sprintf(&full_file_name[len], "%s", info.cFileName);
1085  add_file_name(full_file_name, unique);
1086  } while (FindNextFile(h, &info));
1087  }
1088  else
1089  {
1090  do
1091  {
1092  add_file_name(info.cFileName, unique);
1093  } while (FindNextFile(h, &info));
1094  }
1095  FindClose(h);
1096  }
1097 }
1098 #endif
1099 
1101 {
1102  return file_name_number;
1103 }
1104 
1105 void LASreadOpener::set_parse_string(const char* parse_string)
1106 {
1107  if (this->parse_string) free(this->parse_string);
1108  if (parse_string)
1109  {
1110  this->parse_string = strdup(parse_string);
1111  }
1112  else
1113  {
1114  this->parse_string = 0;
1115  }
1116 }
1117 
1119 {
1120  return parse_string;
1121 }
1122 
1123 void LASreadOpener::set_scale_factor(const F64* scale_factor)
1124 {
1125  if (scale_factor)
1126  {
1127  if (this->scale_factor == 0) this->scale_factor = new F64[3];
1128  this->scale_factor[0] = scale_factor[0];
1129  this->scale_factor[1] = scale_factor[1];
1130  this->scale_factor[2] = scale_factor[2];
1131  }
1132  else if (this->scale_factor)
1133  {
1134  delete [] this->scale_factor;
1135  this->scale_factor = 0;
1136  }
1137 }
1138 
1139 void LASreadOpener::set_offset(const F64* offset)
1140 {
1141  if (offset)
1142  {
1143  if (this->offset == 0) this->offset = new F64[3];
1144  this->offset[0] = offset[0];
1145  this->offset[1] = offset[1];
1146  this->offset[2] = offset[2];
1147  }
1148  else if (this->offset)
1149  {
1150  delete [] this->offset;
1151  this->offset = 0;
1152  }
1153 }
1154 
1156 {
1157  this->translate_intensity = translate_intensity;
1158 }
1159 
1161 {
1162  this->scale_intensity = scale_intensity;
1163 }
1164 
1166 {
1167  this->translate_scan_angle = translate_scan_angle;
1168 }
1169 
1171 {
1172  this->scale_scan_angle = scale_scan_angle;
1173 }
1174 
1175 void LASreadOpener::add_extra_attribute(I32 data_type, const char* name, const char* description, F64 scale, F64 offset)
1176 {
1177  extra_attribute_data_types[number_extra_attributes] = data_type;
1178  extra_attribute_names[number_extra_attributes] = (name ? strdup(name) : 0);
1179  extra_attribute_descriptions[number_extra_attributes] = (description ? strdup(description) : 0);
1180  extra_attribute_scales[number_extra_attributes] = scale;
1181  extra_attribute_offsets[number_extra_attributes] = offset;
1182  number_extra_attributes++;
1183 }
1184 
1186 {
1187  this->skip_lines = skip_lines;
1188 }
1189 
1191 {
1192  this->populate_header = populate_header;
1193 }
1194 
1196 {
1197  return ((file_name_current < file_name_number) || use_stdin);
1198 }
1199 
1201 {
1202  file_names = 0;
1203  file_name = 0;
1204  merged = TRUE;
1205  use_stdin = FALSE;
1206  scale_factor = 0;
1207  offset = 0;
1208  use_alternate = FALSE;
1209  translate_intensity = 0.0f;
1210  scale_intensity = 1.0f;
1211  translate_scan_angle = 0.0f;
1212  scale_scan_angle = 1.0f;
1213  number_extra_attributes = 0;
1214  for (I32 i = 0; i < 10; i++)
1215  {
1216  extra_attribute_data_types[i] = 0;
1217  extra_attribute_names[i] = 0;
1218  extra_attribute_descriptions[i] = 0;
1219  extra_attribute_scales[i] = 1.0;
1220  extra_attribute_offsets[i] = 0.0;
1221  }
1222  parse_string = 0;
1223  skip_lines = 0;
1224  populate_header = TRUE;
1225  file_name_number = 0;
1226  file_name_allocated = 0;
1227  file_name_current = 0;
1228  inside_tile = 0;
1229  inside_circle = 0;
1230  inside_rectangle = 0;
1231  filter = 0;
1232  transform = 0;
1233 }
1234 
1236 {
1237  if (file_names)
1238  {
1239  U32 i;
1240  for (i = 0; i < file_name_number; i++) free(file_names[i]);
1241  free(file_names);
1242  }
1243  if (parse_string) free(parse_string);
1244  if (scale_factor) delete [] scale_factor;
1245  if (offset) delete [] offset;
1246  if (inside_tile) delete [] inside_tile;
1247  if (inside_circle) delete [] inside_circle;
1248  if (inside_rectangle) delete [] inside_rectangle;
1249  if (filter) delete filter;
1250  if (transform) delete transform;
1251 }
BOOL intersect_rectangle(const F64 r_min_x, const F64 r_min_y, const F64 r_max_x, const F64 r_max_y)
Definition: lasindex.cpp:217
void delete_file_name(U32 file_name_id)
Definition: lasreader.cpp:1041
BOOL open(const char *file_name)
BOOL read(const char *file_name)
Definition: lasindex.cpp:267
int BOOL
Definition: mydefs.hpp:57
BOOL filter(const LASpoint *point)
Definition: lasfilter.cpp:1531
BOOL inside_tile(const F32 ll_x, const F32 ll_y, const F32 size)
virtual BOOL inside_circle(const F64 center_x, const F64 center_y, const F64 radius)
Definition: lasreader.cpp:157
F64 c_radius_squared
Definition: lasreader.hpp:114
void set_scale_scan_angle(F32 scale_scan_angle)
#define FALSE
Definition: mydefs.hpp:133
void add_extra_attribute(I32 data_type, const char *name, const char *description=0, F64 scale=1.0, F64 offset=0.0)
Definition: lasreader.cpp:1175
BOOL read_point_inside_tile()
Definition: lasreader.cpp:213
void clean()
Definition: lasfilter.cpp:790
float F32
Definition: mydefs.hpp:51
void set_parse_string(const char *parse_string)
void set_populate_header(BOOL populate_header)
BOOL get_merged() const
Definition: lasreader.cpp:992
void set_translate_intensity(F32 translate_intensity)
void set_skip_lines(I32 skip_lines)
Definition: lasreader.cpp:1185
BOOL(LASreader::* read_complex)()
Definition: lasreader.hpp:118
LASheader header
Definition: lasreader.hpp:52
LASwaveform13reader * open_waveform13(const LASheader *lasheader)
Definition: lasreader.cpp:622
void set_filter(LASfilter *filter)
BOOL seek_next(LASreader *lasreader)
Definition: lasindex.cpp:453
LASindex * index
Definition: lasreader.hpp:106
U32 get_file_name_number() const
Definition: lasreader.cpp:1100
BOOL read_point_inside_circle()
Definition: lasreader.cpp:231
#define LAS_TOOLS_FORMAT_SHP
void set_scale_factor(const F64 *scale_factor)
Definition: lasreader.cpp:1123
LASpoint point
Definition: lasreader.hpp:53
void set_offset(const F64 *offset)
unsigned int U32
Definition: mydefs.hpp:39
BOOL intersect_circle(const F64 center_x, const F64 center_y, const F64 radius)
Definition: lasindex.cpp:237
I64 p_count
Definition: lasreader.hpp:56
virtual BOOL inside_tile(const F32 ll_x, const F32 ll_y, const F32 size)
Definition: lasreader.cpp:128
U64 start_of_waveform_data_packet_record
void set_scale_intensity(F32 scale_intensity)
BOOL inside_rectangle(const F64 r_min_x, const F64 r_min_y, const F64 r_max_x, const F64 r_max_y) const
F64 c_center_x
Definition: lasreader.hpp:114
virtual ~LASreader()
Definition: lasreader.cpp:71
LAStransform * transform
Definition: lasreader.hpp:110
BOOL has_populated_header() const
Definition: lasreader.cpp:301
BOOL read_point_inside_tile_indexed()
Definition: lasreader.cpp:222
I64 npoints
Definition: lasreader.hpp:55
F64 c_center_y
Definition: lasreader.hpp:114
void use_alternate_reader()
Definition: lasreader.hpp:67
#define LAS_TOOLS_FORMAT_LAS
void reset_filter()
Definition: lasreader.cpp:123
#define LAS_TOOLS_FORMAT_LAZ
BOOL add_file_name(const char *file_name, BOOL unique=FALSE)
Definition: lasreader.cpp:1006
void set_scale_scan_angle(F32 scale_scan_angle)
void set_translate_scan_angle(F32 translate_scan_angle)
Definition: lasreader.cpp:1165
void add_extra_attribute(I32 data_type, const char *name, const char *description=0, F64 scale=1.0, F64 offset=0.0)
void set_translate_intensity(F32 translate_intensity)
Definition: lasreader.cpp:1155
virtual BOOL read_point_default()=0
BOOL piped() const
Definition: lasreader.cpp:296
BOOL parse(int argc, char *argv[])
Definition: lasfilter.cpp:866
BOOL open(const char *file_name, I64 start_of_waveform_data_packet_record, const LASvlr_wave_packet_descr *const *wave_packet_descr)
BOOL inside_circle(const F64 center_x, const F64 center_y, F64 squared_radius) const
void set_populate_header(BOOL populate_header)
Definition: lasreader.cpp:1190
LASvlr_wave_packet_descr ** vlr_wave_packet_descr
void set_merged(const BOOL merged)
Definition: lasreader.cpp:987
F64 c_radius
Definition: lasreader.hpp:114
void set_scale_scan_angle(F32 scale_scan_angle)
Definition: lasreader.cpp:1170
void set_translate_scan_angle(F32 translate_scan_angle)
BOOL inside_circle(const F64 center_x, const F64 center_y, const F64 radius)
void set_file_name(const char *file_name, BOOL unique=FALSE)
Definition: lasreader.cpp:997
void set_translate_intensity(F32 translate_intensity)
const char * get_parse_string() const
Definition: lasreader.cpp:1118
void set_translate_scan_angle(F32 translate_scan_angle)
BOOL intersect_tile(const F32 ll_x, const F32 ll_y, const F32 size)
Definition: lasindex.cpp:227
virtual BOOL inside_rectangle(const F64 min_x, const F64 min_y, const F64 max_x, const F64 max_y)
Definition: lasreader.cpp:185
FILE * file
BOOL set_file_name_current(U32 file_name_id)
Definition: lasreader.cpp:1055
int I32
Definition: mydefs.hpp:35
void set_scale_factor(const F64 *scale_factor)
void usage() const
Definition: lasfilter.cpp:805
void set_offset(const F64 *offset)
Definition: lasreader.cpp:1139
I32 get_file_format(U32 number) const
Definition: lasreader.cpp:959
BOOL reopen(const char *file_name)
void usage() const
#define LAS_TOOLS_FORMAT_BIN
void set_offset(const F64 *offset)
BOOL parse(int argc, char *argv[])
Definition: lasreader.cpp:665
virtual BOOL open(const char *file_name)
void usage() const
Definition: lasreader.cpp:646
void set_transform(LAStransform *transform)
void set_scale_intensity(F32 scale_intensity)
Definition: lasreader.cpp:1160
void set_parse_string(const char *parse_string)
Definition: lasreader.cpp:1105
virtual void set_filter(LASfilter *filter)
Definition: lasreader.cpp:87
BOOL read_point_inside_rectangle()
Definition: lasreader.cpp:249
void reset()
Definition: lasfilter.cpp:1546
BOOL inside_tile(const F32 ll_x, const F32 ll_y, const F32 ur_x, const F32 ur_y) const
#define LAS_TOOLS_FORMAT_TXT
BOOL inside_rectangle(const F64 min_x, const F64 min_y, const F64 max_x, const F64 max_y)
void set_index(LASindex *index)
Definition: lasreader.cpp:76
BOOL reopen(const char *file_name)
BOOL open(const char *file_name, U32 io_buffer_size=65536)
BOOL read_point_filtered_and_transformed()
Definition: lasreader.cpp:286
LASfilter * filter
Definition: lasreader.hpp:109
BOOL add_file_name(const char *file_name)
BOOL reopen(LASreader *lasreader)
Definition: lasreader.cpp:522
BOOL read_point_filtered()
Definition: lasreader.cpp:267
#define LAS_TOOLS_FORMAT_QFIT
U32 offset_to_point_data
const char * get_file_name() const
Definition: lasreader.cpp:945
BOOL read_point_transformed()
Definition: lasreader.cpp:276
#define TRUE
Definition: mydefs.hpp:137
LASindex * get_index() const
Definition: lasreader.cpp:82
void set_scale_intensity(F32 scale_intensity)
void set_scale_factor(const F64 *scale_factor)
LASreader * open()
Definition: lasreader.cpp:312
BOOL open(const char *file_name)
BOOL active() const
Definition: lasreader.cpp:1195
BOOL active() const
Definition: lasfilter.hpp:54
BOOL read_point_inside_rectangle_indexed()
Definition: lasreader.cpp:258
virtual void set_transform(LAStransform *transform)
Definition: lasreader.cpp:105
BOOL reopen(const char *file_name)
virtual BOOL open(const char *file_name, const char *parse_string=0, I32 skip_lines=0, BOOL populate_header=FALSE)
BOOL read_point_inside_circle_indexed()
Definition: lasreader.cpp:240
void set_skip_lines(I32 skip_lines)
BOOL(LASreader::* read_simple)()
Definition: lasreader.hpp:117
double F64
Definition: mydefs.hpp:52
char ** argv


lvr2
Author(s): Thomas Wiemann , Sebastian Pütz , Alexander Mock , Lars Kiesow , Lukas Kalbertodt , Tristan Igelbrink , Johan M. von Behren , Dominik Feldschnieders , Alexander Löhr
autogenerated on Mon Feb 28 2022 22:46:07