PointBufferSet Splitter::run(PointBufferPtr buf) { PointBufferSet pbSet; if (!buf->size()) return pbSet; CoordCompare compare; std::map<Coord, PointBufferPtr, CoordCompare> buffers(compare); // Use the location of the first point as the origin. double xOrigin = buf->getFieldAs<double>(Dimension::Id::X, 0); double yOrigin = buf->getFieldAs<double>(Dimension::Id::Y, 0); // Overlay a grid of squares on the points (m_length sides). Each square // corresponds to a new point buffer. Place the points falling in the // each square in the corresponding point buffer. for (PointId idx = 0; idx < buf->size(); idx++) { int xpos = (buf->getFieldAs<double>(Dimension::Id::X, idx) - xOrigin) / m_length; int ypos = (buf->getFieldAs<double>(Dimension::Id::Y, idx) - yOrigin) / m_length; Coord loc(xpos, ypos); PointBufferPtr& outbuf = buffers[loc]; if (!outbuf) outbuf = buf->makeNew(); outbuf->appendPoint(*buf, idx); } // Pull the buffers out of the map and stick them in the standard // output set, setting the bounds as we go. for (auto bi = buffers.begin(); bi != buffers.end(); ++bi) pbSet.insert(bi->second); return pbSet; }
virtual PointBufferSet run(PointBufferPtr buf) { PointBufferSet pbSet; m_buf->append(*buf); pbSet.insert(m_buf); return pbSet; }
PointBufferSet Crop::run(PointBufferPtr buffer) { PointBufferSet pbSet; PointBufferPtr output = buffer->makeNew(); crop(*buffer, *output); pbSet.insert(output); return pbSet; }