Skip to content

Commit

Permalink
fix up pdal::drivers::las::SummaryData
Browse files Browse the repository at this point in the history
  • Loading branch information
hobu committed Nov 7, 2013
1 parent 19ddd57 commit 0d7b57b
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 29 deletions.
7 changes: 3 additions & 4 deletions include/pdal/drivers/las/SummaryData.hpp
Expand Up @@ -36,6 +36,7 @@
#define INCLUDED_DRIVERS_LAS_SUMMARYDATA_HPP

#include <pdal/pdal_internal.hpp>
#include <pdal/Bounds.hpp>

#include <ostream>

Expand All @@ -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<double> 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;
Expand All @@ -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<boost::uint32_t> m_returnCounts;
boost::uint32_t m_totalNumPoints;

SummaryData& operator=(const SummaryData&); // not implemented
Expand Down
38 changes: 20 additions & 18 deletions src/drivers/las/SummaryData.cpp
Expand Up @@ -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; i++)
m_returnCounts[i] = 0;

m_returnCounts.assign(7,0);

m_totalNumPoints = 0;

Expand All @@ -85,8 +84,8 @@ void SummaryData::reset()

void SummaryData::addPoint(double x, double y, double z, int returnNumber)
{
// if (returnNumber < 0 || returnNumber > 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)
{
Expand All @@ -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;

Expand All @@ -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<double> SummaryData::getBounds() const
{
minX = m_minX;
minY = m_minY;
minZ = m_minZ;
maxX = m_maxX;
maxY = m_maxY;
maxZ = m_maxZ;
pdal::Bounds<double> 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];
}


Expand All @@ -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<s_maxNumReturns; i++)
for (std::vector<boost::uint32_t>::size_type i=0; i<m_returnCounts.size(); i++)
{
str << " " << m_returnCounts[i];
}
Expand Down
15 changes: 11 additions & 4 deletions src/drivers/las/Support.cpp
Expand Up @@ -199,18 +199,20 @@ void Support::rewriteHeader(std::ostream& stream, const SummaryData& data)
// move from header start to "number of point records" field
stream.seekp(107, std::ios_base::cur);

// FIXME: This is only for LAS 1.3 and less!
const int maxReturns = 5;
{
boost::uint8_t buf[256];
boost::uint8_t* p = buf;

Utils::write_field<boost::uint32_t>(p, data.getTotalNumPoints());

for (int i=1; i<=SummaryData::s_maxNumReturns; i++)
for (int i=1; i<=maxReturns; i++)
{
Utils::write_field<boost::uint32_t>(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
Expand All @@ -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<double> 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<double>(p, maxX);
Utils::write_field<double>(p, minX);
Utils::write_field<double>(p, maxY);
Expand Down
6 changes: 3 additions & 3 deletions test/unit/drivers/las/LasWriterTest.cpp
Expand Up @@ -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<double> b = summaryData.getBounds();
BOOST_CHECK_EQUAL(b.getMinimum(0), b.getMaximum(0));
BOOST_CHECK_EQUAL(b.getMinimum(2), b.getMaximum(2));
}


Expand Down

0 comments on commit 0d7b57b

Please sign in to comment.