Is it possible the problem is the use of std:fixed ?  (Which is invoked if
the trim option = FALSE, which is the default).

Currently in WKTWriter.writeNumber there is this code (and the defaults
invoke fixed precision):

if(! trim) {
        ss << std::fixed;
    }
    ss << std::setprecision(decimalPlaces >= 0 ? decimalPlaces : 0) << d;

This results in the following (as noted on the GeoSwift issue)

POINT (-0.4225977 46.3406448). ==>. POINT (-0.4225977000000000
46.3406447999999997)

This carries too much precision, obviously.  I think it might be exposing
the IEEE-754 guard digits unnecessarily.  FP output is notoriously tricky,
and I suspect it's better to let C++ just do the right thing.

Also, running reducePrecision causes problems, again I suspect due to to
imprecise FP representation:

bin/geosop -a "Point (-0.4225977 46.3406448)" -f wkt reducePrecision 100
POINT (-0.4200000000000000 46.3400000000000034)

If the std::fixed setting is dropped, the output looks more reasonable:

POINT (-0.4225977 46.3406448). ==>. POINT (-0.4225977234 46.3406448)

Check that all input sig digits are shown:

POINT (-0.4225977234 46.3406448) ==> POINT (-0.4225977234 46.3406448)

Reduced precision displays as expected:
bin/geosop -a "Point (-0.4225977 46.3406448)" -f wkt reducePrecision 100
POINT (-0.42 46.34)


Is the "trim" option needed at all?

On Tue, Jan 5, 2021 at 3:41 PM Paul Ramsey <pram...@cleverelephant.ca>
wrote:

>
> What do people think is the best practice for outputing WKT precision?
>
_______________________________________________
geos-devel mailing list
geos-devel@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/geos-devel

Reply via email to