[postgis-tickets] r16499 - ST_CPAWithin precision fix

Darafei komzpa at gmail.com
Tue Mar 27 10:31:51 PDT 2018


Author: komzpa
Date: 2018-03-27 10:31:51 -0700 (Tue, 27 Mar 2018)
New Revision: 16499

Modified:
   trunk/NEWS
   trunk/liblwgeom/lwlinearreferencing.c
Log:
ST_CPAWithin precision fix

Closes #4032
Closes https://github.com/postgis/postgis/pull/234
References #4025



Modified: trunk/NEWS
===================================================================
--- trunk/NEWS	2018-03-25 03:33:58 UTC (rev 16498)
+++ trunk/NEWS	2018-03-27 17:31:51 UTC (rev 16499)
@@ -53,7 +53,10 @@
   - #4038, ST_Subdivide now selects pivot for geometry split that reuses input
            vertices. ST_ClipByBox2D is stubbed with ST_Intersection because of
            robustness issues. (Darafei Praliaskouski)
+  - #4025, #4032 Fixed precision issue in ST_ClosestPointOfApproach, 
+           ST_DistanceCPA, and ST_CPAWithin (Paul Ramsey, Darafei Praliaskouski)
 
+
 PostGIS 2.4.0
 2017/09/30
 

Modified: trunk/liblwgeom/lwlinearreferencing.c
===================================================================
--- trunk/liblwgeom/lwlinearreferencing.c	2018-03-25 03:33:58 UTC (rev 16498)
+++ trunk/liblwgeom/lwlinearreferencing.c	2018-03-27 17:31:51 UTC (rev 16499)
@@ -23,7 +23,6 @@
  *
  **********************************************************************/
 
-
 #include "liblwgeom_internal.h"
 #include "lwgeom_log.h"
 #include "measures3d.h"
@@ -1245,7 +1244,7 @@
 {
 	LWLINE *l1, *l2;
 	int i;
-	const GBOX *gbox1, *gbox2;
+	GBOX gbox1, gbox2;
 	double tmin, tmax;
 	double *mvals;
 	int nmvals = 0;
@@ -1274,20 +1273,19 @@
 		return LW_FALSE;
 	}
 
-	/* WARNING: these ranges may be wider than real ones */
-	gbox1 = lwgeom_get_bbox(g1);
-	gbox2 = lwgeom_get_bbox(g2);
+	/* We use lwgeom_calculate_gbox() instead of lwgeom_get_gbox() */
+ 	/* because we cannot afford the float rounding inaccuracy when */
+ 	/* we compare the ranges for overlap below */
+ 	lwgeom_calculate_gbox(g1, &gbox1);
+ 	lwgeom_calculate_gbox(g2, &gbox2);
 
-	assert(gbox1); /* or the npoints check above would have failed */
-	assert(gbox2); /* or the npoints check above would have failed */
-
 	/*
 	 * Find overlapping M range
 	 * WARNING: may be larger than the real one
 	 */
 
-	tmin = FP_MAX(gbox1->mmin, gbox2->mmin);
-	tmax = FP_MIN(gbox1->mmax, gbox2->mmax);
+	tmin = FP_MAX(gbox1.mmin, gbox2.mmin);
+	tmax = FP_MIN(gbox1.mmax, gbox2.mmax);
 
 	if ( tmax < tmin )
 	{
@@ -1295,8 +1293,6 @@
 		return LW_FALSE;
 	}
 
-	// lwnotice("Min:%g, Max:%g", tmin, tmax);
-
 	/*
 	 * Collect M values in common time range from inputs
 	 */



More information about the postgis-tickets mailing list