inline void read(U8* item) { instream->getBytes(buffer, 30); ((LAStempReadPoint10*)item)->x = ((LAStempReadPoint14*)buffer)->x; ((LAStempReadPoint10*)item)->y = ((LAStempReadPoint14*)buffer)->y; ((LAStempReadPoint10*)item)->z = ((LAStempReadPoint14*)buffer)->z; ((LAStempReadPoint10*)item)->intensity = ((LAStempReadPoint14*)buffer)->intensity; if (((LAStempReadPoint14*)buffer)->number_of_returns_of_given_pulse > 7) { if (((LAStempReadPoint14*)buffer)->return_number > 6) { if (((LAStempReadPoint14*)buffer)->return_number >= ((LAStempReadPoint14*)buffer)->number_of_returns_of_given_pulse) { ((LAStempReadPoint10*)item)->number_of_returns_of_given_pulse = 7; } else { ((LAStempReadPoint10*)item)->number_of_returns_of_given_pulse = 6; } } else { ((LAStempReadPoint10*)item)->return_number = ((LAStempReadPoint14*)buffer)->return_number; } ((LAStempReadPoint10*)item)->number_of_returns_of_given_pulse = 7; } else { ((LAStempReadPoint10*)item)->return_number = ((LAStempReadPoint14*)buffer)->return_number; ((LAStempReadPoint10*)item)->number_of_returns_of_given_pulse = ((LAStempReadPoint14*)buffer)->number_of_returns_of_given_pulse; } ((LAStempReadPoint10*)item)->scan_direction_flag = ((LAStempReadPoint14*)buffer)->scan_direction_flag; ((LAStempReadPoint10*)item)->edge_of_flight_line = ((LAStempReadPoint14*)buffer)->edge_of_flight_line; ((LAStempReadPoint10*)item)->classification = (((LAStempReadPoint14*)buffer)->classification_flags << 5) | (((LAStempReadPoint14*)buffer)->classification & 31); ((LAStempReadPoint10*)item)->scan_angle_rank = I8_CLAMP(I16_QUANTIZE(((LAStempReadPoint14*)buffer)->scan_angle*0.006f)); ((LAStempReadPoint10*)item)->user_data = ((LAStempReadPoint14*)buffer)->user_data; ((LAStempReadPoint10*)item)->point_source_ID = ((LAStempReadPoint14*)buffer)->point_source_ID; ((LAStempReadPoint10*)item)->extended_scanner_channel = ((LAStempReadPoint14*)buffer)->scanner_channel; ((LAStempReadPoint10*)item)->extended_classification_flags = ((LAStempReadPoint14*)buffer)->classification_flags & 8; ((LAStempReadPoint10*)item)->extended_classification = ((LAStempReadPoint14*)buffer)->classification; ((LAStempReadPoint10*)item)->extended_return_number = ((LAStempReadPoint14*)buffer)->return_number; ((LAStempReadPoint10*)item)->extended_number_of_returns_of_given_pulse = ((LAStempReadPoint14*)buffer)->number_of_returns_of_given_pulse; ((LAStempReadPoint10*)item)->extended_scan_angle = ((LAStempReadPoint14*)buffer)->scan_angle; ((LAStempReadPoint10*)item)->gps_time = *((F64*)&buffer[22]); }
BOOL LASreaderQFIT::read_point_default() { if (p_count < npoints) { try { stream->getBytes((U8*)buffer, version); } catch(...) { fprintf(stderr,"ERROR: reading QFIT point after %u of %u\n", (U32)p_count, (U32)npoints); return FALSE; } if (endian_swap) { ENDIAN_SWAP_32((U8*)&buffer[0]); ENDIAN_SWAP_32((U8*)&buffer[1]); ENDIAN_SWAP_32((U8*)&buffer[2]); ENDIAN_SWAP_32((U8*)&buffer[3]); ENDIAN_SWAP_32((U8*)&buffer[5]); ENDIAN_SWAP_32((U8*)&buffer[6]); ENDIAN_SWAP_32((U8*)&buffer[7]); ENDIAN_SWAP_32((U8*)&buffer[8]); ENDIAN_SWAP_32((U8*)&buffer[9]); if (version >= 48) { ENDIAN_SWAP_32((U8*)&buffer[10]); ENDIAN_SWAP_32((U8*)&buffer[11]); } if (version >= 56) { ENDIAN_SWAP_32((U8*)&buffer[12]); ENDIAN_SWAP_32((U8*)&buffer[13]); } } point.gps_time = 0.001*buffer[0]; point.x = buffer[2]; if (point.x > 180000000) point.x -= 360000000; // convert LARGE positive east longitude to negative point.y = buffer[1]; point.z = buffer[3]; point.intensity = buffer[5]; point.scan_angle_rank = I8_CLAMP(I16_QUANTIZE((0.001*buffer[6])-180.0)); point.set_extra_attribute(scan_azimuth_array_offset, (I32)buffer[6]); point.set_extra_attribute(pitch_array_offset, (I32)buffer[7]); point.set_extra_attribute(roll_array_offset, (I32)buffer[8]); point.set_extra_attribute(pulse_width_array_offset, (U8)buffer[10]); if (!populated_header) { point.compute_coordinates(); // update bounding box if (point.coordinates[0] < header.min_x) header.min_x = point.coordinates[0]; else if (point.coordinates[0] > header.max_x) header.max_x = point.coordinates[0]; if (point.coordinates[1] < header.min_y) header.min_y = point.coordinates[1]; else if (point.coordinates[1] > header.max_y) header.max_y = point.coordinates[1]; if (point.coordinates[2] < header.min_z) header.min_z = point.coordinates[2]; else if (point.coordinates[2] > header.max_z) header.max_z = point.coordinates[2]; } p_count++; return TRUE; } populated_header = TRUE; return FALSE; }