void InPlaceReprojection::updateBounds(PointBuffer& buffer) { const Bounds<double>& oldBounds = buffer.getSpatialBounds(); double minx = oldBounds.getMinimum(0); double miny = oldBounds.getMinimum(1); double minz = oldBounds.getMinimum(2); double maxx = oldBounds.getMaximum(0); double maxy = oldBounds.getMaximum(1); double maxz = oldBounds.getMaximum(2); try { m_reprojectionFilter.transform(minx, miny, minz); m_reprojectionFilter.transform(maxx, maxy, maxz); } catch (pdal::pdal_error&) { return; } Bounds<double> newBounds(minx, miny, minz, maxx, maxy, maxz); buffer.setSpatialBounds(newBounds); return; }
boost::uint32_t ByteSwap::processBuffer(PointBuffer& dstData, const PointBuffer& srcData) const { const Schema& dstSchema = dstData.getSchema(); schema::index_by_index const& dstDims = dstSchema.getDimensions().get<schema::index>(); dstData.setSpatialBounds(srcData.getSpatialBounds()); dstData.copyPointsFast(0, 0, srcData, srcData.getNumPoints()); dstData.setNumPoints(srcData.getNumPoints()); for (boost::uint32_t i = 0; i != dstData.getNumPoints(); ++i) { boost::uint8_t* data = dstData.getData(i); std::size_t position = 0; for (boost::uint32_t n = 0; n < dstDims.size(); ++n) { const Dimension& d = dstSchema.getDimension(n); std::size_t size = d.getByteSize(); boost::uint8_t* pos = data + position; SWAP_ENDIANNESS_N(*pos, size); position = position + size; } } return dstData.getNumPoints(); }
boost::uint32_t IteratorBase::myReadBlocks(PointBuffer& user_buffer) { boost::uint32_t numPointsRead = 0; user_buffer.setNumPoints(0); bool bDidRead = false; if (!m_oracle_buffer) { m_oracle_buffer = fetchPointBuffer(m_initialQueryStatement, m_block->pc); if (!m_oracle_buffer) throw pdal_error("m_oracle_buffer was NULL!"); m_dimension_map = fetchDimensionMap(m_initialQueryStatement, m_block->pc, *m_oracle_buffer, user_buffer); boost::int32_t current_cloud_id(0); current_cloud_id = m_initialQueryStatement->GetInteger(&m_block->pc->pc_id); m_active_cloud_id = current_cloud_id; } // This shouldn't ever happen if (m_block->num_points > static_cast<boost::int32_t>(m_oracle_buffer->getCapacity())) { m_oracle_buffer->resize(m_block->num_points); } if (!m_block->num_points) { // We still have a block of data from the last readBuffer call // that was partially read. getReader().log()->get(logDEBUG3) << "IteratorBase::myReadBlocks: fetching first block" << std::endl; bDidRead = m_initialQueryStatement->Fetch(); if (!bDidRead) { m_at_end = true; return 0; } user_buffer.setSpatialBounds(getBounds(m_initialQueryStatement, m_block)); } else { // Our read was already "done" last readBuffer call, but if we're done, // we're done if (m_at_end) getReader().log()->get(logDEBUG3) << "IteratorBase::myReadBlocks: we are at end of the blocks;" << std::endl; else getReader().log()->get(logDEBUG3) << "IteratorBase::myReadBlocks: we have points left to read on this block" << std::endl; if (m_at_end) return 0; bDidRead = true; } while (bDidRead) { boost::uint32_t numReadThisBlock = m_block->num_points; boost::uint32_t numSpaceLeftThisBuffer = user_buffer.getCapacity() - user_buffer.getNumPoints(); getReader().log()->get(logDEBUG4) << "IteratorBase::myReadBlocks:" "numReadThisBlock: " << numReadThisBlock << " numSpaceLeftThisBlock: " << numSpaceLeftThisBuffer << " total numPointsRead: " << numPointsRead << std::endl; numPointsRead = numPointsRead + numReadThisBlock; readBlob(m_initialQueryStatement, m_block, m_block->num_points); fillUserBuffer(user_buffer); if (m_buffer_position != 0) { return user_buffer.getNumPoints(); } else { bDidRead = m_initialQueryStatement->Fetch(); if (!bDidRead) { getReader().log()->get(logDEBUG3) << "IteratorBase::myReadBlocks: done reading block. Read " << numPointsRead << " points" << std::endl; m_at_end = true; return user_buffer.getNumPoints(); } } boost::int32_t current_cloud_id(0); current_cloud_id = m_initialQueryStatement->GetInteger(&m_block->pc->pc_id); getReader().log()->get(logDEBUG3) << "IteratorBase::myReadBlocks: current_cloud_id: " << current_cloud_id << " m_active_cloud_id: " << m_active_cloud_id << std::endl; if (current_cloud_id != m_active_cloud_id) { m_oracle_buffer = fetchPointBuffer(m_initialQueryStatement, m_block->pc); if (!m_oracle_buffer) throw pdal_error("m_oracle_buffer was NULL!"); m_dimension_map = fetchDimensionMap(m_initialQueryStatement, m_block->pc, *m_oracle_buffer, user_buffer); m_active_cloud_id = current_cloud_id; return user_buffer.getNumPoints(); } } return numPointsRead; }