[postgis-tickets] r16420 - Use more precise bounds when testing overlap of temporal ranges.

Paul Ramsey pramsey at cleverelephant.ca
Mon Feb 26 10:25:45 PST 2018


Author: pramsey
Date: 2018-02-26 10:25:45 -0800 (Mon, 26 Feb 2018)
New Revision: 16420

Modified:
   branches/2.4/NEWS
   branches/2.4/liblwgeom/lwlinearreferencing.c
Log:
Use more precise bounds when testing overlap of temporal ranges.
For 2.4, references #4025



Modified: branches/2.4/NEWS
===================================================================
--- branches/2.4/NEWS	2018-02-26 18:19:42 UTC (rev 16419)
+++ branches/2.4/NEWS	2018-02-26 18:25:45 UTC (rev 16420)
@@ -9,6 +9,7 @@
            PolyhedralSurface (Matthias Bay)
   - #3942, geojson: Do not include private header for json-c >= 0.13
            (Björn Esser)
+  - #4025, Incorrect answers for temporally "amost overlapping" ranges
 
  * Enhancements *
     - #3992, Use PKG_PROG_PKG_CONFIG macro from pkg.m4 to detect pkg-config

Modified: branches/2.4/liblwgeom/lwlinearreferencing.c
===================================================================
--- branches/2.4/liblwgeom/lwlinearreferencing.c	2018-02-26 18:19:42 UTC (rev 16419)
+++ branches/2.4/liblwgeom/lwlinearreferencing.c	2018-02-26 18:25:45 UTC (rev 16420)
@@ -1073,7 +1073,7 @@
 {
 	LWLINE *l1, *l2;
 	int i;
-	const GBOX *gbox1, *gbox2;
+	GBOX gbox1, gbox2;
 	double tmin, tmax;
 	double *mvals;
 	int nmvals = 0;
@@ -1101,20 +1101,19 @@
 		return -1;
 	}
 
-	/* 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 )
 	{



More information about the postgis-tickets mailing list