Skip to content

Commit

Permalink
support assigning an explicit Z dimension, support swapping dimensions
Browse files Browse the repository at this point in the history
  • Loading branch information
hobu committed Mar 30, 2018
1 parent 0f60fbb commit e8c7200
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 4 deletions.
32 changes: 28 additions & 4 deletions plugins/python/io/NumpyReader.cpp
Expand Up @@ -210,6 +210,23 @@ void NumpyReader::addArgs(ProgramArgs& args)
"Dimension name to map raster dimension values to ",
m_defaultDimension,
"Intensity");
args.add<size_t>("x",
"Dimension number to map to X",
m_xDimNum,
0);
args.add<size_t>("y",
"Dimension number to map to Y",
m_yDimNum,
1);
args.add<size_t>("z",
"Dimension number to map to Z",
m_zDimNum,
2);
args.add<double>("assign_z",
"Assign Z dimension to a single given value",
m_assignZ,
0.0);

}

void NumpyReader::prepareFieldsArray(PointLayoutPtr layout)
Expand Down Expand Up @@ -296,6 +313,9 @@ void NumpyReader::prepareRasterArray(PointLayoutPtr layout)
{
layout->registerDim(pdal::Dimension::Id::X, pdal::Dimension::Type::Signed32);
layout->registerDim(pdal::Dimension::Id::Y, pdal::Dimension::Type::Signed32);

if (m_assignZ != 0.0f)
layout->registerDim(pdal::Dimension::Id::Z, pdal::Dimension::Type::Signed32);
pdal::Dimension::Id id = layout->registerOrAssignDim(m_defaultDimension, m_types[0]);

m_ids.push_back(id);
Expand Down Expand Up @@ -367,10 +387,14 @@ bool NumpyReader::loadPoint(PointRef& point, point_count_t position )
} else if (m_ndims == 2)
{
// Figure out X, Y position based on how we are iterating
double i = position;
double x = std::fmod(position, (m_shape[0] +1));
position = position / (m_shape[1] + 1);
double y = std::fmod(i, (m_shape[1] + 1));
// stolen from https://stackoverflow.com/a/10904309
double i = (double) position;
double x = std::fmod(i, ((double)m_shape[m_xDimNum] + 1));
i = i / ((double) m_shape[0] );
double y = std::fmod(i, ((double)m_shape[m_yDimNum] + 1));
if (m_assignZ != 0.0f)
point.setField(pdal::Dimension::Id::Z, m_assignZ);


point.setField(pdal::Dimension::Id::X, x);
point.setField(pdal::Dimension::Id::Y, y);
Expand Down
5 changes: 5 additions & 0 deletions plugins/python/io/NumpyReader.hpp
Expand Up @@ -102,6 +102,11 @@ class PDAL_DLL NumpyReader : public Reader, public Streamable
int m_ndims;
std::string m_defaultDimension;

size_t m_xDimNum;
size_t m_yDimNum;
size_t m_zDimNum;
double m_assignZ;

std::vector<pdal::Dimension::Id> m_ids;
std::vector<pdal::Dimension::Type> m_types;
std::vector<int> m_sizes;
Expand Down

0 comments on commit e8c7200

Please sign in to comment.