[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