From cf6b07b75cbf86bd18d9319468f559942f5e8eff Mon Sep 17 00:00:00 2001 From: Howard Butler Date: Tue, 15 Sep 2015 13:11:10 -0500 Subject: [PATCH] refactor filters.colorization to use gdal::Raster --- filters/colorization/ColorizationFilter.cpp | 89 +++------------------ filters/colorization/ColorizationFilter.hpp | 10 +-- 2 files changed, 11 insertions(+), 88 deletions(-) diff --git a/filters/colorization/ColorizationFilter.cpp b/filters/colorization/ColorizationFilter.cpp index c6a510c829..9bb518cc3a 100644 --- a/filters/colorization/ColorizationFilter.cpp +++ b/filters/colorization/ColorizationFilter.cpp @@ -54,15 +54,6 @@ CREATE_STATIC_PLUGIN(1, 0, ColorizationFilter, Filter, s_info) std::string ColorizationFilter::getName() const { return s_info.name; } -struct GDALSourceDeleter -{ - template - void operator()(T* ptr) - { - ::GDALClose(ptr); - } -}; - void ColorizationFilter::initialize() { @@ -154,21 +145,8 @@ void ColorizationFilter::addDimensions(PointLayoutPtr layout) void ColorizationFilter::ready(PointTableRef table) { - m_forward_transform.assign(0.0); - m_inverse_transform.assign(0.0); - - log()->get(LogLevel::Debug) << "Using " << m_rasterFilename << - " for raster" << std::endl; - m_ds = GDALOpen(m_rasterFilename.c_str(), GA_ReadOnly); - if (m_ds == NULL) - throw pdal_error("Unable to open GDAL datasource!"); - - if (GDALGetGeoTransform(m_ds, &(m_forward_transform.front())) != CE_None) - throw pdal_error("unable to fetch forward geotransform for raster!"); - - if (!GDALInvGeoTransform(&(m_forward_transform.front()), - &(m_inverse_transform.front()))) - throw pdal_error("unable to fetch inverse geotransform for raster!"); + m_raster = std::unique_ptr(new gdal::Raster(m_rasterFilename)); + m_raster->open(); for (auto bi = m_bands.begin(); bi != m_bands.end(); ++bi) { @@ -183,72 +161,25 @@ void ColorizationFilter::ready(PointTableRef table) void ColorizationFilter::filter(PointView& view) { - int32_t pixel(0); - int32_t line(0); - - std::array pix = { {0.0, 0.0} }; + std::vector data; + int i(0); for (PointId idx = 0; idx < view.size(); ++idx) { + int i(0); double x = view.getFieldAs(Dimension::Id::X, idx); double y = view.getFieldAs(Dimension::Id::Y, idx); - if (!getPixelAndLinePosition(x, y, m_inverse_transform, pixel, - line, m_ds)) - continue; + bool bRead = m_raster->read(x, y, data); + + if (!bRead) continue; for (auto bi = m_bands.begin(); bi != m_bands.end(); ++bi) { gdal::BandInfo& b = *bi; - GDALRasterBandH hBand = GDALGetRasterBand(m_ds, b.m_band); - if (hBand == NULL) - { - std::ostringstream oss; - oss << "Unable to get band " << b.m_band << - " from data source!"; - throw pdal_error(oss.str()); - } - if (GDALRasterIO(hBand, GF_Read, pixel, line, 1, 1, - &pix[0], 1, 1, GDT_CFloat64, 0, 0) == CE_None) - view.setField(b.m_dim, idx, pix[0] * b.m_scale); + view.setField(b.m_dim, idx, data[i] * b.m_scale); + ++i; } } } - -// Determines the pixel/line position given an x/y. -// No reprojection is done at this time. -bool ColorizationFilter::getPixelAndLinePosition(double x, double y, - boost::array const& inverse, int32_t& pixel, - int32_t& line, void *ds) -{ - pixel = (int32_t)std::floor(inverse[0] + (inverse[1] * x) + - (inverse[2] * y)); - line = (int32_t) std::floor(inverse[3] + (inverse[4] * x) + - (inverse[5] * y)); - - int xs = GDALGetRasterXSize(ds); - int ys = GDALGetRasterYSize(ds); - - if (!xs || !ys) - throw pdal_error("Unable to get X or Y size from raster!"); - - if (pixel < 0 || line < 0 || pixel >= xs || line >= ys) - { - // The x, y is not coincident with this raster - return false; - } - - return true; -} - - -void ColorizationFilter::done(PointTableRef /*table*/) -{ - if (m_ds != 0) - { - GDALClose(m_ds); - m_ds = 0; - } -} - } // namespace pdal diff --git a/filters/colorization/ColorizationFilter.hpp b/filters/colorization/ColorizationFilter.hpp index 66be9fe64b..695de6a9c5 100644 --- a/filters/colorization/ColorizationFilter.hpp +++ b/filters/colorization/ColorizationFilter.hpp @@ -75,19 +75,11 @@ class PDAL_DLL ColorizationFilter : public Filter virtual void addDimensions(PointLayoutPtr layout); virtual void ready(PointTableRef table); virtual void filter(PointView& view); - virtual void done(PointTableRef table); - - bool getPixelAndLinePosition(double x, double y, - boost::array const& inverse, int32_t& pixel, - int32_t& line, void *ds); std::string m_rasterFilename; std::vector m_bands; - boost::array m_forward_transform; - boost::array m_inverse_transform; - - GDALDatasetH m_ds; + std::unique_ptr m_raster; ColorizationFilter& operator=(const ColorizationFilter&); // not implemented ColorizationFilter(const ColorizationFilter&); // not implemented