]> granicus.if.org Git - postgis/commitdiff
Fix rare missing boxes in geometry subdivision
authorPaul Ramsey <pramsey@cleverelephant.ca>
Wed, 11 Oct 2017 14:05:25 +0000 (14:05 +0000)
committerPaul Ramsey <pramsey@cleverelephant.ca>
Wed, 11 Oct 2017 14:05:25 +0000 (14:05 +0000)
References #3886

git-svn-id: http://svn.osgeo.org/postgis/branches/2.4@15965 b70326c6-7e19-0410-871a-916f4a2858ee

NEWS
liblwgeom/lwgeom_geos.c

diff --git a/NEWS b/NEWS
index f18bde957557bc10d36b220f3416d657ca57d414..ac4ca807fe2c060d320a9f8751662dc45d0abd33 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,7 @@ YYYY/MM/DD
   - #3882, undefined behaviour in zigzag with negative inputs
   - #3891, undefined behaviour in pointarray_to_encoded_polyline
   - #3895, throw error on malformed WKB input
+  - #3886, fix rare missing boxes in geometry subdivision
 
 
 PostGIS 2.4.0
index 14799810fbf6466ffebb0515fc41fad047ce523f..1d3ccf707324accf7202d430430a1a0fd900a0ac 100644 (file)
@@ -262,19 +262,25 @@ ptarray_to_GEOSLinearRing(const POINTARRAY *pa, int autofix)
 
        if ( autofix )
        {
-               /* check ring for being closed and fix if not */
-               if ( ! ptarray_is_closed_2d(pa) )
+               if (pa->npoints < 1)
                {
-                       npa = ptarray_addPoint(pa, getPoint_internal(pa, 0), FLAGS_NDIMS(pa->flags), pa->npoints);
-                       pa = npa;
+                       lwerror("ptarray_to_GEOSLinearRing called with autofix and 0 vertices in ring, cannot fix");
                }
-               /* TODO: check ring for having at least 4 vertices */
-#if 0
+
+               /*
+               * Check ring for being closed and fix if not.
+               * Also create a copy of geometry to operate on.
+               */
+               if ( ! ptarray_is_closed_2d(pa) || pa->npoints < 4 )
+               {
+                       pa = ptarray_addPoint(pa, getPoint_internal(pa, 0), FLAGS_NDIMS(pa->flags), pa->npoints);
+                       npa = pa;
+               }
+               /* Check ring for having at least 4 vertices */
                while ( pa->npoints < 4 )
                {
-                       npa = ptarray_addPoint(npa, getPoint_internal(pa, 0), FLAGS_NDIMS(pa->flags), pa->npoints);
+                       ptarray_append_point(pa, getPoint_internal(pa, 0), LW_TRUE);
                }
-#endif
        }
 
        sq = ptarray_to_GEOSCoordSeq(pa);