/// Read a point's data packed into a buffer. /// \param[in] view PointView to read from. /// \param[in] idx Index of point to read. /// \param[in] outbuf Buffer to write to. /// \return Number of bytes written to buffer. size_t DbWriter::readPoint(const PointView& view, PointId idx, char *outbuf) { view.getPackedPoint(m_dimTypes, idx, outbuf); auto iconvert = [](const XForm& xform, const char *inpos, char *outpos) { double d; int32_t i; memcpy(&d, inpos, sizeof(double)); d = (d - xform.m_offset) / xform.m_scale; i = boost::numeric_cast<int32_t>(lround(d)); memcpy(outpos, &i, sizeof(int32_t)); }; if (m_locationScaling) { int outOffset; if (m_xPackedOffset >= 0) outOffset = m_xPackedOffset; else if (m_yPackedOffset >= 0) outOffset = m_yPackedOffset; else if (m_zPackedOffset >= 0) outOffset = m_zPackedOffset; else outOffset = m_packedPointSize; //So we return the proper size. if (m_xPackedOffset >= 0) { iconvert(m_xXform, outbuf + m_xPackedOffset, outbuf + outOffset); outOffset += sizeof(int); } if (m_yPackedOffset >= 0) { iconvert(m_yXform, outbuf + m_yPackedOffset, outbuf + outOffset); outOffset += sizeof(int); } if (m_zPackedOffset >= 0) { iconvert(m_zXform, outbuf + m_zPackedOffset, outbuf + outOffset); outOffset += sizeof(int); } return outOffset; } else return m_packedPointSize; }
/// Read a point's data packed into a buffer. /// \param[in] view PointView to read from. /// \param[in] idx Index of point to read. /// \param[in] outbuf Buffer to write to. /// \return Number of bytes written to buffer. size_t DbWriter::readPoint(const PointView& view, PointId idx, char *outbuf) { using namespace Dimension; // Read the data for the output dimensions from the view into the outbuf. view.getPackedPoint(m_dimTypes, idx, outbuf); auto iconvert = [](const XForm& xform, Id::Enum dim, const char *inpos, char *outpos) { double d; int32_t i; memcpy(&d, inpos, sizeof(double)); d = (d - xform.m_offset) / xform.m_scale; if (!Utils::numericCast(d, i)) { std::ostringstream oss; oss << "Unable to convert double to int32 for packed DB output: "; oss << Dimension::name(dim) << ": (" << d << ")."; throw pdal_error(oss.str()); } memcpy(outpos, &i, sizeof(int32_t)); }; if (m_xOffsets.first >= 0) iconvert(m_xXform, Id::X, outbuf + m_xOffsets.first, outbuf + m_xOffsets.second); if (m_yOffsets.first >= 0) iconvert(m_yXform, Id::Y, outbuf + m_yOffsets.first, outbuf + m_yOffsets.second); if (m_zOffsets.first >= 0) iconvert(m_zXform, Id::Z, outbuf + m_zOffsets.first, outbuf + m_zOffsets.second); return m_dbPointSize; }