[Liblas-devel] Rounding problem with point coordinates?
Peder Axensten
Peder.Axensten at slu.se
Wed Oct 22 02:35:57 PDT 2014
Hi Howard and all,
I think I have spotted a small problem and I would really appreciate your opinion. I've built a set of tools that assumes that the las file header information is correct, e.g. points outside the header bounding box will crash the tool if I'm lucky or craete undetermined data if I'm not.
I noticed that there often are points outside the header's bounding box -- even in files produced by las2las. The points are not far outside, my guess is that the problem stems from rounding errors due to the coordinates' float->integer->float roundtrip. I attach a code snippet that solves the problem for me. If you are interested I can post the code for point_nudge_t too, but it is very straight-forward. (As you can see, I have wrappers around liblas::Reader and liblas::Writer. The reader wrapper is simple, but the writer wrapper handles two subtle problems writing points and also updates the header information automagically.)
Am I principally wrong to depend on the file header information?
Regards,
Peder
las_type::reader_type reader( source_ );
const auto header = get_header( reader );
const auto filter = my_filter();
// There is a rounding problem with the file's bounding box.
/* Even in files generated by liblas::las2las, some points might be slightly outside the file's
bounding box. This is probably due to rounding errors. The box's extent is based on point
coordinates *before* converting them to integers (in the las file they are stored as 32 bit
integers). When reading the same file, converting them back to floating point values will
more often than not result in coordinate values that might differ up to the value of the
scaling factor.
The point_nudge_t::outside function:
- A point inside the header's bounding box: only returns false.
- A point outside the bounding box: adds or subtracts the coordinates by the amount of the
scalu factor to move the point in the direction of the bounding box and returns true if
and only if it is still outside after moving it.
When writing the points to a new file, the original file's bounding box is used and points
that remained outside the box were removed. In this way the new file will have no points
outside the bounding box. Of course, the same problem would occur again [and again...]
if we updated the bounding box to the new set of points.
*/
const point_nudge_t nudger( header ); // From las-io-stuff.hpp
las_type::writer_type writer( dest_, header, false ); // Do not update the bounding box!
while( reader ) {
auto pt = *reader;
if( !nudger.outside( pt ) && !filter.remove( pt ) )
writer << pt;
}
Peder Axensten
Research engineer
Swedish University of Agricultural Sciences
Department of Forest Resource Management
Remote Sensing
SE-901 83 Umeå
Visiting address: Skogsmarksgränd
Phone: +46 90 786 85 00
peder.axensten at slu.se, www.slu.se/srh
The Department of Forest Resource Management is environmentally certified in accordance with ISO 14001.
More information about the Liblas-devel
mailing list