[Liblas-commits] libpc: liblas reader now accepting all point types
liblas-commits at liblas.org
liblas-commits at liblas.org
Mon Feb 28 17:22:20 EST 2011
details: http://hg.liblas.orglibpc/rev/531aa8c0544d
changeset: 115:531aa8c0544d
user: Michael P. Gerlek <mpg at flaxen.com>
date: Mon Feb 28 14:22:15 2011 -0800
description:
liblas reader now accepting all point types
diffstat:
include/libpc/Dimension.hpp | 24 +++-
src/Dimension.cpp | 47 ++++---
src/FauxReader.cpp | 4 +-
src/LasHeader.cpp | 6 +-
src/LasReader.cpp | 6 +-
src/LasWriter.cpp | 6 +-
src/drivers/liblas/reader.cpp | 233 +++++++++++++++++++++++++++++++++++++---
src/drivers/liblas/reader.hpp | 20 +++-
src/drivers/liblas/writer.cpp | 2 +-
test/unit/FauxReaderTest.cpp | 4 +-
test/unit/LiblasReaderTest.cpp | 95 +++++-----------
11 files changed, 318 insertions(+), 129 deletions(-)
diffs (truncated from 721 to 300 lines):
diff -r 7b7d0aa2cbec -r 531aa8c0544d include/libpc/Dimension.hpp
--- a/include/libpc/Dimension.hpp Mon Feb 28 09:31:08 2011 -0800
+++ b/include/libpc/Dimension.hpp Mon Feb 28 14:22:15 2011 -0800
@@ -70,19 +70,25 @@
Field_X,
Field_Y,
Field_Z,
- Field_Red,
- Field_Green,
- Field_Blue,
- Field_Time,
Field_Intensity,
Field_ReturnNumber,
Field_NumberOfReturns,
- Field_ScanDirection,
- Field_FlightLineEdge,
+ Field_ScanDirectionFlag,
+ Field_EdgeOfFlightLine,
Field_Classification,
Field_ScanAngleRank,
Field_UserData,
Field_PointSourceId,
+ Field_GpsTime,
+ Field_Red,
+ Field_Green,
+ Field_Blue,
+ Field_WavePacketDescriptorIndex,
+ Field_WaveformDataOffset,
+ Field_ReturnPointWaveformLocation,
+ Field_WaveformXt,
+ Field_WaveformYt,
+ Field_WaveformZt,
// ...
// add more here
@@ -225,6 +231,12 @@
m_numericOffset = v;
}
+ template<class T>
+ double getNumericValue(T x) const
+ {
+ return (double)x * m_numericScale + m_numericOffset;
+ }
+
/// If true, this dimension uses the numeric scale/offset values
inline bool isFinitePrecision() const
{
diff -r 7b7d0aa2cbec -r 531aa8c0544d src/Dimension.cpp
--- a/src/Dimension.cpp Mon Feb 28 09:31:08 2011 -0800
+++ b/src/Dimension.cpp Mon Feb 28 14:22:15 2011 -0800
@@ -59,11 +59,11 @@
, m_field(field)
, m_byteSize(0)
, m_description(std::string(""))
- , m_min(0)
- , m_max(0)
+ , m_min(0.0)
+ , m_max(0.0)
, m_precise(false)
- , m_numericScale(0)
- , m_numericOffset(0)
+ , m_numericScale(0.0)
+ , m_numericOffset(0.0)
{
m_byteSize = getDataTypeSize(m_dataType);
}
@@ -76,9 +76,9 @@
, m_description(other.m_description)
, m_min(other.m_min)
, m_max(other.m_max)
- , m_precise(false)
- , m_numericScale(0)
- , m_numericOffset(0)
+ , m_precise(other.m_precise)
+ , m_numericScale(other.m_numericScale)
+ , m_numericOffset(other.m_numericOffset)
{
}
@@ -340,30 +340,37 @@
void Dimension::initFieldNames()
{
+ for (int i=0; i<Dimension::Field_LAST; i++)
+ {
+ std::ostringstream ostr;
+ ostr << "Unnamed field " << i;
+ s_fieldNames[i] = ostr.str();
+ }
+
// BUG: not threadsafe
s_fieldNames[Field_INVALID] = "invalid";
s_fieldNames[Field_X] = "X";
s_fieldNames[Field_Y] = "Y";
s_fieldNames[Field_Z] = "Z";
- s_fieldNames[Field_Red] = "Red";
- s_fieldNames[Field_Green] = "Green";
- s_fieldNames[Field_Blue] = "Blue";
- s_fieldNames[Field_Time] = "Blue";
+ s_fieldNames[Field_Intensity] = "Intensity";
s_fieldNames[Field_ReturnNumber] = "ReturnNumber";
s_fieldNames[Field_NumberOfReturns] = "NumberOfReturns";
- s_fieldNames[Field_ScanDirection] = "ScanDirection";
- s_fieldNames[Field_FlightLineEdge] = "FlightLineEdge";
+ s_fieldNames[Field_ScanDirectionFlag] = "ScanDirectionFlag";
+ s_fieldNames[Field_EdgeOfFlightLine] = "EdgeOfFlightLine";
s_fieldNames[Field_Classification] = "Classification";
s_fieldNames[Field_ScanAngleRank] = "ScanAngleRank";
s_fieldNames[Field_UserData] = "UserData";
s_fieldNames[Field_PointSourceId] = "PointSourceId";
-
- for (int i=Dimension::Field_User1; i<Dimension::Field_LAST; i++)
- {
- std::ostringstream ostr;
- ostr << "Unnamed field " << i;
- s_fieldNames[i] = ostr.str();
- }
+ s_fieldNames[Field_GpsTime] = "GpsTime";
+ s_fieldNames[Field_Red] = "Red";
+ s_fieldNames[Field_Green] = "Green";
+ s_fieldNames[Field_Blue] = "Blue";
+ s_fieldNames[Field_WavePacketDescriptorIndex] = "WavePacketDescriptorIndex";
+ s_fieldNames[Field_WaveformDataOffset] = "WaveformDataOffset";
+ s_fieldNames[Field_ReturnPointWaveformLocation] = "ReturnPointWaveformLocation";
+ s_fieldNames[Field_WaveformXt] = "WaveformXt";
+ s_fieldNames[Field_WaveformYt] = "WaveformYt";
+ s_fieldNames[Field_WaveformZt] = "WaveformZt";
s_fieldNamesValid = true;
}
diff -r 7b7d0aa2cbec -r 531aa8c0544d src/FauxReader.cpp
--- a/src/FauxReader.cpp Mon Feb 28 09:31:08 2011 -0800
+++ b/src/FauxReader.cpp Mon Feb 28 14:22:15 2011 -0800
@@ -58,7 +58,7 @@
schema.addDimension(Dimension(Dimension::Field_X, Dimension::Float));
schema.addDimension(Dimension(Dimension::Field_Y, Dimension::Float));
schema.addDimension(Dimension(Dimension::Field_Z, Dimension::Float));
- schema.addDimension(Dimension(Dimension::Field_Time, Dimension::Uint64));
+ schema.addDimension(Dimension(Dimension::Field_GpsTime, Dimension::Uint64));
setHeader(header);
@@ -86,7 +86,7 @@
const double minZ = dims[2].getMinimum();
const double maxZ = dims[2].getMaximum();
- const std::size_t offsetT = schema.getDimensionIndex(Dimension::Field_Time);
+ const std::size_t offsetT = schema.getDimensionIndex(Dimension::Field_GpsTime);
const std::size_t offsetX = schema.getDimensionIndex(Dimension::Field_X);
const std::size_t offsetY = schema.getDimensionIndex(Dimension::Field_Y);
const std::size_t offsetZ = schema.getDimensionIndex(Dimension::Field_Z);
diff -r 7b7d0aa2cbec -r 531aa8c0544d src/LasHeader.cpp
--- a/src/LasHeader.cpp Mon Feb 28 09:31:08 2011 -0800
+++ b/src/LasHeader.cpp Mon Feb 28 14:22:15 2011 -0800
@@ -766,7 +766,7 @@
schema.addDimension(no_returns);
text.str("");
- Dimension scan_dir(Dimension::Field_ScanDirection, Dimension::Uint8); // 1 bit only
+ Dimension scan_dir(Dimension::Field_ScanDirectionFlag, Dimension::Uint8); // 1 bit only
text << "The Scan Direction Flag denotes the direction at which the "
"scanner mirror was traveling at the time of the output pulse. "
"A bit value of 1 is a positive scan direction, and a bit value "
@@ -777,7 +777,7 @@
schema.addDimension(scan_dir);
text.str("");
- Dimension edge(Dimension::Field_FlightLineEdge, Dimension::Uint8); // 1 bit only
+ Dimension edge(Dimension::Field_EdgeOfFlightLine, Dimension::Uint8); // 1 bit only
text << "The Edge of Flight Line data bit has a value of 1 only when "
"the point is at the end of a scan. It is the last point on "
"a given scan line before it changes direction.";
@@ -866,7 +866,7 @@
{
std::ostringstream text;
- Dimension t(Dimension::Field_Time, Dimension::Uint64);
+ Dimension t(Dimension::Field_GpsTime, Dimension::Uint64);
text << "The GPS Time is the double floating point time tag value at "
"which the point was acquired. It is GPS Week Time if the "
"Global Encoding low bit is clear and Adjusted Standard GPS "
diff -r 7b7d0aa2cbec -r 531aa8c0544d src/LasReader.cpp
--- a/src/LasReader.cpp Mon Feb 28 09:31:08 2011 -0800
+++ b/src/LasReader.cpp Mon Feb 28 14:22:15 2011 -0800
@@ -102,13 +102,13 @@
const std::size_t fieldIndexIntensity = schema.getDimensionIndex(Dimension::Field_Intensity);
const std::size_t fieldIndexReturnNum = schema.getDimensionIndex(Dimension::Field_ReturnNumber);
const std::size_t fieldIndexNumReturns = schema.getDimensionIndex(Dimension::Field_NumberOfReturns);
- const std::size_t fieldIndexScanDir = schema.getDimensionIndex(Dimension::Field_ScanDirection);
- const std::size_t fieldIndexFlight = schema.getDimensionIndex(Dimension::Field_FlightLineEdge);
+ const std::size_t fieldIndexScanDir = schema.getDimensionIndex(Dimension::Field_ScanDirectionFlag);
+ const std::size_t fieldIndexFlight = schema.getDimensionIndex(Dimension::Field_EdgeOfFlightLine);
const std::size_t fieldIndexClassification = schema.getDimensionIndex(Dimension::Field_Classification);
const std::size_t fieldIndexScanAngle = schema.getDimensionIndex(Dimension::Field_ScanAngleRank);
const std::size_t fieldIndexUserData = schema.getDimensionIndex(Dimension::Field_UserData);
const std::size_t fieldIndexPointSource = schema.getDimensionIndex(Dimension::Field_PointSourceId);
- const std::size_t fieldIndexTime = schema.getDimensionIndex(Dimension::Field_Time);
+ const std::size_t fieldIndexTime = schema.getDimensionIndex(Dimension::Field_GpsTime);
const std::size_t fieldIndexRed = schema.getDimensionIndex(Dimension::Field_Red);
const std::size_t fieldIndexGreen = schema.getDimensionIndex(Dimension::Field_Green);
const std::size_t fieldIndexBlue = schema.getDimensionIndex(Dimension::Field_Blue);
diff -r 7b7d0aa2cbec -r 531aa8c0544d src/LasWriter.cpp
--- a/src/LasWriter.cpp Mon Feb 28 09:31:08 2011 -0800
+++ b/src/LasWriter.cpp Mon Feb 28 14:22:15 2011 -0800
@@ -93,13 +93,13 @@
const std::size_t fieldIndexIntensity = schema.getDimensionIndex(Dimension::Field_Intensity);
const std::size_t fieldIndexReturnNum = schema.getDimensionIndex(Dimension::Field_ReturnNumber);
const std::size_t fieldIndexNumReturns = schema.getDimensionIndex(Dimension::Field_NumberOfReturns);
- const std::size_t fieldIndexScanDir = schema.getDimensionIndex(Dimension::Field_ScanDirection);
- const std::size_t fieldIndexFlight = schema.getDimensionIndex(Dimension::Field_FlightLineEdge);
+ const std::size_t fieldIndexScanDir = schema.getDimensionIndex(Dimension::Field_ScanDirectionFlag);
+ const std::size_t fieldIndexFlight = schema.getDimensionIndex(Dimension::Field_EdgeOfFlightLine);
const std::size_t fieldIndexClassification = schema.getDimensionIndex(Dimension::Field_Classification);
const std::size_t fieldIndexScanAngle = schema.getDimensionIndex(Dimension::Field_ScanAngleRank);
const std::size_t fieldIndexUserData = schema.getDimensionIndex(Dimension::Field_UserData);
const std::size_t fieldIndexPointSource = schema.getDimensionIndex(Dimension::Field_PointSourceId);
- const std::size_t fieldIndexTime = schema.getDimensionIndex(Dimension::Field_Time);
+ const std::size_t fieldIndexTime = schema.getDimensionIndex(Dimension::Field_GpsTime);
const std::size_t fieldIndexRed = schema.getDimensionIndex(Dimension::Field_Red);
const std::size_t fieldIndexGreen = schema.getDimensionIndex(Dimension::Field_Green);
const std::size_t fieldIndexBlue = schema.getDimensionIndex(Dimension::Field_Blue);
diff -r 7b7d0aa2cbec -r 531aa8c0544d src/drivers/liblas/reader.cpp
--- a/src/drivers/liblas/reader.cpp Mon Feb 28 09:31:08 2011 -0800
+++ b/src/drivers/liblas/reader.cpp Mon Feb 28 14:22:15 2011 -0800
@@ -38,6 +38,7 @@
#include <liblas/factory.hpp>
#include <liblas/bounds.hpp>
+#include <libpc/exceptions.hpp>
#include "header.hpp"
namespace libpc
@@ -45,27 +46,31 @@
LiblasReader::LiblasReader(std::istream& istream)
: Reader()
, m_istream(istream)
- , m_reader(NULL)
+ , m_externalReader(NULL)
+ , m_versionMajor(0)
+ , m_versionMinor(0)
+ , m_scaleX(0.0)
+ , m_scaleY(0.0)
+ , m_scaleZ(0.0)
+ , m_offsetX(0.0)
+ , m_offsetY(0.0)
+ , m_offsetZ(0.0)
+ , m_isCompressed(false)
+ , m_pointFormat(liblas::ePointFormatUnknown)
+ , m_hasTimeData(false)
+ , m_hasColorData(false)
+ , m_hasWaveData(false)
{
liblas::ReaderFactory f;
liblas::Reader reader = f.CreateWithStream(m_istream);
- m_reader = new liblas::Reader(reader);
+ m_externalReader = new liblas::Reader(reader);
- const liblas::Header& extHeader = m_reader->GetHeader();
-
LiblasHeader* myHeader = new LiblasHeader;
setHeader(myHeader);
- myHeader->setNumPoints( extHeader.GetPointRecordsCount() );
+ processExternalHeader();
- const liblas::Bounds<double>& extBounds = extHeader.GetExtent();
- const Bounds<double> bounds(extBounds.minx(), extBounds.miny(), extBounds.minz(), extBounds.maxx(), extBounds.maxy(), extBounds.maxz());
- myHeader->setBounds(bounds);
-
- Schema& schema = myHeader->getSchema();
- schema.addDimension(Dimension(Dimension::Field_X, Dimension::Double));
- schema.addDimension(Dimension(Dimension::Field_Y, Dimension::Double));
- schema.addDimension(Dimension(Dimension::Field_Z, Dimension::Double));
+ registerFields();
return;
}
@@ -73,7 +78,123 @@
LiblasReader::~LiblasReader()
{
- delete m_reader;
+ // BUG: this might be a smart pointer, so delete might not be needed
+ delete m_externalReader;
+}
+
+
+void LiblasReader::processExternalHeader()
+{
+ const liblas::Header& externalHeader = m_externalReader->GetHeader();
+ LiblasHeader& internalHeader = getLiblasHeader();
+
+ internalHeader.setNumPoints( externalHeader.GetPointRecordsCount() );
+
+ const liblas::Bounds<double>& externalBounds = externalHeader.GetExtent();
+ const Bounds<double> internalBounds(externalBounds.minx(), externalBounds.miny(), externalBounds.minz(), externalBounds.maxx(), externalBounds.maxy(), externalBounds.maxz());
+ internalHeader.setBounds(internalBounds);
+
+ m_versionMajor = externalHeader.GetVersionMajor();
More information about the Liblas-commits
mailing list