public unsafe override void read(laszip_point item) { if (instream.Read(buffer, 0, 30) != 30) throw new EndOfStreamException(); fixed(byte *pBuffer = buffer) { LAStempReadPoint14 *p14 = (LAStempReadPoint14 *)pBuffer; item.X = p14->x; item.Y = p14->y; item.Z = p14->z; item.intensity = p14->intensity; if (p14->number_of_returns_of_given_pulse > 7) { if (p14->return_number > 6) { if (p14->return_number >= p14->number_of_returns_of_given_pulse) { item.number_of_returns_of_given_pulse = 7; } else { item.number_of_returns_of_given_pulse = 6; } } else { item.return_number = p14->return_number; } item.number_of_returns_of_given_pulse = 7; } else { item.return_number = p14->return_number; item.number_of_returns_of_given_pulse = p14->number_of_returns_of_given_pulse; } item.scan_direction_flag = p14->scan_direction_flag; item.edge_of_flight_line = p14->edge_of_flight_line; item.classification = (byte)((p14->classification_flags << 5) | (p14->classification & 31)); item.scan_angle_rank = MyDefs.I8_CLAMP(MyDefs.I16_QUANTIZE(p14->scan_angle * 0.006)); item.user_data = p14->user_data; item.point_source_ID = p14->point_source_ID; item.extended_scanner_channel = p14->scanner_channel; item.extended_classification_flags = (byte)(p14->classification_flags & 8); // TODO Häää? item.extended_classification = p14->classification; item.extended_return_number = p14->return_number; item.extended_number_of_returns_of_given_pulse = p14->number_of_returns_of_given_pulse; item.extended_scan_angle = p14->scan_angle; item.gps_time = p14->gps_time; } }
public unsafe override bool write(laszip_point item) { fixed(byte *pBuffer = buffer) { LAStempWritePoint14 *p14 = (LAStempWritePoint14 *)pBuffer; p14->x = item.X; p14->y = item.Y; p14->z = item.Z; p14->intensity = item.intensity; p14->scan_direction_flag = item.scan_direction_flag; p14->edge_of_flight_line = item.edge_of_flight_line; p14->classification = (byte)(item.classification & 31); p14->user_data = item.user_data; p14->point_source_ID = item.point_source_ID; if (item.extended_point_type != 0) { p14->classification_flags = (byte)(item.extended_classification_flags | (item.classification >> 5)); if (item.extended_classification > 31) { p14->classification = item.extended_classification; } p14->scanner_channel = item.extended_scanner_channel; p14->return_number = item.extended_return_number; p14->number_of_returns_of_given_pulse = item.extended_number_of_returns_of_given_pulse; p14->scan_angle = item.extended_scan_angle; } else { p14->classification_flags = (byte)(item.classification >> 5); p14->scanner_channel = 0; p14->return_number = item.return_number; p14->number_of_returns_of_given_pulse = item.number_of_returns_of_given_pulse; p14->scan_angle = MyDefs.I16_QUANTIZE(item.scan_angle_rank / 0.006f); } p14->gps_time = item.gps_time; } try { outstream.Write(buffer, 0, 30); } catch { return(false); } return(true); }