48 fprintf(stderr,
"ERROR: fine name pointer is zero\n");
57 fprintf(stderr,
"ERROR: cannot open file '%s'\n", file_name);
74 for (
I32 d = 0; d < dim; d++)
79 for (
I32 d = 0; d < dim; d++)
93 for (i = 0; i < 32; i++)
104 WIN32_FILE_ATTRIBUTE_DATA attr;
106 GetFileAttributesEx(file_name, GetFileExInfoStandard, &attr);
107 FileTimeToSystemTime(&attr.ftCreationTime, &creation);
108 int startday[13] = {-1, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
119 if (strstr(parse_string,
"t"))
121 if (strstr(parse_string,
"R") || strstr(parse_string,
"G") || strstr(parse_string,
"B"))
134 if (strstr(parse_string,
"R") || strstr(parse_string,
"G") || strstr(parse_string,
"B"))
175 if (parse_string == 0)
177 parse_less = strdup(
"xyz");
181 parse_less = strdup(parse_string);
182 for (i = 0; i < (int)strlen(parse_string); i++)
184 if (parse_less[i] !=
'x' && parse_less[i] !=
'y' && parse_less[i] !=
'z' && parse_less[i] !=
'r' && (parse_less[i] <
'0' || parse_less[i] >
'0'))
191 parse_less[i] =
'\0';
193 }
while (parse_less[i] ==
's');
204 if (
parse(parse_less))
214 fprintf(stderr,
"WARNING: cannot parse '%s' with '%s'. skipping ...\n",
line, parse_less);
222 fprintf(stderr,
"ERROR: could not parse any lines with '%s'\n", parse_less);
254 if (
parse(parse_less))
280 fprintf(stderr,
"WARNING: cannot parse '%s' with '%s'. skipping ...\n",
line, parse_less);
307 fprintf(stderr,
"ERROR: could not open '%s' for second pass\n", file_name);
312 if (parse_string == 0)
314 this->parse_string = strdup(
"xyz");
318 this->parse_string = strdup(parse_string);
331 if (
parse(this->parse_string))
340 fprintf(stderr,
"WARNING: cannot parse '%s' with '%s'. skipping ...\n",
line, this->parse_string);
348 fprintf(stderr,
"ERROR: could not parse any lines with '%s'\n", this->parse_string);
351 free(this->parse_string);
352 this->parse_string = 0;
409 if (this->scale_factor == 0) this->scale_factor =
new F64[3];
410 this->scale_factor[0] = scale_factor[0];
411 this->scale_factor[1] = scale_factor[1];
412 this->scale_factor[2] = scale_factor[2];
414 else if (this->scale_factor)
417 this->scale_factor = 0;
425 if (this->offset == 0) this->offset =
new F64[3];
426 this->offset[0] = offset[0];
427 this->offset[1] = offset[1];
428 this->offset[2] = offset[2];
430 else if (this->offset)
473 fseek(
file, 0, SEEK_SET);
491 fprintf(stderr,
"WARNING: cannot parse '%s' with '%s'. skipping ...\n",
line, this->
parse_string);
497 fprintf(stderr,
"ERROR: could not parse any lines with '%s'\n", this->
parse_string);
504 delta = (
U32)p_index;
530 fprintf(stderr,
"WARNING: cannot parse '%s' with '%s'. skipping ...\n",
line, this->
parse_string);
540 fprintf(stderr,
"WARNING: end-of-file after %I64d of %I64d points\n",
p_count,
npoints);
542 fprintf(stderr,
"WARNING: end-of-file after %lld of %lld points\n",
p_count,
npoints);
607 fprintf(stderr,
"ERROR: fine name pointer is zero\n");
614 fprintf(stderr,
"ERROR: cannot reopen file '%s'\n", file_name);
636 fprintf(stderr,
"WARNING: cannot parse '%s' with '%s'. skipping ...\n",
line,
parse_string);
644 fprintf(stderr,
"ERROR: could not parse any lines with '%s'\n",
parse_string);
713 if (sscanf(l,
"%lf", &temp_d) != 1)
return FALSE;
718 if (sscanf(l,
"%d", &temp_i) != 1)
return FALSE;
720 if (temp_i < U8_MIN || temp_i >
U8_MAX)
722 fprintf(stderr,
"WARNING: extra attribute %d of type U8 is %d. clamped to [%d %d] range.\n", index, temp_i,
U8_MIN, U8_MAX);
736 if (sscanf(l,
"%lf", &temp_d) != 1)
return FALSE;
741 if (sscanf(l,
"%d", &temp_i) != 1)
return FALSE;
743 if (temp_i < I8_MIN || temp_i >
I8_MAX)
745 fprintf(stderr,
"WARNING: extra attribute %d of type I8 is %d. clamped to [%d %d] range.\n", index, temp_i,
I8_MIN, I8_MAX);
759 if (sscanf(l,
"%lf", &temp_d) != 1)
return FALSE;
764 if (sscanf(l,
"%d", &temp_i) != 1)
return FALSE;
766 if (temp_i < U16_MIN || temp_i >
U16_MAX)
768 fprintf(stderr,
"WARNING: extra attribute %d of type U16 is %d. clamped to [%d %d] range.\n", index, temp_i,
U16_MIN, U16_MAX);
782 if (sscanf(l,
"%lf", &temp_d) != 1)
return FALSE;
787 if (sscanf(l,
"%d", &temp_i) != 1)
return FALSE;
789 if (temp_i < I16_MIN || temp_i >
I16_MAX)
791 fprintf(stderr,
"WARNING: extra attribute %d of type I16 is %d. clamped to [%d %d] range.\n", index, temp_i,
I16_MIN, I16_MAX);
805 if (sscanf(l,
"%lf", &temp_d) != 1)
return FALSE;
810 if (sscanf(l,
"%u", &temp_u) != 1)
return FALSE;
820 if (sscanf(l,
"%lf", &temp_d) != 1)
return FALSE;
825 if (sscanf(l,
"%d", &temp_i) != 1)
return FALSE;
827 if (sscanf(l,
"%d", &temp_i) != 1)
return FALSE;
833 if (sscanf(l,
"%f", &temp_f) != 1)
return FALSE;
839 if (sscanf(l,
"%lf", &temp_d) != 1)
return FALSE;
844 fprintf(stderr,
"WARNING: extra attribute %d not (yet) implemented.\n", index);
855 const char* l =
line;
861 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
862 if (l[0] == 0)
return FALSE;
864 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
866 else if (p[0] ==
'y')
868 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
869 if (l[0] == 0)
return FALSE;
871 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
873 else if (p[0] ==
'z')
875 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
876 if (l[0] == 0)
return FALSE;
878 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
880 else if (p[0] ==
't')
882 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
883 if (l[0] == 0)
return FALSE;
885 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
887 else if (p[0] ==
'R')
889 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
890 if (l[0] == 0)
return FALSE;
891 if (sscanf(l,
"%d", &temp_i) != 1)
return FALSE;
893 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
895 else if (p[0] ==
'G')
897 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
898 if (l[0] == 0)
return FALSE;
899 if (sscanf(l,
"%d", &temp_i) != 1)
return FALSE;
901 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
903 else if (p[0] ==
'B')
905 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
906 if (l[0] == 0)
return FALSE;
907 if (sscanf(l,
"%d", &temp_i) != 1)
return FALSE;
909 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
911 else if (p[0] ==
's')
913 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
914 if (l[0] == 0)
return FALSE;
915 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
917 else if (p[0] ==
'i')
919 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
920 if (l[0] == 0)
return FALSE;
921 if (sscanf(l,
"%f", &temp_f) != 1)
return FALSE;
924 if (temp_f < 0.0f || temp_f >= 65535.5f) fprintf(stderr,
"WARNING: intensity %g is out of range of unsigned short\n", temp_f);
926 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
928 else if (p[0] ==
'a')
930 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
931 if (l[0] == 0)
return FALSE;
932 if (sscanf(l,
"%f", &temp_f) != 1)
return FALSE;
935 if (temp_f < -128.0f || temp_f > 127.0f) fprintf(stderr,
"WARNING: scan angle %g is out of range of char\n", temp_f);
937 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
939 else if (p[0] ==
'n')
941 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
942 if (l[0] == 0)
return FALSE;
943 if (sscanf(l,
"%d", &temp_i) != 1)
return FALSE;
944 if (temp_i < 0 || temp_i > 7) fprintf(stderr,
"WARNING: return number %d is out of range of three bits\n", temp_i);
946 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
948 else if (p[0] ==
'r')
950 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
951 if (l[0] == 0)
return FALSE;
952 if (sscanf(l,
"%d", &temp_i) != 1)
return FALSE;
953 if (temp_i < 0 || temp_i > 7) fprintf(stderr,
"WARNING: return number %d is out of range of three bits\n", temp_i);
955 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
957 else if (p[0] ==
'c')
959 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
960 if (l[0] == 0)
return FALSE;
961 if (sscanf(l,
"%d", &temp_i) != 1)
return FALSE;
962 if (temp_i < 0 || temp_i > 255) fprintf(stderr,
"WARNING: classification %d is out of range of unsigned char\n", temp_i);
964 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
966 else if (p[0] ==
'u')
968 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
969 if (l[0] == 0)
return FALSE;
970 if (sscanf(l,
"%d", &temp_i) != 1)
return FALSE;
971 if (temp_i < 0 || temp_i > 255) fprintf(stderr,
"WARNING: user data %d is out of range of unsigned char\n", temp_i);
973 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
975 else if (p[0] ==
'p')
977 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
978 if (l[0] == 0)
return FALSE;
979 if (sscanf(l,
"%d", &temp_i) != 1)
return FALSE;
980 if (temp_i < 0 || temp_i > 65535) fprintf(stderr,
"WARNING: point source ID %d is out of range of unsigned short\n", temp_i);
982 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
984 else if (p[0] ==
'e')
986 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
987 if (l[0] == 0)
return FALSE;
988 if (sscanf(l,
"%d", &temp_i) != 1)
return FALSE;
989 if (temp_i < 0 || temp_i > 1) fprintf(stderr,
"WARNING: edge of flight line flag %d is out of range of boolean flag\n", temp_i);
991 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
993 else if (p[0] ==
'd')
995 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
996 if (l[0] == 0)
return FALSE;
997 if (sscanf(l,
"%d", &temp_i) != 1)
return FALSE;
998 if (temp_i < 0 || temp_i > 1) fprintf(stderr,
"WARNING: direction of scan flag %d is out of range of boolean flag\n", temp_i);
1000 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
1002 else if (p[0] >=
'0' && p[0] <=
'9')
1004 while (l[0] && (l[0] ==
' ' || l[0] ==
',' || l[0] ==
'\t')) l++;
1005 if (l[0] == 0)
return FALSE;
1008 while (l[0] && l[0] !=
' ' && l[0] !=
',' && l[0] !=
'\t') l++;
1012 fprintf(stderr,
"ERROR: unknown symbol '%c' in parse string\n", p[0]);
1024 if ((p[0] !=
'x') &&
1042 if (p[0] >=
'0' && p[0] <=
'9')
1047 fprintf(stderr,
"ERROR: extra attribute '%d' was not described.\n", index);
1054 fprintf(stderr,
"ERROR: unknown symbol '%c' in parse string. valid are\n", p[0]);
1055 fprintf(stderr,
" 'x' : the x coordinate\n");
1056 fprintf(stderr,
" 'y' : the y coordinate\n");
1057 fprintf(stderr,
" 'z' : the x coordinate\n");
1058 fprintf(stderr,
" 't' : the gps time\n");
1059 fprintf(stderr,
" 'R' : the red channel of the RGB field\n");
1060 fprintf(stderr,
" 'G' : the green channel of the RGB field\n");
1061 fprintf(stderr,
" 'B' : the blue channel of the RGB field\n");
1062 fprintf(stderr,
" 's' : a string or a number that we don't care about\n");
1063 fprintf(stderr,
" 'i' : the intensity\n");
1064 fprintf(stderr,
" 'a' : the scan angle\n");
1065 fprintf(stderr,
" 'n' : the number of returns of that given pulse\n");
1066 fprintf(stderr,
" 'r' : the number of the return\n");
1067 fprintf(stderr,
" 'c' : the classification\n");
1068 fprintf(stderr,
" 'u' : the user data\n");
1069 fprintf(stderr,
" 'p' : the point source ID\n");
1070 fprintf(stderr,
" 'e' : the edge of flight line flag\n");
1071 fprintf(stderr,
" 'd' : the direction of scan flag\n");
1143 fprintf(stderr,
"WARNING: quantization sign flip for min_x from %g to %g.\n",
header.
min_x, dequant_min_x);
1144 fprintf(stderr,
" set scale factor for x coarser than %g with '-scale'\n",
header.
x_scale_factor);
1152 fprintf(stderr,
"WARNING: quantization sign flip for max_x from %g to %g.\n",
header.
max_x, dequant_max_x);
1153 fprintf(stderr,
" set scale factor for x coarser than %g with '-scale'\n",
header.
x_scale_factor);
1161 fprintf(stderr,
"WARNING: quantization sign flip for min_y from %g to %g.\n",
header.
min_y, dequant_min_y);
1162 fprintf(stderr,
" set scale factor for y coarser than %g with '-scale'\n",
header.
y_scale_factor);
1170 fprintf(stderr,
"WARNING: quantization sign flip for max_y from %g to %g.\n",
header.
max_y, dequant_max_y);
1171 fprintf(stderr,
" set scale factor for y coarser than %g with '-scale'\n",
header.
y_scale_factor);
1179 fprintf(stderr,
"WARNING: quantization sign flip for min_z from %g to %g.\n",
header.
min_z, dequant_min_z);
1180 fprintf(stderr,
" set scale factor for z coarser than %g with '-scale'\n",
header.
z_scale_factor);
1188 fprintf(stderr,
"WARNING: quantization sign flip for max_z from %g to %g.\n",
header.
max_z, dequant_max_z);
1189 fprintf(stderr,
" set scale factor for z coarser than %g with '-scale'\n",
header.
z_scale_factor);
1225 this->
offset[0] = x_offset;
1226 this->
offset[1] = y_offset;
1227 this->
offset[2] = z_offset;
1249 LASreaderTXTrescalereoffset::LASreaderTXTrescalereoffset(
F64 x_scale_factor,
F64 y_scale_factor,
F64 z_scale_factor,
F64 x_offset,
F64 y_offset,
F64 z_offset) :
LASreaderTXTrescale(x_scale_factor, y_scale_factor, z_scale_factor),
LASreaderTXTreoffset(x_offset, y_offset, z_offset)
FILE * fopen_compressed(const char *filename, const char *mode, bool *piped)
void populate_bounding_box()
F64 extra_attribute_offsets[10]
BOOL parse(const char *parse_string)
virtual BOOL open(const char *file_name, const char *parse_string=0, I32 skip_lines=0, BOOL populate_header=FALSE)
void close(BOOL close_stream=TRUE)
void set_translate_intensity(F32 translate_intensity)
const char * extra_attribute_descriptions[10]
BOOL seek(const I64 p_index)
BOOL read_point_default()
void set_offset(const F64 *offset)
const char * extra_attribute_names[10]
void set_scale_intensity(F32 scale_intensity)
I16 get_total_extra_attributes_size() const
void set_min(U8 *min, I32 dim=0)
BOOL init(const LASquantizer *quantizer, const U8 point_type, const U16 point_size, const LASattributer *attributer=0)
LASreaderTXTrescale(F64 x_scale_factor, F64 y_scale_factor, F64 z_scale_factor)
void populate_scale_and_offset()
void update_min(U8 *min, I32 dim=0)
void set_scale_scan_angle(F32 scale_scan_angle)
void add_extra_attribute(I32 data_type, const char *name, const char *description=0, F64 scale=1.0, F64 offset=0.0)
void set_extra_attribute(I32 index, const U8 *data)
BOOL check_parse_string(const char *parse_string)
void set_translate_scan_angle(F32 translate_scan_angle)
BOOL open(const char *file_name, const char *parse_string=0, I32 skip_lines=0, BOOL populate_header=FALSE)
ByteStreamIn * get_stream() const
F64 get_y(const I32 y) const
void update_max(U8 *max, I32 dim=0)
I32 number_extra_attributes
void set_scale_factor(const F64 *scale_factor)
virtual BOOL open(const char *file_name, const char *parse_string=0, I32 skip_lines=0, BOOL populate_header=FALSE)
I32 number_extra_attributes
I32 extra_attributes_data_types[10]
BOOL reopen(const char *file_name)
BOOL set_scale(F64 scale, I32 dim=0)
void set_max(U8 *max, I32 dim=0)
F64 get_z(const I32 z) const
I32 extra_attribute_array_offsets[10]
BOOL parse_extra_attribute(const char *l, I32 index)
I32 add_extra_attribute(const LASattribute extra_attribute)
#define LAS_TOOLS_VERSION
I32 get_extra_attribute_array_offset(const char *name) const
LASreaderTXTrescalereoffset(F64 x_scale_factor, F64 y_scale_factor, F64 z_scale_factor, F64 x_offset, F64 y_offset, F64 z_offset)
F64 get_x(const I32 x) const
BOOL set_offset(F64 offset, I32 dim=0)
virtual BOOL open(const char *file_name, const char *parse_string=0, I32 skip_lines=0, BOOL populate_header=FALSE)
LASattribute * extra_attributes
F64 extra_attribute_scales[10]
U8 number_of_returns_of_given_pulse
LASreaderTXTreoffset(F64 x_offset, F64 y_offset, F64 z_offset)