ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
LasDetails.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 
10 // ##########################################################################
11 // # #
12 // # CloudViewer PLUGIN: LAS-IO Plugin #
13 // # #
14 // # This program is free software; you can redistribute it and/or modify #
15 // # it under the terms of the GNU General Public License as published by #
16 // # the Free Software Foundation; version 2 of the License. #
17 // # #
18 // # This program is distributed in the hope that it will be useful, #
19 // # but WITHOUT ANY WARRANTY; without even the implied warranty of #
20 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
21 // # GNU General Public License for more details. #
22 // # #
23 // # COPYRIGHT: Thomas Montaigu #
24 // # #
25 // ##########################################################################
26 
27 // CC
28 #include <CVTypes.h>
29 
30 // Qt
31 #include <QtGlobal>
32 
33 // System
34 #include <array>
35 #include <cmath>
36 #include <limits>
37 #include <string>
38 #include <vector>
39 
40 class ccPointCloud;
41 class ccScalarField;
42 
43 class QDataStream;
44 
45 struct laszip_header;
46 struct laszip_vlr;
47 typedef laszip_vlr laszip_vlr_struct;
48 
49 constexpr size_t LAS_VLR_HEADER_SIZE = 54;
50 constexpr double SCAN_ANGLE_SCALE = 0.06;
51 
57 namespace LasNames
58 {
59  constexpr const char* Intensity = "Intensity";
60  constexpr const char* ReturnNumber = "Return Number";
61  constexpr const char* NumberOfReturns = "Number Of Returns";
62  constexpr const char* ScanDirectionFlag = "Scan Direction Flag";
63  constexpr const char* EdgeOfFlightLine = "EdgeOfFlightLine";
64  constexpr const char* Classification = "Classification";
65  constexpr const char* SyntheticFlag = "Synthetic Flag";
66  constexpr const char* KeypointFlag = "Keypoint Flag";
67  constexpr const char* WithheldFlag = "Withheld Flag";
68  constexpr const char* ScanAngleRank = "Scan Angle Rank";
69  constexpr const char* UserData = "User Data";
70  constexpr const char* PointSourceId = "Point Source ID";
71  constexpr const char* GpsTime = "Gps Time";
72 
73  // 1.4 point format 6 stuff
74  constexpr const char* ScanAngle = "Scan Angle";
75  constexpr const char* ScannerChannel = "Scanner Channel";
76  constexpr const char* OverlapFlag = "Overlap Flag";
77  constexpr const char* NearInfrared = "Near Infrared";
78 } // namespace LasNames
79 
80 namespace LasDetails
81 {
82  // The position of the overlap flag in the classification flags
83  // (valid for fmt >= 6)
84  constexpr unsigned OVERLAP_FLAG_BIT_POS = 3;
85  constexpr unsigned OVERLAP_FLAG_BIT_MASK = 1 << OVERLAP_FLAG_BIT_POS;
86 
92  struct EvlrHeader
93  {
94  static constexpr size_t SIZE = 60;
95  static constexpr size_t USER_ID_SIZE = 16;
96  static constexpr size_t DESCRIPTION_SIZE = 32;
97 
99  uint16_t recordID{0};
100  uint64_t recordLength{0};
102 
103  EvlrHeader() = default;
104 
105  static EvlrHeader Waveform();
106 
107  bool isWaveFormDataPackets() const;
108 
109  friend QDataStream& operator>>(QDataStream& stream, EvlrHeader& hdr);
110  friend QDataStream& operator<<(QDataStream& stream, const EvlrHeader& hdr);
111  };
112 
119  uint16_t PointFormatSize(unsigned pointFormat);
120 
122  uint16_t HeaderSize(unsigned versionMinor);
123 
125  inline bool HasGpsTime(unsigned pointFormatId)
126  {
127  return pointFormatId == 1
128  || pointFormatId >= 3;
129  }
130 
132  inline bool HasRGB(unsigned pointFormatId)
133  {
134  return pointFormatId == 2
135  || pointFormatId == 3
136  || pointFormatId == 5
137  || pointFormatId == 7
138  || pointFormatId == 8
139  || pointFormatId == 10;
140  }
141 
143  inline bool HasWaveform(unsigned pointFormatId)
144  {
145  return pointFormatId == 4
146  || pointFormatId == 5
147  || pointFormatId >= 9;
148  }
149 
151  inline bool HasNearInfrared(unsigned pointFormatId)
152  {
153  return pointFormatId == 8
154  || pointFormatId == 10;
155  }
156 
159  unsigned SizeOfVlrs(const laszip_vlr_struct* vlrs, unsigned numVlrs);
160 
162  bool IsLaszipVlr(const laszip_vlr_struct&);
163 
165  bool IsExtraBytesVlr(const laszip_vlr_struct&);
166 
172  const std::vector<unsigned>* PointFormatsAvailableForVersion(QString version);
173 
174  const std::array<const char*, 3>& AvailableVersions();
175 
177  struct LasVersion
178  {
179  int pointFormat = 3;
180  int minorVersion = 2;
181  };
182 
188 
190  void CloneVlrInto(const laszip_vlr_struct& src, laszip_vlr_struct& dst);
191 
192 } // namespace LasDetails
std::string version
constexpr double SCAN_ANGLE_SCALE
Definition: LasDetails.h:50
constexpr size_t LAS_VLR_HEADER_SIZE
Definition: LasDetails.h:49
laszip_vlr laszip_vlr_struct
Definition: LasDetails.h:46
A 3D cloud and its associated features (color, normals, scalar fields, etc.)
A scalar field associated to display-related parameters.
bool HasNearInfrared(unsigned pointFormatId)
Returns whether the point format support Near Infrared.
Definition: LasDetails.h:151
const std::array< const char *, 3 > & AvailableVersions()
Definition: LasDetails.cpp:177
bool IsLaszipVlr(const laszip_vlr_struct &)
Returns whether the vlr is the vlr for/of LASzip compression.
Definition: LasDetails.cpp:127
uint16_t PointFormatSize(unsigned pointFormat)
Definition: LasDetails.cpp:80
bool HasRGB(unsigned pointFormatId)
Returns whether the point format supports RGB.
Definition: LasDetails.h:132
LasVersion SelectBestVersion(const ccPointCloud &cloud)
Definition: LasDetails.cpp:182
bool HasGpsTime(unsigned pointFormatId)
Returns whether the point format supports Gps Time.
Definition: LasDetails.h:125
constexpr unsigned OVERLAP_FLAG_BIT_MASK
Definition: LasDetails.h:85
constexpr unsigned OVERLAP_FLAG_BIT_POS
Definition: LasDetails.h:84
bool IsExtraBytesVlr(const laszip_vlr_struct &)
Returns whether the vlr describes extra bytes.
Definition: LasDetails.cpp:136
bool HasWaveform(unsigned pointFormatId)
Returns whether the point format supports Waveforms.
Definition: LasDetails.h:143
uint16_t HeaderSize(unsigned versionMinor)
Returns the header size for the given minor version of the standard used.
Definition: LasDetails.cpp:112
void CloneVlrInto(const laszip_vlr_struct &src, laszip_vlr_struct &dst)
Clones the content of the src vlr into the dst vlr.
Definition: LasDetails.cpp:285
unsigned SizeOfVlrs(const laszip_vlr_struct *vlrs, unsigned numVlrs)
Definition: LasDetails.cpp:145
const std::vector< unsigned > * PointFormatsAvailableForVersion(QString version)
Definition: LasDetails.cpp:155
constexpr const char * ScanDirectionFlag
Definition: LasDetails.h:62
constexpr const char * WithheldFlag
Definition: LasDetails.h:67
constexpr const char * EdgeOfFlightLine
Definition: LasDetails.h:63
constexpr const char * ScanAngle
Definition: LasDetails.h:74
constexpr const char * SyntheticFlag
Definition: LasDetails.h:65
constexpr const char * NumberOfReturns
Definition: LasDetails.h:61
constexpr const char * OverlapFlag
Definition: LasDetails.h:76
constexpr const char * UserData
Definition: LasDetails.h:69
constexpr const char * Classification
Definition: LasDetails.h:64
constexpr const char * ScannerChannel
Definition: LasDetails.h:75
constexpr const char * KeypointFlag
Definition: LasDetails.h:66
constexpr const char * ReturnNumber
Definition: LasDetails.h:60
constexpr const char * ScanAngleRank
Definition: LasDetails.h:68
constexpr const char * NearInfrared
Definition: LasDetails.h:77
constexpr const char * GpsTime
Definition: LasDetails.h:71
constexpr const char * Intensity
Definition: LasDetails.h:59
constexpr const char * PointSourceId
Definition: LasDetails.h:70
friend QDataStream & operator>>(QDataStream &stream, EvlrHeader &hdr)
Definition: LasDetails.cpp:50
static constexpr size_t DESCRIPTION_SIZE
Definition: LasDetails.h:96
static constexpr size_t USER_ID_SIZE
Definition: LasDetails.h:95
static constexpr size_t SIZE
Definition: LasDetails.h:94
char description[DESCRIPTION_SIZE]
Definition: LasDetails.h:101
char userID[USER_ID_SIZE]
Definition: LasDetails.h:98
friend QDataStream & operator<<(QDataStream &stream, const EvlrHeader &hdr)
Definition: LasDetails.cpp:66
bool isWaveFormDataPackets() const
Definition: LasDetails.cpp:35
static EvlrHeader Waveform()
Definition: LasDetails.cpp:40
See SelectBestVersion
Definition: LasDetails.h:178