1 // $Id$
2 //
3 // (C) Copyright Mateusz Loskot 2008, mateusz@loskot.net
4 // Distributed under the BSD License
5 // (See accompanying file LICENSE.txt or copy at
6 // http://www.opensource.org/licenses/bsd-license.php)
7 //
8 #include <liblas/header.hpp>
9 #include <tut/tut.hpp>
10 #include "common.hpp"
11 // boost
12 #include <boost/cstdint.hpp>
13 // std
14 #include <string>
15 
16 using namespace boost;
17 
18 namespace tut {
19 
test_default_header(liblas::Header const & h)20 void test_default_header(liblas::Header const& h)
21 {
22     using liblas::Header;
23 
24     ensure_equals("wrong default file signature",
25         h.GetFileSignature(), Header::FileSignature);
26 
27     ensure_equals("wrong default file source id",
28         h.GetFileSourceId(), 0);
29     ensure_equals("wrong default reserved value",
30         h.GetReserved(), 0);
31 
32     boost::uuids::uuid g = boost::uuids::nil_uuid();
33     ensure_equals("wrong default project guid",
34         h.GetProjectId(), g);
35 
36     ensure_equals("wrong default major version",
37         h.GetVersionMajor(), 1);
38     ensure_equals("wrong default minor version",
39         h.GetVersionMinor(), 2);
40 
41     ensure_equals("wrong default system id",
42         h.GetSystemId(), Header::SystemIdentifier);
43     ensure_equals("wrong default software id",
44         h.GetSoftwareId(), Header::SoftwareIdentifier);
45 
46     // TODO: Fix me to use todays day # and year
47     // ensure_equals("wrong default creation day-of-year",
48     //     h.GetCreationDOY(), 0);
49     // ensure_equals("wrong default creation year",
50     //     h.GetCreationYear(), 0);
51     ensure_equals("wrong default header size",
52         h.GetHeaderSize(), boost::uint16_t(227));
53 
54     boost::uint32_t offset = 229;
55     if (h.GetVersionMinor() == 1 || h.GetVersionMinor() == 2)
56     {
57         offset = 227;
58     }
59     ensure_equals("wrong default data offset",
60         h.GetDataOffset(), offset);
61 
62     ensure_equals("wrong default records count",
63         h.GetRecordsCount(), boost::uint32_t(0));
64     ensure_equals("wrong default data format id",
65         h.GetDataFormatId(), liblas::ePointFormat3);
66     ensure_equals("wrong default data record length",
67         h.GetDataRecordLength(), liblas::ePointSize3);
68     ensure_equals("wrong default point records count",
69         h.GetPointRecordsCount(), boost::uint32_t(0));
70 
71     ensure_equals("wrong default X scale", h.GetScaleX(), double(1.0));
72     ensure_equals("wrong default Y scale", h.GetScaleY(), double(1.0));
73     ensure_equals("wrong default Z scale", h.GetScaleZ(), double(1.0));
74 
75     ensure_equals("wrong default X offset", h.GetOffsetX(), double(0));
76     ensure_equals("wrong default Y offset", h.GetOffsetY(), double(0));
77     ensure_equals("wrong default Z offset", h.GetOffsetZ(), double(0));
78 
79     ensure_equals("wrong default min X", h.GetMinX(), double(0));
80     ensure_equals("wrong default max X", h.GetMaxX(), double(0));
81     ensure_equals("wrong default min Y", h.GetMinY(), double(0));
82     ensure_equals("wrong default max Y", h.GetMaxY(), double(0));
83     ensure_equals("wrong default min Z", h.GetMinZ(), double(0));
84     ensure_equals("wrong default max Z", h.GetMaxZ(), double(0));
85 }
86 
test_default_point(liblas::Point const & p)87 void test_default_point(liblas::Point const& p)
88 {
89     ensure_equals("wrong default X coordinate",
90         p.GetX(), double(0));
91     ensure_equals("wrong default Y coordinate",
92         p.GetY(), double(0));
93     ensure_equals("wrong default Z coordinate",
94         p.GetZ(), double(0));
95     ensure_equals("wrong defualt intensity",
96         p.GetIntensity(), 0);
97     ensure_equals("wrong defualt return number",
98         p.GetReturnNumber(), 0);
99     ensure_equals("wrong defualt number of returns",
100         p.GetNumberOfReturns(), 0);
101     ensure_equals("wrong defualt scan direction",
102         p.GetScanDirection(), 0);
103     ensure_equals("wrong defualt edge of flight line",
104         p.GetFlightLineEdge(), 0);
105     ensure_equals("wrong defualt classification",
106         p.GetClassification(), liblas::Classification::bitset_type());
107     ensure_equals("wrong defualt scan angle rank",
108         p.GetScanAngleRank(), 0);
109     ensure_equals("wrong defualt file marker/user data value",
110         p.GetUserData(), 0);
111     ensure_equals("wrong defualt user bit field/point source id value",
112         p.GetPointSourceID(), 0);
113     ensure_equals("wrong defualt time",
114         p.GetTime(), double(0));
115 
116     ensure_equals("invalid default red color",
117         p.GetColor().GetRed(), 0);
118     ensure_equals("invalid default green color",
119         p.GetColor().GetGreen(), 0);
120     ensure_equals("invalid default blue color",
121         p.GetColor().GetBlue(), 0);
122 
123     ensure("invalid defualt point record", p.IsValid());
124 }
125 
test_file10_header(liblas::Header const & h)126 void test_file10_header(liblas::Header const& h)
127 {
128     ensure_equals(h.GetFileSignature(), liblas::Header::FileSignature);
129     ensure_equals(h.GetFileSourceId(), 0);
130     ensure_equals(h.GetReserved(), 0);
131 
132     boost::uuids::uuid g = boost::uuids::nil_uuid();
133     ensure_equals(g, boost::uuids::nil_uuid());
134     ensure_equals("wrong ProjectId", h.GetProjectId(), g);
135 
136     ensure_equals("wrong VersionMajor", h.GetVersionMajor(), 1);
137     ensure_equals("wrong VersionMinor", h.GetVersionMinor(), 0);
138     ensure_equals("wrong GetSystemId", h.GetSystemId(), std::string(""));
139     ensure_equals("wrong GetSoftwareId", h.GetSoftwareId(), std::string("TerraScan"));
140     ensure_equals("Wrong GetCreationDOY", h.GetCreationDOY(), 0);
141     ensure_equals("Wrong GetCreationYear", h.GetCreationYear(), 0);
142     ensure_equals("Wrong GetHeaderSize", h.GetHeaderSize(), boost::uint16_t(227));
143     ensure_equals("Wrong GetDataOffset", h.GetDataOffset(), boost::uint32_t(229));
144     ensure_equals("Wrong GetRecordsCount", h.GetRecordsCount(), boost::uint32_t(0));
145     ensure_equals("Wrong GetDataFormatId", h.GetDataFormatId(), liblas::ePointFormat1);
146     ensure_equals("Wrong GetDataRecordLength", h.GetDataRecordLength(), liblas::ePointSize1);
147     ensure_equals("Wrong GetPointRecordsCount", h.GetPointRecordsCount(), boost::uint32_t(8));
148     ensure_equals("Wrong GetScaleX", h.GetScaleX(), double(0.01));
149     ensure_equals("Wrong GetScaleY", h.GetScaleY(), double(0.01));
150     ensure_equals("Wrong GetScaleZ", h.GetScaleZ(), double(0.01));
151     ensure_equals("Wrong GetOffsetX", h.GetOffsetX(),double(-0));
152     ensure_equals("Wrong GetOffsetY", h.GetOffsetY(), double(-0));
153     ensure_equals("Wrong GetOffsetZ", h.GetOffsetZ(), double(-0));
154     ensure_equals("Wrong GetMinX", h.GetMinX(), double(630262.3));
155     ensure_equals("Wrong GetMaxX", h.GetMaxX(), double(630346.83));
156     ensure_equals("Wrong GetMinY", h.GetMinY(), double(4834500));
157     ensure_equals("Wrong GetMaxY", h.GetMaxY(), double(4834500));
158     ensure_equals("Wrong GetMinZ", h.GetMinZ(), double(50.9));
159     ensure_equals("Wrong GetMaxZ", h.GetMaxZ(), double(55.26));
160 }
161 
test_file10_point1(liblas::Point const & p)162 void test_file10_point1(liblas::Point const& p)
163 {
164     ensure_distance(p.GetX(), double(630262.30), 0.0001);
165     ensure_distance(p.GetY(), double(4834500), 0.0001);
166     ensure_distance(p.GetZ(), double(51.53), 0.0001);
167     ensure_equals(p.GetIntensity(), 670);
168     ensure_equals(p.GetClassification(), liblas::Classification::bitset_type(1));
169     ensure_equals(p.GetScanAngleRank(), 0);
170     ensure_equals(p.GetUserData(), 3);
171     ensure_equals(p.GetPointSourceID(), 0);
172     ensure_equals(p.GetScanFlags(), 9);
173     ensure_distance(p.GetTime(), double(413665.23360000004), 0.0001);
174 }
175 
test_file10_point2(liblas::Point const & p)176 void test_file10_point2(liblas::Point const& p)
177 {
178 
179     ensure_distance(p.GetX(), double(630282.45), 0.0001);
180     ensure_distance(p.GetY(), double(4834500), 0.0001);
181     ensure_distance(p.GetZ(), double(51.63), 0.0001);
182     ensure_equals(p.GetIntensity(), 350);
183     ensure_equals(p.GetClassification(), liblas::Classification::bitset_type(1));
184     ensure_equals(p.GetScanAngleRank(), 0);
185     ensure_equals(p.GetUserData(), 3);
186     ensure_equals(p.GetPointSourceID(), 0);
187     ensure_equals(p.GetScanFlags(), 9);
188     ensure_distance(p.GetTime(), double(413665.52880000003), 0.0001);
189 }
190 
test_file10_point4(liblas::Point const & p)191 void test_file10_point4(liblas::Point const& p)
192 {
193     ensure_distance(p.GetX(), double(630346.83), 0.0001);
194     ensure_distance(p.GetY(), double(4834500), 0.0001);
195     ensure_distance(p.GetZ(), double(50.90), 0.0001);
196     ensure_equals(p.GetIntensity(), 150);
197     ensure_equals(p.GetClassification(), liblas::Classification::bitset_type(1));
198     ensure_equals(p.GetScanAngleRank(), 0);
199     ensure_equals(p.GetUserData(), 4);
200     ensure_equals(p.GetPointSourceID(), 0);
201     ensure_equals(p.GetScanFlags(), 18);
202     ensure_distance(p.GetTime(), double(414093.84360000002), 0.0001);
203 }
204 
test_file_12Color_point0(liblas::Point const & p)205 void test_file_12Color_point0(liblas::Point const& p)
206 {
207     ensure_distance(p.GetX(), double(637012.240000), 0.0001);
208     ensure_distance(p.GetY(), double(849028.310000), 0.0001);
209     ensure_distance(p.GetZ(), double(431.660000), 0.0001);
210     ensure_distance(p.GetTime(), double(245380.782550), 0.0001);
211 
212     ensure_equals(p.GetReturnNumber(), 1);
213     ensure_equals(p.GetNumberOfReturns(), 1);
214     ensure_equals(p.GetFlightLineEdge(), 0);
215     ensure_equals(p.GetIntensity(), 143);
216     ensure_equals(p.GetScanDirection(), 1);
217     ensure_equals(p.GetScanAngleRank(), -9);
218 
219     ensure_equals(p.GetClassification().GetClass(), 1);
220     ensure_equals(p.GetClassification().IsWithheld(), false);
221     ensure_equals(p.GetClassification().IsKeyPoint(), false);
222     ensure_equals(p.GetClassification().IsSynthetic(), false);
223 
224     ensure_equals(p.GetColor().GetRed(), 68);
225     ensure_equals(p.GetColor().GetGreen(), 77);
226     ensure_equals(p.GetColor().GetBlue(), 88);
227 }
228 
test_file_12Color_point1(liblas::Point const & p)229 void test_file_12Color_point1(liblas::Point const& p)
230 {
231     ensure_distance(p.GetX(), double(636896.330000), 0.0001);
232     ensure_distance(p.GetY(), double(849087.700000), 0.0001);
233     ensure_distance(p.GetZ(), double(446.390000), 0.0001);
234     ensure_distance(p.GetTime(), double(245381.452799), 0.0001);
235 
236     ensure_equals(p.GetReturnNumber(), 1);
237     ensure_equals(p.GetNumberOfReturns(), 2);
238     ensure_equals(p.GetFlightLineEdge(), 0);
239     ensure_equals(p.GetIntensity(), 18);
240     ensure_equals(p.GetScanDirection(), 1);
241     ensure_equals(p.GetScanAngleRank(), -11);
242 
243     ensure_equals(p.GetClassification().GetClass(), 1);
244     ensure_equals(p.GetClassification().IsWithheld(), false);
245     ensure_equals(p.GetClassification().IsKeyPoint(), false);
246     ensure_equals(p.GetClassification().IsSynthetic(), false);
247 
248     ensure_equals(p.GetColor().GetRed(), 54);
249     ensure_equals(p.GetColor().GetGreen(), 66);
250     ensure_equals(p.GetColor().GetBlue(), 68);
251 }
252 
test_file_12Color_point2(liblas::Point const & p)253 void test_file_12Color_point2(liblas::Point const& p)
254 {
255     ensure_distance(p.GetX(), double(636784.740000), 0.0001);
256     ensure_distance(p.GetY(), double(849106.660000), 0.0001);
257     ensure_distance(p.GetZ(), double(426.710000), 0.0001);
258     ensure_distance(p.GetTime(), double(245382.135950), 0.0001);
259 
260     ensure_equals(p.GetReturnNumber(), 1);
261     ensure_equals(p.GetNumberOfReturns(), 1);
262     ensure_equals(p.GetFlightLineEdge(), 0);
263     ensure_equals(p.GetIntensity(), 118);
264     ensure_equals(p.GetScanDirection(), 0);
265     ensure_equals(p.GetScanAngleRank(), -10);
266 
267     ensure_equals(p.GetClassification().GetClass(), 1);
268     ensure_equals(p.GetClassification().IsWithheld(), false);
269     ensure_equals(p.GetClassification().IsKeyPoint(), false);
270     ensure_equals(p.GetClassification().IsSynthetic(), false);
271 
272     ensure_equals(p.GetColor().GetRed(), 112);
273     ensure_equals(p.GetColor().GetGreen(), 97);
274     ensure_equals(p.GetColor().GetBlue(), 114);
275 }
276 
test_laszip_vlr(liblas::Header const & header)277 void test_laszip_vlr(liblas::Header const& header)
278 {
279     bool found_vlr = false;
280 
281     std::vector<liblas::VariableRecord> const& vlrs = header.GetVLRs();
282     std::vector<liblas::VariableRecord>::const_iterator it;
283     for (it = vlrs.begin(); it != vlrs.end(); ++it)
284     {
285         liblas::VariableRecord const& vlr = *it;
286         if (vlr.GetUserId(false).compare("laszip encoded") == 0)
287         {
288             ensure_equals(found_vlr, false); // make sure we only find one
289             found_vlr = true;
290 
291             ensure_equals(vlr.GetRecordId(), 22204);
292             ensure_equals(vlr.GetRecordLength(), 52);
293         }
294     }
295 
296     ensure_equals(found_vlr, true); // make sure we found exactly one
297 
298     return;
299 }
300 }
301