1
/***************************************************************************
5
* Project: libLAS -- C/C++ read/write library for LAS LIDAR data
6
* Purpose: LAS translation with optional configuration
7
* Author: Martin Isenburg isenburg@cs.unc.edu
8
***************************************************************************
9
* Copyright (c) 2007, Martin Isenburg isenburg@cs.unc.edu
11
* See LICENSE.txt in this source distribution for more information.
12
**************************************************************************/
22
LASPointSummary* SummarizePoints(LASReaderH reader);
23
void print_point_summary(FILE *file, LASPointSummary* summary, LASHeaderH header);
24
void print_point(FILE *file, LASPointH point);
25
void print_header(FILE *file, LASHeaderH header, const char* file_name, int bSkipVLR);
26
void repair_header(FILE *file, LASHeaderH header, LASPointSummary* summary) ;
28
#define LAS_FORMAT_10 0
29
#define LAS_FORMAT_11 1
30
#define LAS_FORMAT_12 2
34
fprintf(stderr,"----------------------------------------------------------\n");
35
fprintf(stderr," las2las (version %s) usage:\n", LAS_GetVersion());
36
fprintf(stderr,"----------------------------------------------------------\n");
39
fprintf(stderr,"Clip las file to a bounding box, throwing out points that have invalid data:\n");
40
fprintf(stderr," las2las -i in.las -clip 63000000 483450000 63050000 483500000 -o out.las --skip_invalid\n");
43
fprintf(stderr,"Read from stdin, eliminate intensities below 2000, and write to stdout:\n");
44
fprintf(stderr," las2las --eliminate_intensity_below 2000 --stdin --stdout < in.las > out.las \n");
47
fprintf(stderr,"Eliminate return number two:\n");
48
fprintf(stderr," las2las -i in.las -eliminate_return 2 -o out.las\n");
51
fprintf(stderr,"Eliminate scan angles above 15:\n");
52
fprintf(stderr," las2las -i in.las -eliminate_scan_angle_above 15 -o out.las\n");
55
fprintf(stderr,"Eliminate intensities below 1000:\n");
56
fprintf(stderr," las2las -i in.las -eliminate_intensity_below 1000 --stdout > out.las\n");
59
fprintf(stderr,"Eliminate intensities below 1000 and classifications that equal 2 (ground):\n");
60
fprintf(stderr," las2las -i in.las --eliminate_class 2 --out out.las\n");
63
fprintf(stderr,"Capture only first returns and clip to bounding box:\n");
64
fprintf(stderr," las2las -i in.las -first_only -clip 63000000 483450000 63050000 483500000 -o out.las\n");
67
fprintf(stderr,"Capture only last returns, eliminate intensities below 2000, and write to stdout:\n");
68
fprintf(stderr," las2las --input in.las --last_only --eliminate_intensity_below 2000 --stdout > out.las\n");
72
fprintf(stderr, "\nFor more information, see the full documentation for las2las at:\n"
73
" http://liblas.org/browser/trunk/doc/las2las.txt\n");
74
fprintf(stderr,"----------------------------------------------------------\n");
78
void ptime(const char *const msg)
80
float t= ((float)clock())/CLOCKS_PER_SEC;
81
fprintf(stderr, "cumulative CPU time thru %s = %f\n", msg, t);
84
int main(int argc, char *argv[])
88
int use_stdin = FALSE;
89
int use_stdout = FALSE;
90
char* file_name_in = 0;
91
char* file_name_out = 0;
92
double *clip_xy_min = NULL;
93
double *clip_xy_max = NULL;
95
int remove_extra_header = FALSE;
97
int elim_scan_angle_above = 0;
98
int elim_intensity_below = 0;
101
int first_only = FALSE;
102
int last_only = FALSE;
103
int skip_invalid = FALSE;
104
int format = LAS_FORMAT_12;
106
LASReaderH reader = NULL;
107
LASHeaderH header = NULL;
108
LASHeaderH surviving_header = NULL;
110
LASWriterH writer = NULL;
112
int first_surviving_point = TRUE;
113
unsigned int surviving_number_of_point_records = 0;
114
unsigned int surviving_number_of_points_by_return[] = {0,0,0,0,0,0,0,0};
115
LASPointH surviving_point_min = NULL;
116
LASPointH surviving_point_max = NULL;
117
double surviving_gps_time_min;
118
double surviving_gps_time_max;
121
int eliminated_return = 0;
122
int eliminated_scan_angle = 0;
123
int eliminated_intensity = 0;
124
int eliminated_class = 0;
125
int eliminated_first_only = 0;
126
int eliminated_last_only = 0;
128
double minx, maxx, miny, maxy, minz, maxz;
130
LASPointSummary* summary = NULL;
132
for (i = 1; i < argc; i++) {
133
if ( strcmp(argv[i],"-h") == 0 ||
134
strcmp(argv[i],"--help") == 0
140
else if ( strcmp(argv[i],"-v") == 0 ||
141
strcmp(argv[i],"--verbose") == 0
146
else if ( strcmp(argv[i],"-s") == 0 ||
147
strcmp(argv[i],"--skip_invalid") == 0
152
else if ( strcmp(argv[i],"--input") == 0 ||
153
strcmp(argv[i],"-input") == 0 ||
154
strcmp(argv[i],"-i") == 0 ||
155
strcmp(argv[i],"-in") == 0
159
file_name_in = argv[i];
161
else if ( strcmp(argv[i],"--output") == 0 ||
162
strcmp(argv[i],"--out") == 0 ||
163
strcmp(argv[i],"-out") == 0 ||
164
strcmp(argv[i],"-o") == 0
168
file_name_out = argv[i];
171
else if ( strcmp(argv[i],"--stdout") == 0 ||
172
strcmp(argv[i],"-olas") == 0
176
file_name_out = "stdout";
178
else if ( strcmp(argv[i],"--clip") == 0 ||
179
strcmp(argv[i],"-clip") == 0 ||
180
strcmp(argv[i],"-clip_xy") == 0
183
clip_xy_min = (double*) malloc (2 * sizeof(double));
184
clip_xy_max = (double*) malloc( 2 * sizeof(double));
186
clip_xy_min[0] = atof(argv[i]);
188
clip_xy_min[1] = atof(argv[i]);
190
clip_xy_max[0] = atof(argv[i]);
192
clip_xy_max[1] = atof(argv[i]);
195
else if ( strcmp(argv[i],"--format") == 0 ||
196
strcmp(argv[i],"-f") == 0 ||
197
strcmp(argv[i],"-format") == 0
201
if (strcmp(argv[i], "1.0") == 0) {
202
format = LAS_FORMAT_10;
204
else if (strcmp(argv[i], "1.1") == 0) {
205
format = LAS_FORMAT_11;
207
else if (strcmp(argv[i], "1.2") == 0) {
208
format = LAS_FORMAT_12;
211
LASError_Print("Format must be specified as 1.0, 1.1, or 1.2");
216
else if ( strcmp(argv[i],"--eliminate_return") == 0 ||
217
strcmp(argv[i],"-eliminate_return") == 0 ||
218
strcmp(argv[i],"-elim_return") == 0 ||
219
strcmp(argv[i],"-elim_ret") == 0
223
elim_return |= (1 << atoi(argv[i]));
225
else if ( strcmp(argv[i],"--eliminate_scan_angle_above") == 0 ||
226
strcmp(argv[i],"-eliminate_scan_angle_above") == 0 ||
227
strcmp(argv[i],"-elim_scan_angle_above") == 0 ||
228
strcmp(argv[i],"--clip_scan_above") == 0
232
elim_scan_angle_above = atoi(argv[i]);
234
else if ( strcmp(argv[i],"--eliminate_class") == 0 ||
235
strcmp(argv[i],"-eliminate_class") == 0 ||
236
strcmp(argv[i],"-elim_class") == 0 ||
237
strcmp(argv[i],"--class") == 0
241
elim_class = atoi(argv[i]);
243
else if ( strcmp(argv[i],"--eliminate_intensity_below") == 0 ||
244
strcmp(argv[i],"-eliminate_intensity_below") == 0 ||
245
strcmp(argv[i],"-elim_intensity_below") == 0 ||
246
strcmp(argv[i],"--clip_intensity_below") == 0
250
elim_intensity_below = atoi(argv[i]);
252
else if ( strcmp(argv[i], "--stdin") == 0 ||
253
strcmp(argv[i], "-ilas") == 0
258
else if ( strcmp(argv[i], "--first_only") == 0 ||
259
strcmp(argv[i], "-first_only") == 0
264
else if ( strcmp(argv[i], "--last_only") == 0 ||
265
strcmp(argv[i], "-last_only") == 0
270
else if ( strcmp(argv[i], "--remove_extra_header") == 0 ||
271
strcmp(argv[i], "-remove_extra_header") == 0
274
remove_extra_header = TRUE;
276
else if (file_name_in == NULL && file_name_out == NULL)
278
file_name_in = argv[i];
280
else if (file_name_in != NULL && file_name_out == NULL)
282
file_name_out = argv[i];
286
fprintf(stderr, "ERROR: unknown argument '%s'\n",argv[i]);
292
if (use_stdin) file_name_in="stdin";
295
reader = LASReader_Create(file_name_in);
297
LASError_Print("Could not open file to read");
303
LASError_Print("no input specified");
309
header = LASReader_GetHeader(reader);
311
LASError_Print("Could not fetch header");
317
fprintf(stderr, "first pass reading %d points ...\n", LASHeader_GetPointRecordsCount(header));
320
p = LASReader_GetNextPoint(reader);
323
if (LASError_GetLastErrorNum())
324
LASError_Print("Not able to fetch a point. LASReader is invalid");
326
LASError_Print("File does not contain any points to read.");
333
if (last_only && LASPoint_GetReturnNumber(p) != LASPoint_GetNumberOfReturns(p))
335
eliminated_last_only++;
336
p = LASReader_GetNextPoint(reader);
339
if (first_only && LASPoint_GetReturnNumber(p) != 1)
341
eliminated_first_only++;
342
p = LASReader_GetNextPoint(reader);
346
if (clip && (LASPoint_GetX(p) < clip_xy_min[0] || LASPoint_GetY(p) < clip_xy_min[1]))
349
p = LASReader_GetNextPoint(reader);
352
if (clip && (LASPoint_GetX(p) > clip_xy_max[0] || LASPoint_GetY(p) > clip_xy_max[1]))
355
p = LASReader_GetNextPoint(reader);
358
if (elim_return && (elim_return & (1 << LASPoint_GetReturnNumber(p))))
361
p = LASReader_GetNextPoint(reader);
364
if (elim_scan_angle_above && (LASPoint_GetScanAngleRank(p) > elim_scan_angle_above || LASPoint_GetScanAngleRank(p) < -elim_scan_angle_above))
366
eliminated_scan_angle++;
367
p = LASReader_GetNextPoint(reader);
371
clsidx = LASPoint_GetClassification(p);
372
clsidx = (clsidx & 31); // 31 is max index in classification lookup table
373
assert(clsidx <= 31);
374
if (elim_class && (elim_class == clsidx))
377
p = LASReader_GetNextPoint(reader);
381
if (elim_intensity_below && LASPoint_GetIntensity(p) < elim_intensity_below)
383
eliminated_intensity++;
384
p = LASReader_GetNextPoint(reader);
387
surviving_number_of_point_records++;
389
if (LASPoint_GetReturnNumber(p))
390
surviving_number_of_points_by_return[LASPoint_GetReturnNumber(p)-1]++;
392
surviving_number_of_points_by_return[LASPoint_GetReturnNumber(p)]++;
394
if (first_surviving_point)
396
surviving_point_min = LASPoint_Copy(p);
397
surviving_point_max = LASPoint_Copy(p);
398
surviving_gps_time_min = LASPoint_GetTime(p);
399
surviving_gps_time_max = LASPoint_GetTime(p);
400
first_surviving_point = FALSE;
404
if (LASPoint_GetX(p) < LASPoint_GetX(surviving_point_min))
405
LASPoint_SetX(surviving_point_min,LASPoint_GetX(p));
406
else if (LASPoint_GetX(p) > LASPoint_GetX(surviving_point_max))
407
LASPoint_SetX(surviving_point_max,LASPoint_GetX(p));
409
if (LASPoint_GetY(p) < LASPoint_GetY(surviving_point_min))
410
LASPoint_SetY(surviving_point_min,LASPoint_GetY(p));
411
else if (LASPoint_GetY(p) > LASPoint_GetY(surviving_point_max))
412
LASPoint_SetY(surviving_point_max,LASPoint_GetY(p));
414
if (LASPoint_GetZ(p) < LASPoint_GetZ(surviving_point_min))
415
LASPoint_SetZ(surviving_point_min,LASPoint_GetZ(p));
416
else if (LASPoint_GetZ(p) > LASPoint_GetZ(surviving_point_max))
417
LASPoint_SetZ(surviving_point_max,LASPoint_GetZ(p));
419
if (LASPoint_GetIntensity(p) < LASPoint_GetIntensity(surviving_point_min))
420
LASPoint_SetIntensity(surviving_point_min,LASPoint_GetIntensity(p));
421
else if (LASPoint_GetIntensity(p) > LASPoint_GetIntensity(surviving_point_max))
422
LASPoint_SetIntensity(surviving_point_max,LASPoint_GetIntensity(p));
424
if (LASPoint_GetFlightLineEdge(p) < LASPoint_GetFlightLineEdge(surviving_point_min))
425
LASPoint_SetFlightLineEdge(surviving_point_min,LASPoint_GetFlightLineEdge(p));
426
else if (LASPoint_GetFlightLineEdge(p) > LASPoint_GetFlightLineEdge(surviving_point_max))
427
LASPoint_SetFlightLineEdge(surviving_point_max,LASPoint_GetFlightLineEdge(p));
429
if (LASPoint_GetScanDirection(p) < LASPoint_GetScanDirection(surviving_point_min))
430
LASPoint_SetScanDirection(surviving_point_min,LASPoint_GetScanDirection(p));
431
else if (LASPoint_GetScanDirection(p) > LASPoint_GetScanDirection(surviving_point_max))
432
LASPoint_SetScanDirection(surviving_point_max,LASPoint_GetScanDirection(p));
434
if (LASPoint_GetNumberOfReturns(p) < LASPoint_GetNumberOfReturns(surviving_point_min))
435
LASPoint_SetNumberOfReturns(surviving_point_min,LASPoint_GetNumberOfReturns(p));
436
else if (LASPoint_GetNumberOfReturns(p) > LASPoint_GetNumberOfReturns(surviving_point_max))
437
LASPoint_SetNumberOfReturns(surviving_point_max,LASPoint_GetNumberOfReturns(p));
439
if (LASPoint_GetReturnNumber(p) < LASPoint_GetReturnNumber(surviving_point_min))
440
LASPoint_SetReturnNumber(surviving_point_min,LASPoint_GetReturnNumber(p));
441
else if (LASPoint_GetReturnNumber(p) > LASPoint_GetReturnNumber(surviving_point_max))
442
LASPoint_SetReturnNumber(surviving_point_max,LASPoint_GetReturnNumber(p));
444
if (LASPoint_GetClassification(p) < LASPoint_GetClassification(surviving_point_min))
445
LASPoint_SetClassification(surviving_point_min,LASPoint_GetClassification(p));
446
else if (LASPoint_GetReturnNumber(p) > LASPoint_GetClassification(surviving_point_max))
447
LASPoint_SetClassification(surviving_point_max,LASPoint_GetClassification(p));
449
if (LASPoint_GetScanAngleRank(p) < LASPoint_GetScanAngleRank(surviving_point_min))
450
LASPoint_SetScanAngleRank(surviving_point_min,LASPoint_GetScanAngleRank(p));
451
else if (LASPoint_GetScanAngleRank(p) > LASPoint_GetScanAngleRank(surviving_point_max))
452
LASPoint_SetScanAngleRank(surviving_point_max,LASPoint_GetScanAngleRank(p));
454
if (LASPoint_GetUserData(p) < LASPoint_GetUserData(surviving_point_min))
455
LASPoint_SetUserData(surviving_point_min,LASPoint_GetUserData(p));
456
else if (LASPoint_GetUserData(p) > LASPoint_GetUserData(surviving_point_max))
457
LASPoint_SetUserData(surviving_point_max,LASPoint_GetUserData(p));
459
if (LASPoint_GetTime(p) < LASPoint_GetTime(surviving_point_min))
460
LASPoint_SetTime(surviving_point_min,LASPoint_GetTime(p));
461
else if (LASPoint_GetTime(p) > LASPoint_GetTime(surviving_point_max))
462
LASPoint_SetTime(surviving_point_max,LASPoint_GetTime(p));
465
if (lasreader->point.point_source_ID < surviving_point_min.point_source_ID) surviving_point_min.point_source_ID = lasreader->point.point_source_ID;
466
else if (lasreader->point.point_source_ID > surviving_point_max.point_source_ID) surviving_point_max.point_source_ID = lasreader->point.point_source_ID;
470
p = LASReader_GetNextPoint(reader);
473
if (eliminated_first_only)
475
"eliminated based on first returns only: %d\n",
476
eliminated_first_only);
477
if (eliminated_last_only)
479
"eliminated based on last returns only: %d\n",
480
eliminated_last_only);
481
if (eliminated_class)
483
"eliminated classification: %d\n",
489
if (eliminated_return)
491
"eliminated based on return number: %d\n",
493
if (eliminated_scan_angle)
495
"eliminated based on scan angle: %d\n",
496
eliminated_scan_angle);
497
if (eliminated_intensity)
499
"eliminated based on intensity: %d\n",
500
eliminated_intensity);
502
LASReader_Destroy(reader);
503
LASHeader_Destroy(header);
508
"x %.3f %.3f %.3f\n",
509
LASPoint_GetX(surviving_point_min),
510
LASPoint_GetX(surviving_point_max),
511
LASPoint_GetX(surviving_point_max) - LASPoint_GetX(surviving_point_min)
514
"y %.3f %.3f %.3f\n",
515
LASPoint_GetY(surviving_point_min),
516
LASPoint_GetY(surviving_point_max),
517
LASPoint_GetY(surviving_point_max) - LASPoint_GetY(surviving_point_min)
520
"z %.3f %.3f %.3f\n",
521
LASPoint_GetZ(surviving_point_min),
522
LASPoint_GetZ(surviving_point_max),
523
LASPoint_GetZ(surviving_point_max) - LASPoint_GetZ(surviving_point_min)
526
"intensity %d %d %d\n",
527
LASPoint_GetIntensity(surviving_point_min),
528
LASPoint_GetIntensity(surviving_point_max),
529
LASPoint_GetIntensity(surviving_point_max) - LASPoint_GetIntensity(surviving_point_min)
532
"edge_of_flight_line %d %d %d\n",
533
LASPoint_GetFlightLineEdge(surviving_point_min),
534
LASPoint_GetFlightLineEdge(surviving_point_max),
535
LASPoint_GetFlightLineEdge(surviving_point_max) - LASPoint_GetFlightLineEdge(surviving_point_min)
538
"scan_direction_flag %d %d %d\n",
539
LASPoint_GetScanDirection(surviving_point_min),
540
LASPoint_GetScanDirection(surviving_point_max),
541
LASPoint_GetScanDirection(surviving_point_max) - LASPoint_GetScanDirection(surviving_point_min)
544
"number_of_returns_of_given_pulse %d %d %d\n",
545
LASPoint_GetNumberOfReturns(surviving_point_min),
546
LASPoint_GetNumberOfReturns(surviving_point_max),
547
LASPoint_GetNumberOfReturns(surviving_point_max) - LASPoint_GetNumberOfReturns(surviving_point_min)
550
"return_number %d %d %d\n",
551
LASPoint_GetReturnNumber(surviving_point_min),
552
LASPoint_GetReturnNumber(surviving_point_max),
553
LASPoint_GetReturnNumber(surviving_point_max) - LASPoint_GetReturnNumber(surviving_point_min)
556
"classification %d %d %d\n",
557
LASPoint_GetClassification(surviving_point_min),
558
LASPoint_GetClassification(surviving_point_max),
559
LASPoint_GetClassification(surviving_point_max) - LASPoint_GetClassification(surviving_point_min)
562
"scan_angle_rank %d %d %d\n",
563
LASPoint_GetScanAngleRank(surviving_point_min),
564
LASPoint_GetScanAngleRank(surviving_point_max),
565
LASPoint_GetScanAngleRank(surviving_point_max) - LASPoint_GetScanAngleRank(surviving_point_min)
568
"user_data %d %d %d\n",
569
LASPoint_GetUserData(surviving_point_min),
570
LASPoint_GetUserData(surviving_point_max),
571
LASPoint_GetUserData(surviving_point_max) - LASPoint_GetUserData(surviving_point_min)
574
"gps_time %.8f %.8f %.8f\n",
575
LASPoint_GetTime(surviving_point_min),
576
LASPoint_GetTime(surviving_point_max),
577
LASPoint_GetTime(surviving_point_max) - LASPoint_GetTime(surviving_point_min)
580
fprintf(stderr, "point_source_ID %d %d %d\n",surviving_point_min.point_source_ID, surviving_point_max.point_source_ID, surviving_point_max.point_source_ID - surviving_point_min.point_source_ID);
585
if (file_name_out == NULL && !use_stdout)
587
LASError_Print("no output specified. exiting...");
594
reader = LASReader_Create(file_name_in);
596
LASError_Print("Could not open file to read");
602
LASError_Print("no input specified");
608
header = LASReader_GetHeader(reader);
610
LASError_Print("Could not read header");
615
surviving_header = LASHeader_Copy(header);
617
LASHeader_SetPointRecordsCount(surviving_header, surviving_number_of_point_records);
618
LASHeader_SetSystemId(surviving_header, "MODIFICATION");
620
for (i = 0; i < 5; i++) LASHeader_SetPointRecordsByReturnCount(surviving_header, i, surviving_number_of_points_by_return[i]);
622
minx = LASPoint_GetX(surviving_point_min) * LASHeader_GetScaleX(surviving_header) + LASHeader_GetOffsetX(surviving_header);
623
maxx = LASPoint_GetX(surviving_point_max) * LASHeader_GetScaleX(surviving_header) + LASHeader_GetOffsetX(surviving_header);
625
miny = LASPoint_GetY(surviving_point_min) * LASHeader_GetScaleY(surviving_header) + LASHeader_GetOffsetY(surviving_header);
626
maxy = LASPoint_GetY(surviving_point_max) * LASHeader_GetScaleY(surviving_header) + LASHeader_GetOffsetY(surviving_header);
628
minz = LASPoint_GetZ(surviving_point_min) * LASHeader_GetScaleZ(surviving_header) + LASHeader_GetOffsetZ(surviving_header);
629
maxz = LASPoint_GetZ(surviving_point_max) * LASHeader_GetScaleZ(surviving_header) + LASHeader_GetOffsetZ(surviving_header);
631
if (format == LAS_FORMAT_10) {
632
LASHeader_SetVersionMinor(surviving_header, 0);
633
} else if (format == LAS_FORMAT_11){
634
LASHeader_SetVersionMinor(surviving_header, 1);
635
} else if (format == LAS_FORMAT_12) {
636
LASHeader_SetVersionMinor(surviving_header, 2);
640
/* if (remove_extra_header) surviving_header.offset_to_point_data = surviving_header.header_size;
645
"second pass reading %d and writing %d points ...\n",
646
LASHeader_GetPointRecordsCount(surviving_header),
647
surviving_number_of_point_records);
650
if (use_stdout) file_name_out = "stdout";
652
writer = LASWriter_Create(file_name_out, surviving_header, LAS_MODE_WRITE);
654
LASError_Print("Could not open file to write");
660
if (!remove_extra_header)
662
for (unsigned int u = lasreader->header.header_size; u < lasreader->header.offset_to_point_data; u++)
664
fputc(fgetc(file_in),file_out);
670
LASReader_Destroy(reader);
674
reader = LASReader_Create(file_name_in);
676
LASError_Print("Could not open file to read");
682
LASError_Print("no input specified");
687
p = LASReader_GetNextPoint(reader);
689
if (LASError_GetLastErrorNum())
690
LASError_Print("Not able to fetch a point. LASReader is invalid");
692
LASError_Print("File does not contain any points to read.");
698
if (skip_invalid && !LASPoint_IsValid(p)) {
699
p = LASReader_GetNextPoint(reader);
702
if (last_only && LASPoint_GetReturnNumber(p) != LASPoint_GetNumberOfReturns(p))
704
p = LASReader_GetNextPoint(reader);
707
if (first_only && LASPoint_GetReturnNumber(p) != 1)
709
p = LASReader_GetNextPoint(reader);
713
if (clip_xy_min && (LASPoint_GetX(p) < clip_xy_min[0] || LASPoint_GetY(p) < clip_xy_min[1]))
715
p = LASReader_GetNextPoint(reader);
718
if (clip_xy_max && (LASPoint_GetX(p) > clip_xy_max[0] || LASPoint_GetY(p) > clip_xy_max[1]))
720
p = LASReader_GetNextPoint(reader);
723
if (elim_return && (elim_return & (1 << LASPoint_GetReturnNumber(p))))
725
p = LASReader_GetNextPoint(reader);
728
if (elim_scan_angle_above && (LASPoint_GetScanAngleRank(p) > elim_scan_angle_above || LASPoint_GetScanAngleRank(p) < -elim_scan_angle_above))
730
p = LASReader_GetNextPoint(reader);
733
if (elim_intensity_below && LASPoint_GetIntensity(p) < elim_intensity_below)
735
p = LASReader_GetNextPoint(reader);
739
clsidx = LASPoint_GetClassification(p);
740
clsidx = (clsidx & 31); // 31 is max index in classification lookup table
741
assert(clsidx <= 31);
742
if (elim_class && (elim_class == clsidx))
744
p = LASReader_GetNextPoint(reader);
747
LASWriter_WritePoint(writer,p);
749
p = LASReader_GetNextPoint(reader);
752
LASWriter_Destroy(writer);
753
LASReader_Destroy(reader);
754
LASHeader_Destroy(header);
755
LASHeader_Destroy(surviving_header);
756
LASPoint_Destroy(surviving_point_max);
757
LASPoint_Destroy(surviving_point_min);
759
reader = LASReader_Create(file_name_out);
761
LASError_Print("Could not open file to read");
765
header = LASReader_GetHeader(reader);
767
LASError_Print("Could not read header");
770
summary = SummarizePoints(reader);
772
print_point_summary(stderr, summary, header);
774
repair_header(stderr, header, summary) ;
777
LASPoint_Destroy(summary->pmin);
778
LASPoint_Destroy(summary->pmax);
783
LASReader_Destroy(reader);
787
writer = LASWriter_Create(file_name_out, header, LAS_MODE_APPEND);
789
LASError_Print("Problem creating LASWriterH object for append");
790
LASHeader_Destroy(header);
794
LASWriter_Destroy(writer);
796
LASHeader_Destroy(header);
799
if (verbose) ptime("done.");