Skip to content

Commit

Permalink
Copy icebridge files over to hdf plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
Ryan Pals committed Jan 16, 2020
1 parent a895560 commit 6554036
Show file tree
Hide file tree
Showing 8 changed files with 745 additions and 0 deletions.
5 changes: 5 additions & 0 deletions cmake/options.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ option(BUILD_PLUGIN_ICEBRIDGE
add_feature_info("Icebridge plugin" BUILD_PLUGIN_ICEBRIDGE
"read data in the Icebridge format")

option(BUILD_PLUGIN_HDF
"Choose if HDF support should be built" FALSE)
add_feature_info("HDF plugin" BUILD_PLUGIN_HDF
"read data in the HDF format")

option(BUILD_PLUGIN_MATLAB
"Choose if Matlab support should be built" FALSE)
add_feature_info("Matlab plugin" BUILD_PLUGIN_MATLAB
Expand Down
7 changes: 7 additions & 0 deletions plugins/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,13 @@ if(BUILD_PLUGIN_ICEBRIDGE)
add_subdirectory(icebridge)
endif()

if(BUILD_PLUGIN_HDF)
if (NOT PDAL_HAVE_LIBXML2)
message(FATAL_ERROR "Can't build hdf plugin without libxml2")
endif()
add_subdirectory(hdf)
endif()

if(BUILD_PLUGIN_MATLAB)
add_subdirectory(matlab)
endif()
Expand Down
22 changes: 22 additions & 0 deletions plugins/hdf/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#
# Icebridge plugin CMake configuration
#

include (${PDAL_CMAKE_DIR}/hdf5.cmake)


if (NOT PDAL_HAVE_HDF5)
message(FATAL "HDF5 not found but is required for Icebridge.")
else()
PDAL_ADD_PLUGIN(libname reader hdf
FILES
io/HdfReader.cpp
io/Hdf5Handler.cpp
LINK_WITH
${HDF5_LIBRARIES}
INCLUDES
${ROOT_DIR}
${LIBXML2_INCLUDE_DIR}
)

endif()
152 changes: 152 additions & 0 deletions plugins/hdf/io/Hdf5Handler.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
/******************************************************************************
* Copyright (c) 2014, Connor Manning, connor@hobu.co
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following
* conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided
* with the distribution.
* * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
****************************************************************************/

#include "Hdf5Handler.hpp"
#include <pdal/util/FileUtils.hpp>
#include <pdal/pdal_types.hpp>

namespace pdal
{

using namespace hdf5;

Hdf5Handler::Hdf5Handler()
: m_numPoints(0)
, m_columnDataMap()
{ }

void Hdf5Handler::initialize(
const std::string& filename,
const std::vector<Hdf5ColumnData>& columns)
{
try
{
m_h5File.reset(new H5::H5File(filename, H5F_ACC_RDONLY));
}
catch (const H5::FileIException&)
{
throw error("Could not open HDF5 file '" + filename + "'.");
}

try
{
// Open each HDF5 DataSet and its corresponding DataSpace.
for (const auto& col : columns)
{
const std::string dataSetName = col.name;
const H5::PredType predType = col.predType;
const H5::DataSet dataSet = m_h5File->openDataSet(dataSetName);
const H5::DataSpace dataSpace = dataSet.getSpace();

m_columnDataMap.insert(std::make_pair(
dataSetName,
ColumnData(predType, dataSet, dataSpace)));

// Does not check whether all the columns are the same length.
m_numPoints = (std::max)((uint64_t)getColumnNumEntries(dataSetName),
m_numPoints);
}
}
catch (const H5::Exception&)
{
throw error("Could not initialize data set information.");
}
}

void Hdf5Handler::close()
{
m_h5File->close();
}

uint64_t Hdf5Handler::getNumPoints() const
{
return m_numPoints;
}

void Hdf5Handler::getColumnEntries(
void* data,
const std::string& dataSetName,
const hsize_t numEntries,
const hsize_t offset) const
{
try
{
const ColumnData& columnData(getColumnData(dataSetName));

columnData.dataSpace.selectHyperslab(
H5S_SELECT_SET,
&numEntries,
&offset);

const hsize_t outOffset = 0;
const H5::DataSpace outSpace(1, &numEntries);
outSpace.selectHyperslab(H5S_SELECT_SET, &numEntries, &outOffset);

columnData.dataSet.read(
data,
columnData.predType,
outSpace,
columnData.dataSpace);
}
catch (const H5::Exception&)
{
throw error("Could not read from dataset.");
}
}

hsize_t
Hdf5Handler::getColumnNumEntries(const std::string& dataSetName) const
{
hsize_t entries = 0;

getColumnData(dataSetName).dataSpace.getSimpleExtentDims(&entries);

return entries;
}

const Hdf5Handler::ColumnData&
Hdf5Handler::getColumnData(const std::string& dataSetName) const
{
const auto columnDataIt(m_columnDataMap.find(dataSetName));

if (columnDataIt == m_columnDataMap.end())
{
throw error("Could not retrieve column data.");
}

return columnDataIt->second;
}

} // namespace pdal

119 changes: 119 additions & 0 deletions plugins/hdf/io/Hdf5Handler.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
/******************************************************************************
* Copyright (c) 2014, Connor Manning, connor@hobu.co
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following
* conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided
* with the distribution.
* * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
****************************************************************************/

#pragma once

#include <pdal/pdal_export.hpp> // Suppresses windows 4251 messages
#include "H5Cpp.h"

#include <memory>
#include <vector>
#include <string>
#include <map>

namespace pdal
{

namespace hdf5
{
struct Hdf5ColumnData
{
Hdf5ColumnData(const std::string& name, const H5::PredType predType)
: name(name)
, predType(predType)
{ }

const std::string name;
const H5::PredType predType;
};
}

class Hdf5Handler
{
public:
struct error : public std::runtime_error
{
error(const std::string& err) : std::runtime_error(err)
{}
};

Hdf5Handler();

void initialize(
const std::string& filename,
const std::vector<hdf5::Hdf5ColumnData>& columns);
void close();

uint64_t getNumPoints() const;

void getColumnEntries(
void* data,
const std::string& dataSetName,
const hsize_t numEntries,
const hsize_t offset) const;

private:
struct ColumnData
{
ColumnData(
H5::PredType predType,
H5::DataSet dataSet,
H5::DataSpace dataSpace)
: predType(predType)
, dataSet(dataSet)
, dataSpace(dataSpace)
{ }

ColumnData(H5::PredType predType)
: predType(predType)
, dataSet()
, dataSpace()
{ }

H5::PredType predType;
H5::DataSet dataSet;
H5::DataSpace dataSpace;
};

hsize_t getColumnNumEntries(const std::string& dataSetName) const;
const ColumnData& getColumnData(const std::string& dataSetName) const;

std::unique_ptr<H5::H5File> m_h5File;
uint64_t m_numPoints;

std::map<std::string, ColumnData> m_columnDataMap;
};

} // namespace pdal

0 comments on commit 6554036

Please sign in to comment.