[geos-devel] [GEOS] #609: GEOSPointOnSurface returns EMPTY for single-point linestring

Sandro Santilli strk at keybit.net
Mon Jan 14 03:32:48 PST 2013


For the record, the SafeBisectorFinder was recently also improved with 
changeset r717:

Date:   Wed Dec 19 20:02:16 2012 +0000

    Fixed Geometry.interiorPoint() to compute a true interior point in certain cases

But that changeset also came with no testcase

--strk;

On Mon, Jan 14, 2013 at 12:29:42PM +0100, Sandro Santilli wrote:
> Thank you Martin, I've started the port.
> 
> One question: while porting InteriorPointArea I realized that GEOS
> and JTS are not in sync with reguard to the horizontalBisector method,
> but even if I copied the InteriorPointTest.xml test from JTS there are
> no failure in GEOS. Does it mean there are no test in JTS showing the
> need for using the private SafeBisectorFinder class (which is only
> in JTS) ? Can you think of any case that would fail with the old 
> (as in GEOS) implementation of that ?
> 
> --strk;
> 
> On Fri, Jan 11, 2013 at 04:39:58PM -0800, Martin Davis wrote:
> > Fixes to JTS Centroid and InteriorPoint have been committed to SVN
> > (along with appropriate unit tests)
> > 
> > On 1/11/2013 9:45 AM, Martin Davis wrote:
> > >I just realized some corner cases, which require some
> > >clarification to deal with.
> > >
> > >One is geometries with multiple zero-length lines.  In this case I
> > >think the geometries should be treated as points, and the centroid
> > >and interior point computed accordingly.
> > >
> > >A similar situation exists for polygons with no area (which are
> > >invalid, but it's still nice to return a sensible answer).  A
> > >similar strategy should work - treat them as points.  Polygons
> > >with extent but no area (eg POLYGON ((200 200, 200 300, 200 200,
> > >200 200))) can be treated as if they are lines.
> > >
> > >In all cases, if geometry components of higher dimension are
> > >present, the lower-dimension geometries are ignored.
> > >
> > >This is going to require more significant change to handle - in
> > >particular, it points toward having single class for Centroid to
> > >handle all geometry types.
> > >
> > >On 1/11/2013 9:32 AM, Martin Davis wrote:
> > >>Just to clarify my original response, the primary constraint on
> > >>functions that return geometry values is that they return a
> > >>valid geometry that makes some sort of sense.
> > >>
> > >>So in the case of centroid, regardless of what is
> > >>"mathematically correct" a valid sensible geometry should be
> > >>returned (as opposed to a meaningless geometry with NaN
> > >>ordinates, as now happens).
> > >>
> > >>In the case of interiorPoint the situation is even more clearcut
> > >>- obviously the interior point should be one of the points in
> > >>the geometry.
> > >>
> > >>On 1/11/2013 6:01 AM, GEOS wrote:
> > >>>#609: GEOSPointOnSurface returns EMPTY for single-point linestring
> > >>>------------------------+---------------------------------------------------
> > >>>
> > >>>  Reporter:  strk        |       Owner:  geos-devel@…
> > >>>      Type:  defect      |      Status:  new
> > >>>  Priority:  major       |   Milestone:  3.3.7
> > >>>Component:  Default     |     Version:  3.3.6
> > >>>  Severity:  Unassigned  |    Keywords:
> > >>>------------------------+---------------------------------------------------
> > >>>
> > >>>
> > >>>Comment(by strk):
> > >>>
> > >>>  So for GEOSCentroid the answer is correct, in that by definition the
> > >>>  CentroidLine class computes the centroid of all segment's midpoint
> > >>>  weighted by segment length, so a zero-length segment is not
> > >>>considered.
> > >>>
> > >>>  Now, the algorithm of InteriorPointLine [1] is:
> > >>>
> > >>>     - Find an interior vertex which is closest to the centroid of the
> > >>>  linestring.
> > >>>     - If there is no interior vertex, find the endpoint which
> > >>>is closest to
> > >>>  the centroid.
> > >>>
> > >>>  [1]
> > >>>http://www.vividsolutions.com/jts/javadoc/com/vividsolutions/jts/algorithm/InteriorPointLine.html
> > >>>
> > >>>
> > >>>  But if there's no interior vertex both endpoints are
> > >>>equidistant to the
> > >>>  centroid, aren't them ?
> > >>>  Martin: am I missing anything ?


More information about the geos-devel mailing list