void LASreaderASC::populate_scale_and_offset() { // if not specified in the command line, set a reasonable scale_factor if (scale_factor) { header.x_scale_factor = scale_factor[0]; header.y_scale_factor = scale_factor[1]; header.z_scale_factor = scale_factor[2]; } else { if (-360 < header.min_x && -360 < header.min_y && header.max_x < 360 && header.max_y < 360) // do we have longitude / latitude coordinates { header.x_scale_factor = 1e-7; header.y_scale_factor = 1e-7; } else // then we assume utm or mercator / lambertian projections { header.x_scale_factor = 0.01; header.y_scale_factor = 0.01; } header.z_scale_factor = 0.01; } // if not specified in the command line, set a reasonable offset if (offset) { header.x_offset = offset[0]; header.y_offset = offset[1]; header.z_offset = offset[2]; } else { if (F64_IS_FINITE(header.min_x) && F64_IS_FINITE(header.max_x)) header.x_offset = ((I64)((header.min_x + header.max_x)/header.x_scale_factor/20000000))*10000000*header.x_scale_factor; else header.x_offset = 0; if (F64_IS_FINITE(header.min_y) && F64_IS_FINITE(header.max_y)) header.y_offset = ((I64)((header.min_y + header.max_y)/header.y_scale_factor/20000000))*10000000*header.y_scale_factor; else header.y_offset = 0; if (F64_IS_FINITE(header.min_z) && F64_IS_FINITE(header.max_z)) header.z_offset = ((I64)((header.min_z + header.max_z)/header.z_scale_factor/20000000))*10000000*header.z_scale_factor; else header.z_offset = 0; } }
int32_t laszip_auto_offset(laszip_dll_struct *laszip_dll) { if (laszip_dll == 0) return 1; try { if (laszip_dll->reader) { sprintf(laszip_dll->error, "cannot auto offset after reader was opened"); return 1; } // get a pointer to the header laszip_header_struct* header = &(laszip_dll->header); // check scale factor F64 x_scale_factor = header->x_scale_factor; F64 y_scale_factor = header->y_scale_factor; F64 z_scale_factor = header->z_scale_factor; if ((x_scale_factor <= 0) || !F64_IS_FINITE(x_scale_factor)) { sprintf(laszip_dll->error, "invalid x scale_factor %g in header", header->x_scale_factor); return 1; } if ((y_scale_factor <= 0) || !F64_IS_FINITE(y_scale_factor)) { sprintf(laszip_dll->error, "invalid y scale_factor %g in header", header->y_scale_factor); return 1; } if ((z_scale_factor <= 0) || !F64_IS_FINITE(z_scale_factor)) { sprintf(laszip_dll->error, "invalid z scale_factor %g in header", header->z_scale_factor); return 1; } F64 center_bb_x = (header->min_x + header->max_x) / 2; F64 center_bb_y = (header->min_y + header->max_y) / 2; F64 center_bb_z = (header->min_z + header->max_z) / 2; if (!F64_IS_FINITE(center_bb_x)) { sprintf(laszip_dll->error, "invalid x coordinate at center of bounding box (min: %g max: %g)", header->min_x, header->max_x); return 1; } if (!F64_IS_FINITE(center_bb_y)) { sprintf(laszip_dll->error, "invalid y coordinate at center of bounding box (min: %g max: %g)", header->min_y, header->max_y); return 1; } if (!F64_IS_FINITE(center_bb_z)) { sprintf(laszip_dll->error, "invalid z coordinate at center of bounding box (min: %g max: %g)", header->min_z, header->max_z); return 1; } F64 x_offset = header->x_offset; F64 y_offset = header->y_offset; F64 z_offset = header->z_offset; header->x_offset = (I64_FLOOR(center_bb_x/x_scale_factor/10000000))*10000000*x_scale_factor; header->y_offset = (I64_FLOOR(center_bb_y/y_scale_factor/10000000))*10000000*y_scale_factor; header->z_offset = (I64_FLOOR(center_bb_z/z_scale_factor/10000000))*10000000*z_scale_factor; if (laszip_check_for_integer_overflow(laszip_dll)) { header->x_offset = x_offset; header->y_offset = y_offset; header->z_offset = z_offset; return 1; } } catch (...) { sprintf(laszip_dll->error, "internal error in laszip_auto_offset"); return 1; } laszip_dll->error[0] = '\0'; return 0; }