point_count_t GDALReader::read(PointViewPtr view, point_count_t num) { point_count_t count = std::min(num, m_count - m_index); PointId nextId = view->size(); std::array<double, 2> coords; for (int row = 0; row < m_raster->m_raster_y_size; ++row) { for (int col = 0; col < m_raster->m_raster_x_size; ++col) { m_raster->pixelToCoord(col, row, coords); view->setField(Dimension::Id::X, nextId, coords[0]); view->setField(Dimension::Id::Y, nextId, coords[1]); nextId++; } } std::vector<uint8_t> band; std::vector<Dimension::Type> band_types = m_raster->getPDALDimensionTypes(); for (int b = 0; b < m_raster->m_band_count; ++b) { // Bands count from 1 m_raster->readBand(band, b + 1); std::stringstream oss; oss << "band-" << (b + 1); log()->get(LogLevel::Info) << "Read band '" << oss.str() << "'" << std::endl; Dimension::Id d = view->layout()->findDim(oss.str()); size_t dimSize = Dimension::size(band_types[b]); uint8_t* p = band.data(); for (point_count_t i = 0; i < count; ++i) { view->setField(d, band_types[b], i, p); p = p + dimSize; } } return view->size(); }
TEST(PtsReader, ReadPtsExtraDims) { PtsReader reader; Options options; options.add("filename", Support::datapath("pts/test.pts")); reader.setOptions(options); PointTable table; reader.prepare(table); PointViewSet viewSet = reader.execute(table); EXPECT_EQ(viewSet.size(), 1u); PointViewPtr view = *viewSet.begin(); EXPECT_EQ(view->size(), 19u); PointLayout *layout = view->layout(); EXPECT_FLOAT_EQ(view->getFieldAs<float>(Dimension::Id::X, 0), 3.9809721f); EXPECT_FLOAT_EQ(view->getFieldAs<float>(Dimension::Id::Y, 0), -2.006119f); EXPECT_FLOAT_EQ(view->getFieldAs<float>(Dimension::Id::Z, 0), -0.010086f); EXPECT_EQ(view->getFieldAs<int>(Dimension::Id::Red, 0), 97); EXPECT_EQ(view->getFieldAs<int>(Dimension::Id::Green, 0), 59); EXPECT_EQ(view->getFieldAs<int>(Dimension::Id::Blue, 0), 38); }
point_count_t GreyhoundReader::read(PointViewPtr view, point_count_t count) { const std::string url(m_params.root() + "read" + m_params.qs()); log()->get(LogLevel::Debug) << "Reading: " << url << std::endl; auto response(m_arbiter->getBinary(url)); const std::size_t pointSize(view->layout()->pointSize()); uint32_t numPoints(0); std::copy( response.data() + response.size() - sizeof(uint32_t), response.data() + response.size(), reinterpret_cast<char*>(&numPoints)); log()->get(LogLevel::Debug) << "Fetched " << numPoints << " points" << std::endl; log()->get(LogLevel::Debug) << "Fetched " << response.size() << " bytes" << std::endl; response.resize(response.size() - sizeof(uint32_t)); const auto dimTypes(m_readLayout.dimTypes()); #ifdef PDAL_HAVE_LAZPERF auto cb = [this, &view, &dimTypes](char *buf, size_t bufsize) { view->setPackedPoint(dimTypes, view->size(), buf); if (m_cb) m_cb(*view, view->size() - 1); }; LazPerfDecompressor(cb, dimTypes, numPoints). decompress(response.data(), response.size()); #else const char* end(response.data() + response.size()); for (const char* pos(response.data()); pos < end; pos += pointSize) { view->setPackedPoint(dimTypes, view->size(), pos); if (m_cb) m_cb(*view, view->size() - 1); } #endif if (!m_params.obounds().isNull()) { greyhound::Bounds obounds(m_params.obounds()); greyhound::Point p; for (std::size_t i(0); i < view->size(); ++i) { p.x = view->getFieldAs<double>(Dimension::Id::X, i); p.y = view->getFieldAs<double>(Dimension::Id::Y, i); p.z = view->getFieldAs<double>(Dimension::Id::Z, i); if (!obounds.contains(p)) view->setField(Dimension::Id::Omit, i, 1); } } for (std::size_t i(0); i < view->size(); ++i) { view->setField(Dimension::Id::PointId, i, i); } return numPoints; }