[postgis-tickets] r15966 - Fix rare missing boxes in geometry subdivision

Paul Ramsey pramsey at cleverelephant.ca
Wed Oct 11 07:06:07 PDT 2017


Author: pramsey
Date: 2017-10-11 07:06:07 -0700 (Wed, 11 Oct 2017)
New Revision: 15966

Modified:
   trunk/liblwgeom/lwgeom_geos.c
Log:
Fix rare missing boxes in geometry subdivision
Closes #3886


Modified: trunk/liblwgeom/lwgeom_geos.c
===================================================================
--- trunk/liblwgeom/lwgeom_geos.c	2017-10-11 14:05:25 UTC (rev 15965)
+++ trunk/liblwgeom/lwgeom_geos.c	2017-10-11 14:06:07 UTC (rev 15966)
@@ -262,19 +262,25 @@
 
 	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);



More information about the postgis-tickets mailing list