diff --git a/include/pdal/drivers/las/SummaryData.hpp b/include/pdal/drivers/las/SummaryData.hpp index f3cf954842..281dcaae5f 100644 --- a/include/pdal/drivers/las/SummaryData.hpp +++ b/include/pdal/drivers/las/SummaryData.hpp @@ -36,6 +36,7 @@ #define INCLUDED_DRIVERS_LAS_SUMMARYDATA_HPP #include +#include #include @@ -59,15 +60,13 @@ class PDAL_DLL SummaryData boost::uint32_t getTotalNumPoints() const; - void getBounds(double& minX, double& minY, double& minZ, double& maxX, double& maxY, double& maxZ) const; + pdal::Bounds getBounds() const; // note that returnNumber is in the range [0..4] boost::uint32_t getReturnCount(int returnNumber) const; void dump(std::ostream&) const; - static const int s_maxNumReturns = 5; - private: bool m_isFirst; double m_minX; @@ -76,7 +75,7 @@ class PDAL_DLL SummaryData double m_maxX; double m_maxY; double m_maxZ; - boost::uint32_t m_returnCounts[s_maxNumReturns]; + std::vector m_returnCounts; boost::uint32_t m_totalNumPoints; SummaryData& operator=(const SummaryData&); // not implemented diff --git a/src/drivers/las/SummaryData.cpp b/src/drivers/las/SummaryData.cpp index 250c4d5bb3..742715b152 100644 --- a/src/drivers/las/SummaryData.cpp +++ b/src/drivers/las/SummaryData.cpp @@ -73,9 +73,8 @@ void SummaryData::reset() m_maxX = 0.0; m_maxY = 0.0; m_maxZ = 0.0; - - for (int i=0; i s_maxNumReturns) - // throw invalid_point_data("point returnNumber is out of range", 0); + if (returnNumber < 0 || returnNumber > m_returnCounts.size()-1) + throw invalid_point_data("addPoint: point returnNumber is out of range", 0); if (m_isFirst) { @@ -108,7 +107,7 @@ void SummaryData::addPoint(double x, double y, double z, int returnNumber) m_maxZ = std::max(m_maxZ, z); } - ++m_returnCounts[returnNumber-1]; + m_returnCounts[returnNumber] = m_returnCounts[returnNumber] + 1; ++m_totalNumPoints; @@ -122,23 +121,26 @@ boost::uint32_t SummaryData::getTotalNumPoints() const } -void SummaryData::getBounds(double& minX, double& minY, double& minZ, double& maxX, double& maxY, double& maxZ) const +pdal::Bounds SummaryData::getBounds() const { - minX = m_minX; - minY = m_minY; - minZ = m_minZ; - maxX = m_maxX; - maxY = m_maxY; - maxZ = m_maxZ; + pdal::Bounds output; + output.setMinimum(0, m_minX); + output.setMinimum(1, m_minY); + output.setMinimum(2, m_minZ); + + output.setMaximum(0, m_maxX); + output.setMaximum(1, m_maxY); + output.setMaximum(2, m_maxZ); + return output; } boost::uint32_t SummaryData::getReturnCount(int returnNumber) const { - // if (returnNumber < 0 || returnNumber > s_maxNumReturns) - // throw invalid_point_data("point returnNumber is out of range", 0); - - return m_returnCounts[returnNumber-1]; + if (returnNumber < 0 || returnNumber > m_returnCounts.size()-1) + throw invalid_point_data("getReturnCount: point returnNumber is out of range", 0); + + return m_returnCounts[returnNumber]; } @@ -152,7 +154,7 @@ void SummaryData::dump(std::ostream& str) const str << "MaxZ: " << m_maxZ << "\n"; str << "Number of returns:"; - for (int i=0; i::size_type i=0; i(p, data.getTotalNumPoints()); - for (int i=1; i<=SummaryData::s_maxNumReturns; i++) + for (int i=1; i<=maxReturns; i++) { Utils::write_field(p, data.getReturnCount(i)); } - Utils::write_n(stream, buf, 4 + 4*SummaryData::s_maxNumReturns); + Utils::write_n(stream, buf, 4 + 4*maxReturns); } // skip over scale/offset fields @@ -220,8 +222,13 @@ void Support::rewriteHeader(std::ostream& stream, const SummaryData& data) boost::uint8_t buf[256]; boost::uint8_t* p = buf; - double minX, minY, minZ, maxX, maxY, maxZ; - data.getBounds(minX, minY, minZ, maxX, maxY, maxZ); + pdal::Bounds bounds= data.getBounds(); + double minX = bounds.getMinimum(0); + double minY = bounds.getMinimum(1); + double minZ = bounds.getMinimum(2); + double maxX = bounds.getMaximum(0); + double maxY = bounds.getMaximum(1); + double maxZ = bounds.getMaximum(2); Utils::write_field(p, maxX); Utils::write_field(p, minX); Utils::write_field(p, maxY); diff --git a/test/unit/drivers/las/LasWriterTest.cpp b/test/unit/drivers/las/LasWriterTest.cpp index 94da0cc71f..6a4d5915f0 100644 --- a/test/unit/drivers/las/LasWriterTest.cpp +++ b/test/unit/drivers/las/LasWriterTest.cpp @@ -375,11 +375,11 @@ BOOST_AUTO_TEST_CASE(test_different_formats) BOOST_AUTO_TEST_CASE(test_summary_data_add_point) { pdal::drivers::las::SummaryData summaryData; - double minX, minY, minZ, maxX, maxY, maxZ; summaryData.addPoint(-95.329381929535259, 29.71948951835612, -17.515486778166398, 0); - summaryData.getBounds(minX, minY, minZ, maxX, maxY, maxZ); - BOOST_CHECK_EQUAL(minZ, maxZ); + pdal::Bounds b = summaryData.getBounds(); + BOOST_CHECK_EQUAL(b.getMinimum(0), b.getMaximum(0)); + BOOST_CHECK_EQUAL(b.getMinimum(2), b.getMaximum(2)); }