[geos-devel] Exposing PrecisionModel, GeometryPrecisionReducer in the C API

Sandro Santilli strk at keybit.net
Thu Oct 1 09:47:00 PDT 2015


Cleaned up proposal. No copying, using 0 for FLOATING and returning
previous precision.

  /**
   * Set the geometry's precision, optionally rounding all its
   * coordinates to the precision grid (if it changes).
   *
   * @param gridSize size of the precision grid, or 0 for FLOATING
   *                 precision.
   * @param forceSnap specifies whether snapping to the precision grid
   *                  should be forced: -1 prevents snapping, which can
   *                  be used when the input is known to be already
   *                  rounded to the target grid; 0 only snaps if the
   *                  new precision grid is not equal or compatible with
   *                  the new precision grid; 1 always snaps.
   * @retuns -1 on exception, previous size of precision grid otherwise.
   *
   */
  extern int GEOS_DLL *GEOSGeom_setPrecision_r(
                                         GEOSContextHandle_t handle,
                                         GEOSGeometry *g,
                                         double gridSize, int forceSnap);

I guess one might want a _getPrecision too...

--strk;


On Thu, Oct 01, 2015 at 06:42:32PM +0200, Sandro Santilli wrote:
> On Thu, Oct 01, 2015 at 06:14:10PM +0200, Sandro Mani wrote:
> > 
> > 
> > On 01.10.2015 18:08, Sandro Santilli wrote:
> > >On Thu, Oct 01, 2015 at 06:02:20PM +0200, Sandro Santilli wrote:
> > >>Sandro, others:
> > >>here's what I'm thinking to add as the single new signature
> > >>to the C-API for GEOS-3.6.0, what do you think ?
> > >>
> > >>  /*
> > >>   * Set the geometry's precision, optionally rounding all its
> > >>   * coordinates to the precision grid (if it changes).
> > >>   *
> > >>   * @param gridSize size of the precision grid, or -1 for FLOATING
> > >>   *                 precision.
> > >>   * @param forceSnap specifies whether snapping to the precision grid
> > >>   *                  should be forced: -1 prevents snapping, which can
> > >>   *                  be used when the input is known to be already
> > >>   *                  rounded to the target grid; 0 only snaps if the
> > >>   *                  new precision grid is not equal or compatible with
> > >>   *                  the new precision grid; 1 always snaps.
> > >>   *
> > >>   */
> > >>  extern GEOSGeometry GEOS_DLL *GEOSGeom_setPrecision_r(
> > >>                                        GEOSContextHandle_t handle,
> > >>                                        double gridSize, int forceSnap);
> > >>
> > >>Of course it can only work if the memory management for
> > >>GeometryFactory is automatic, as proposed in the PR
> > >>(which might be dangerous for any existing C++ client out there).
> > >Of course there must be a GEOSGeometry argument too:
> > >
> > >  GEOSGeometry *GEOSGeom_setPrecision_r(
> > >                                        GEOSContextHandle_t handle,
> > >                                        const GEOSGeometry *g,
> > >                                        double gridSize, int forceSnap);
> > >
> > >I'm not sure about returning a copy. One idea was, in the long run,
> > >to also make GEOSGeometry objects automatically managed as per memory
> > >lifetime, such thing would be easier by threating geometries as
> > >immutable objects (and this is also the policy used in JTS); but
> > >there's a known single function that is already not respecting that
> > >immutability, which is GEOSNormalize.
> >
> > As far as QGIS is concerned, it might also be an idea to just have a
> > function which sets the precision geos-context-wide:
> > 
> > void GEOS_setPrecision_r(GEOSContextHandle_t handle, double gridSize)
> > 
> > removing the need to do all the cloning of geometries just to reduce
> > the precision. After all, all QGIS geometry processing functions
> > would benefit from reduced precision computations.
> 
> Note that the _rounding_ of coordinates is expected to be performed
> outside of the processing functions, for them work correctly, so
> you'll need to perform this rounding/scaling step at some point
> anyway.
> 
> A generic GEOS_setPrecision sounds interesting, but then you'll need
> to go through each and every function returning a GEOSGeometry and
> specify what happens to it depending on the precision.
> 
> For example:
> 
>   - should GEOSGeom_clone assign the "context" precision
>     to the clone; should it scale/round ?
> 
>   - should GEOSProject use the input or the context precision
>     for the output ?
> 
>   - should GEOSIntersection use the context precision or one
>     of the input precision ?
> 
>   - should GEOSGeom_createLineString round the input
>     coordinates to the context precision ?
> 
> On the C++ side, it is the input that determines the output precision
> (smallest precision in case of multiple inputs) and rounding of input
> only happens with the WKTReader.
> 
> Note that a function capable of rounding would still be needed.
> 
> Surely allowing for in-place editing would help cases in which
> you just want to round w/out changing the reference precision:
> 
>  GEOSGeom_setPrecision_r(g, 2, 0);   // snap to grid of size 2
>  GEOSGeom_setPrecision_r(g, -1, -1); // set precision to floating
> 
> --strk; 
> 
>   ()   Free GIS & Flash consultant/developer
>   /\   http://strk.keybit.net/services.html


More information about the geos-devel mailing list