<div dir="ltr"><div dir="ltr"><br></div><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Sep 10, 2020 at 9:43 AM Peder Axensten <<a href="mailto:Peder.Axensten@slu.se" target="_blank">Peder.Axensten@slu.se</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I want to implement a writer that takes a point cloud file and rasterises it (percentiles and other statistics):<br>
class Raster_metrics : public pdal::Writer;<br>
<br>
My understanding from the documentation is that I should setup things in<br>
void Raster_metrics::ready( pdal::PointTableRef table );<br>
Correct?<br>
To do that I need to access the header data of the input file, specifically its bounding box.<br></blockquote><div><br></div><div>PDAL typically works on PointView objects rather than PointTable objects. Normally one would calculate the bounds based on PointView in either filter() or run(). Search for calculateBounds(). It would not be unreasonable to create a separate raster for each input PointView.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
How do I get the input file’s bounding box from table?<br></blockquote><div><br></div><div>You don't.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
And other file metadata?<br></blockquote><div><br></div><div>Metadata is generally stored with each stage. If you want the metadata that was read, you have to walk stages back until you find the one you're looking for, call getMetadata(), and then extract any information you're looking for. We don't usually use file metadata during processing, with the exception of spatial reference, which is stored separately. We don't use metadata-provided bounding boxes because 1) they have been known to be wrong 2) PDAL may aggregate and drop points in between the time that data is read and the time that a filter is run.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Further I should process the actual points in<br>
void Raster_metrics::write( pdal::PointViewPtr view ) — for chunks of points.<br>
Correct?<br>
I want to be able to process points also in a serialised manner – in what member function should I do that?<br></blockquote><div><br></div><div>I don't know what you mean. You can simply loop through all the points in the view and process them one at a time. If you don't need all the points prior to beginning processing, you can implement a stream mode filter by inheriting from Streamable and implement processOne().  That said, if you need bounds, you need all the points, which means that your filter won't work in stream mode.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">And finally I should calculate the statistics and output the these as rasters [using gdal] in<br>
void Raster_metrics::done( pdal::PointTableRef table )<br>
Correct?<br></blockquote><div><br></div><div>This is up to you. Using the new functionality in 2.2, you can call view.createRaster(). It will return a raster to which you can write data. I would do this in filter() or run().</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I’ve been reading through the documentation on <a href="http://pdal.io" rel="noreferrer" target="_blank">pdal.io</a>, but I find it a bit scant – is there more detailed documentation somewhere?<br>
(I.e. <a href="https://pdal.io/api/cpp/metadata.html" rel="noreferrer" target="_blank">https://pdal.io/api/cpp/metadata.html</a> is just a list of member functions.)<br></blockquote><div><br></div><div>What is available on the PDAL website is what exists. We don't have much documentation of individual functions. Sorry. Please make use of the existing code and tests.  Feel free to write with specific questions.</div><div><br></div></div>-- <br><div dir="ltr">Andrew Bell<br><a href="mailto:andrew.bell.ia@gmail.com" target="_blank">andrew.bell.ia@gmail.com</a></div></div>