13 #include <liblas/liblas.hpp>
14 #include <liblas/reader.hpp>
15 #include <liblas/writer.hpp>
64 template <
class POINTSMAP>
66 const POINTSMAP& ptmap,
const std::string& filename,
74 std::cerr <<
"[saveLASFile] Couldn't write to file: " << filename
82 const size_t nPts = ptmap.size();
84 header.SetPointRecordsCount(nPts);
88 liblas::Writer writer(ofs,
header);
90 const bool has_color = ptmap.hasColorPoints();
91 const float col_fract = 255.0f;
95 for (
size_t i = 0; i < nPts; i++)
97 float x, y, z,
R,
G, B;
98 ptmap.getPoint(i, x, y, z,
R,
G, B);
106 col.SetRed(
static_cast<uint16_t
>(
R * col_fract));
107 col.SetGreen(
static_cast<uint16_t
>(
G * col_fract));
108 col.SetBlue(
static_cast<uint16_t
>(B * col_fract));
112 if (!writer.WritePoint(pt))
114 std::cerr <<
"[saveLASFile] liblas returned error writing point #"
115 << i <<
" to file.\n";
127 template <
class POINTSMAP>
129 POINTSMAP& ptmap,
const std::string& filename,
137 ifs.open(filename.c_str(), std::ios::in | std::ios::binary);
141 std::cerr <<
"[loadLASFile] Couldn't open file: " << filename
148 liblas::Reader reader(ifs);
152 liblas::Header
const&
header = reader.GetHeader();
153 const size_t nPts =
header.GetPointRecordsCount();
159 #if LIBLAS_VERSION_NUM < 1800
163 boost::lexical_cast<std::string>(
header.GetProjectId());
171 const bool has_color = ptmap.hasColorPoints();
172 const float col_fract = 1.0f / 255.0f;
173 while (reader.ReadNextPoint())
175 liblas::Point
const& p = reader.GetPoint();
179 liblas::Color
const& col = p.GetColor();
180 ptmap.insertPointRGB(
181 p.GetX(), p.GetY(), p.GetZ(), col.GetRed() * col_fract,
182 col.GetGreen() * col_fract, col.GetBlue() * col_fract);
186 ptmap.insertPoint(p.GetX(), p.GetY(), p.GetZ());
190 if (ptmap.size() != nPts)
191 cerr <<
"[loadLASFile] Header says point count is " << nPts
192 <<
" but only " << ptmap.size() <<
" were really parsed in.\n";
194 ptmap.mark_as_modified();