void ColorizationFilter::filter(PointView& view) { int32_t pixel(0); int32_t line(0); std::array<double, 2> pix = { {0.0, 0.0} }; for (PointId idx = 0; idx < view.size(); ++idx) { double x = view.getFieldAs<double>(Dimension::Id::X, idx); double y = view.getFieldAs<double>(Dimension::Id::Y, idx); if (!getPixelAndLinePosition(x, y, m_inverse_transform, pixel, line, m_ds)) continue; for (auto bi = m_bands.begin(); bi != m_bands.end(); ++bi) { 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); } } }
boost::uint32_t Colorization::readBufferImpl(PointBuffer& data) { const boost::uint32_t numRead = getPrevIterator().read(data); #ifdef PDAL_HAVE_GDAL boost::int32_t pixel(0); boost::int32_t line(0); double x(0.0); double y(0.0); bool fetched(false); boost::array<double, 2> pix; pix.assign(0.0); for (boost::uint32_t pointIndex=0; pointIndex<numRead; pointIndex++) { x = getScaledValue(data, *m_dimX, pointIndex); y = getScaledValue(data, *m_dimY, pointIndex); fetched = getPixelAndLinePosition(x, y, m_inverse_transform, pixel, line, m_ds); if (!fetched) continue; for (std::vector<boost::int32_t>::size_type i = 0; i < m_bands.size(); i++) { GDALRasterBandH hBand = GDALGetRasterBand(m_ds, m_bands[i]); if (hBand == NULL) { std::ostringstream oss; oss << "Unable to get band " << m_bands[i] << " 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) { double output = pix[0]; output = output * m_scales[i]; setScaledValue(data, output, *m_dimensions[i], pointIndex); } } } #endif return numRead; }