[SCM] PostGIS branch stable-3.5 updated. 3.5.3-54-g6085536df
git at osgeo.org
git at osgeo.org
Tue Sep 23 09:13:53 PDT 2025
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "PostGIS".
The branch, stable-3.5 has been updated
via 6085536df194f697887048f3c5d80e2b57107c8f (commit)
via b63b9de1a26a284683a33096eaf8b5954ddee147 (commit)
from c10696a2f5b28e5eee6c1ebe9b84335c54c19137 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 6085536df194f697887048f3c5d80e2b57107c8f
Author: Paul Ramsey <pramsey at cleverelephant.ca>
Date: Tue Sep 23 09:13:47 2025 -0700
News for #5991
diff --git a/NEWS b/NEWS
index 79718d1c4..683887ff9 100644
--- a/NEWS
+++ b/NEWS
@@ -29,6 +29,7 @@ PostgreSQL 12-18 required. GEOS 3.8+ required. Proj 6.1+ required.
- #5407, Use memset in place of bzero (Paul Ramsey)
- #5082, LRS proportions clamped to [0,1] (Pawel Ostrowski)
- #5985, Fix configure issue with Debian 12 and 13 (Regina Obe, Sandro Santilli)
+- #5991, CircularString distance error (Paul Ramsey)
PostGIS 3.5.3
commit b63b9de1a26a284683a33096eaf8b5954ddee147
Author: Paul Ramsey <pramsey at cleverelephant.ca>
Date: Tue Sep 23 09:09:52 2025 -0700
Ensure DISTPTS gets updated correctly in arc distance cases, references #5991
diff --git a/liblwgeom/measures.c b/liblwgeom/measures.c
index 2a1f73ec3..1f88b244d 100644
--- a/liblwgeom/measures.c
+++ b/liblwgeom/measures.c
@@ -77,6 +77,18 @@ lw_dist2d_distpts_init(DISTPTS *dl, int mode)
dl->distance = -1 * FLT_MAX;
}
+static void
+lw_dist2d_distpts_set(DISTPTS *dl, double distance, const POINT2D *p1, const POINT2D *p2)
+{
+ int update = (dl->mode == DIST_MIN) ? (distance < dl->distance) : (distance > dl->distance);
+ if (update)
+ {
+ dl->distance = distance;
+ dl->p1 = *p1;
+ dl->p2 = *p2;
+ }
+}
+
/**
Function initializing shortestline and longestline calculations.
*/
@@ -620,9 +632,7 @@ lw_dist2d_point_tri(LWPOINT *point, LWTRIANGLE *tri, DISTPTS *dl)
/* Is point inside triangle? */
if (dl->mode == DIST_MIN && ptarray_contains_point(tri->points, pt) != LW_OUTSIDE)
{
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = pt->x;
- dl->p1.y = dl->p2.y = pt->y;
+ lw_dist2d_distpts_set(dl, 0.0, pt, pt);
return LW_TRUE;
}
@@ -666,9 +676,7 @@ lw_dist2d_point_poly(LWPOINT *point, LWPOLY *poly, DISTPTS *dl)
return lw_dist2d_pt_ptarray(p, poly->rings[i], dl);
/* Is inside the polygon */
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = p->x;
- dl->p1.y = dl->p2.y = p->y;
+ lw_dist2d_distpts_set(dl, 0.0, p, p);
return LW_TRUE;
}
@@ -693,9 +701,7 @@ lw_dist2d_point_curvepoly(LWPOINT *point, LWCURVEPOLY *poly, DISTPTS *dl)
return lw_dist2d_recursive((LWGEOM *)point, poly->rings[i], dl);
/* Is inside the polygon */
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = p->x;
- dl->p1.y = dl->p2.y = p->y;
+ lw_dist2d_distpts_set(dl, 0.0, p, p);
return LW_TRUE;
}
@@ -714,9 +720,7 @@ lw_dist2d_line_tri(LWLINE *line, LWTRIANGLE *tri, DISTPTS *dl)
/* Is there a point inside triangle? */
if (dl->mode == DIST_MIN && ptarray_contains_point(tri->points, pt) != LW_OUTSIDE)
{
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = pt->x;
- dl->p1.y = dl->p2.y = pt->y;
+ lw_dist2d_distpts_set(dl, 0.0, pt, pt);
return LW_TRUE;
}
@@ -768,9 +772,7 @@ lw_dist2d_line_poly(LWLINE *line, LWPOLY *poly, DISTPTS *dl)
/* Not in hole, so inside polygon */
if (dl->mode == DIST_MIN)
{
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = pt->x;
- dl->p1.y = dl->p2.y = pt->y;
+ lw_dist2d_distpts_set(dl, 0.0, pt, pt);
}
return LW_TRUE;
}
@@ -802,9 +804,7 @@ lw_dist2d_line_curvepoly(LWLINE *line, LWCURVEPOLY *poly, DISTPTS *dl)
/* Not in hole, so inside polygon */
if (dl->mode == DIST_MIN)
{
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = pt->x;
- dl->p1.y = dl->p2.y = pt->y;
+ lw_dist2d_distpts_set(dl, 0.0, pt, pt);
}
return LW_TRUE;
}
@@ -817,18 +817,14 @@ lw_dist2d_tri_tri(LWTRIANGLE *tri1, LWTRIANGLE *tri2, DISTPTS *dl)
const POINT2D *pt = getPoint2d_cp(pa2, 0);
if (dl->mode == DIST_MIN && ptarray_contains_point(pa1, pt) != LW_OUTSIDE)
{
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = pt->x;
- dl->p1.y = dl->p2.y = pt->y;
+ lw_dist2d_distpts_set(dl, 0.0, pt, pt);
return LW_TRUE;
}
pt = getPoint2d_cp(pa1, 0);
if (dl->mode == DIST_MIN && ptarray_contains_point(pa2, pt) != LW_OUTSIDE)
{
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = pt->x;
- dl->p1.y = dl->p2.y = pt->y;
+ lw_dist2d_distpts_set(dl, 0.0, pt, pt);
return LW_TRUE;
}
@@ -859,9 +855,7 @@ lw_dist2d_tri_poly(LWTRIANGLE *tri, LWPOLY *poly, DISTPTS *dl)
const POINT2D *pt2 = getPoint2d_cp(poly->rings[0], 0);
if (ptarray_contains_point(pa, pt2) != LW_OUTSIDE)
{
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = pt2->x;
- dl->p1.y = dl->p2.y = pt2->y;
+ lw_dist2d_distpts_set(dl, 0.0, pt2, pt2);
return LW_TRUE;
}
}
@@ -882,9 +876,7 @@ lw_dist2d_tri_poly(LWTRIANGLE *tri, LWPOLY *poly, DISTPTS *dl)
return LW_TRUE;
/* Not in hole, so inside polygon */
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = pt->x;
- dl->p1.y = dl->p2.y = pt->y;
+ lw_dist2d_distpts_set(dl, 0.0, pt, pt);
return LW_TRUE;
}
static const POINT2D *
@@ -925,9 +917,7 @@ lw_dist2d_tri_curvepoly(LWTRIANGLE *tri, LWCURVEPOLY *poly, DISTPTS *dl)
/* Maybe poly is inside triangle? */
if (lwgeom_contains_point((LWGEOM *)tri, lw_curvering_getfirstpoint2d_cp(poly->rings[0])) != LW_OUTSIDE)
{
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = pt->x;
- dl->p1.y = dl->p2.y = pt->y;
+ lw_dist2d_distpts_set(dl, 0.0, pt, pt);
return LW_TRUE;
}
}
@@ -948,9 +938,7 @@ lw_dist2d_tri_curvepoly(LWTRIANGLE *tri, LWCURVEPOLY *poly, DISTPTS *dl)
return LW_TRUE;
/* Not in hole, so inside polygon */
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = pt->x;
- dl->p1.y = dl->p2.y = pt->y;
+ lw_dist2d_distpts_set(dl, 0.0, pt, pt);
return LW_TRUE;
}
@@ -960,9 +948,7 @@ lw_dist2d_tri_circstring(LWTRIANGLE *tri, LWCIRCSTRING *line, DISTPTS *dl)
const POINT2D *pt = lw_curvering_getfirstpoint2d_cp((LWGEOM *)line);
if (ptarray_contains_point(tri->points, pt) != LW_OUTSIDE && dl->mode == DIST_MIN)
{
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = pt->x;
- dl->p1.y = dl->p2.y = pt->y;
+ lw_dist2d_distpts_set(dl, 0.0, pt, pt);
return LW_TRUE;
}
@@ -1019,18 +1005,14 @@ lw_dist2d_poly_poly(LWPOLY *poly1, LWPOLY *poly2, DISTPTS *dl)
pt = getPoint2d_cp(poly1->rings[0], 0);
if (ptarray_contains_point(poly2->rings[0], pt) != LW_OUTSIDE)
{
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = pt->x;
- dl->p1.y = dl->p2.y = pt->y;
+ lw_dist2d_distpts_set(dl, 0.0, pt, pt);
return LW_TRUE;
}
pt = getPoint2d_cp(poly2->rings[0], 0);
if (ptarray_contains_point(poly1->rings[0], pt) != LW_OUTSIDE)
{
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = pt->x;
- dl->p1.y = dl->p2.y = pt->y;
+ lw_dist2d_distpts_set(dl, 0.0, pt, pt);
return LW_TRUE;
}
@@ -1107,18 +1089,14 @@ lw_dist2d_curvepoly_curvepoly(LWCURVEPOLY *poly1, LWCURVEPOLY *poly2, DISTPTS *d
pt = lw_curvering_getfirstpoint2d_cp(poly1->rings[0]);
if (lwgeom_contains_point(poly2->rings[0], pt) != LW_OUTSIDE)
{
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = pt->x;
- dl->p1.y = dl->p2.y = pt->y;
+ lw_dist2d_distpts_set(dl, 0.0, pt, pt);
return LW_TRUE;
}
pt = lw_curvering_getfirstpoint2d_cp(poly2->rings[0]);
if (lwgeom_contains_point(poly1->rings[0], pt) != LW_OUTSIDE)
{
- dl->distance = 0.0;
- dl->p1.x = dl->p2.x = pt->x;
- dl->p1.y = dl->p2.y = pt->y;
+ lw_dist2d_distpts_set(dl, 0.0, pt, pt);
return LW_TRUE;
}
@@ -1432,9 +1410,7 @@ lw_dist2d_seg_arc(const POINT2D *A1,
if (pt_in_arc && pt_in_seg)
{
- dl->distance = 0.0;
- dl->p1 = E;
- dl->p2 = E;
+ lw_dist2d_distpts_set(dl, 0.0, &E, &E);
return LW_TRUE;
}
@@ -1444,9 +1420,7 @@ lw_dist2d_seg_arc(const POINT2D *A1,
if (pt_in_arc && pt_in_seg)
{
- dl->distance = 0.0;
- dl->p1 = F;
- dl->p2 = F;
+ lw_dist2d_distpts_set(dl, 0.0, &F, &F);
return LW_TRUE;
}
}
@@ -1463,9 +1437,7 @@ lw_dist2d_seg_arc(const POINT2D *A1,
/* Is D contained in both A and B? */
if (pt_in_arc && pt_in_seg)
{
- dl->distance = 0.0;
- dl->p1 = D;
- dl->p2 = D;
+ lw_dist2d_distpts_set(dl, 0.0, &D, &D);
return LW_TRUE;
}
}
@@ -1546,9 +1518,7 @@ lw_dist2d_pt_arc(const POINT2D *P, const POINT2D *A1, const POINT2D *A2, const P
/* P is the center of the circle */
if (FP_EQUALS(d, 0.0))
{
- dl->distance = radius_A;
- dl->p1 = *A1;
- dl->p2 = *P;
+ lw_dist2d_distpts_set(dl, radius_A, A1, P);
return LW_TRUE;
}
@@ -1667,9 +1637,7 @@ lw_dist2d_arc_arc(const POINT2D *A1,
/* Arcs do touch at D, return it */
if (pt_in_arc_A && pt_in_arc_B)
{
- dl->distance = 0.0;
- dl->p1 = D;
- dl->p2 = D;
+ lw_dist2d_distpts_set(dl, 0.0, &D, &D);
return LW_TRUE;
}
}
@@ -1721,8 +1689,7 @@ lw_dist2d_arc_arc(const POINT2D *A1,
if (pt_in_arc_A && pt_in_arc_B)
{
- dl->p1 = dl->p2 = E;
- dl->distance = 0.0;
+ lw_dist2d_distpts_set(dl, 0.0, &E, &E);
return LW_TRUE;
}
@@ -1736,8 +1703,7 @@ lw_dist2d_arc_arc(const POINT2D *A1,
if (pt_in_arc_A && pt_in_arc_B)
{
- dl->p1 = dl->p2 = F;
- dl->distance = 0.0;
+ lw_dist2d_distpts_set(dl, 0.0, &F, &F);
return LW_TRUE;
}
}
@@ -1800,32 +1766,24 @@ lw_dist2d_arc_arc_concentric(const POINT2D *A1,
seg_size = lw_segment_side(A1, A3, A2);
if (seg_size == lw_segment_side(A1, A3, B1))
{
- dl->p1 = *B1;
- dl->p2 = *B1;
- dl->distance = 0;
+ lw_dist2d_distpts_set(dl, 0.0, B1, B1);
return LW_TRUE;
}
if (seg_size == lw_segment_side(A1, A3, B3))
{
- dl->p1 = *B3;
- dl->p2 = *B3;
- dl->distance = 0;
+ lw_dist2d_distpts_set(dl, 0.0, B3, B3);
return LW_TRUE;
}
/* Check if A1 or A3 are in the same side as B2 in the B1-B3 arc */
seg_size = lw_segment_side(B1, B3, B2);
if (seg_size == lw_segment_side(B1, B3, A1))
{
- dl->p1 = *A1;
- dl->p2 = *A1;
- dl->distance = 0;
+ lw_dist2d_distpts_set(dl, 0.0, A1, A1);
return LW_TRUE;
}
if (seg_size == lw_segment_side(B1, B3, A3))
{
- dl->p1 = *A3;
- dl->p2 = *A3;
- dl->distance = 0;
+ lw_dist2d_distpts_set(dl, 0.0, A3, A3);
return LW_TRUE;
}
}
@@ -1840,9 +1798,7 @@ lw_dist2d_arc_arc_concentric(const POINT2D *A1,
if (seg_size == lw_segment_side(A1, A3, &proj))
{
- dl->p1 = proj;
- dl->p2 = *B1;
- dl->distance = fabs(radius_A - radius_B);
+ lw_dist2d_distpts_set(dl, fabs(radius_A - radius_B), &proj, B1);
return LW_TRUE;
}
/* B3 */
@@ -1850,9 +1806,7 @@ lw_dist2d_arc_arc_concentric(const POINT2D *A1,
proj.y = CENTER->y + (B3->y - CENTER->y) * radius_A / radius_B;
if (seg_size == lw_segment_side(A1, A3, &proj))
{
- dl->p1 = proj;
- dl->p2 = *B3;
- dl->distance = fabs(radius_A - radius_B);
+ lw_dist2d_distpts_set(dl, fabs(radius_A - radius_B), &proj, B3);
return LW_TRUE;
}
@@ -1864,9 +1818,7 @@ lw_dist2d_arc_arc_concentric(const POINT2D *A1,
proj.y = CENTER->y + (A1->y - CENTER->y) * radius_B / radius_A;
if (seg_size == lw_segment_side(B1, B3, &proj))
{
- dl->p1 = proj;
- dl->p2 = *A1;
- dl->distance = fabs(radius_A - radius_B);
+ lw_dist2d_distpts_set(dl, fabs(radius_A - radius_B), &proj, A1);
return LW_TRUE;
}
@@ -1875,9 +1827,7 @@ lw_dist2d_arc_arc_concentric(const POINT2D *A1,
proj.y = CENTER->y + (A3->y - CENTER->y) * radius_B / radius_A;
if (seg_size == lw_segment_side(B1, B3, &proj))
{
- dl->p1 = proj;
- dl->p2 = *A3;
- dl->distance = fabs(radius_A - radius_B);
+ lw_dist2d_distpts_set(dl, fabs(radius_A - radius_B), &proj, A3);
return LW_TRUE;
}
}
@@ -1911,10 +1861,7 @@ lw_dist2d_arc_arc_concentric(const POINT2D *A1,
P2 = B3;
}
- dl->p1 = *P1;
- dl->p2 = *P2;
- dl->distance = sqrt(shortest_sqr);
-
+ lw_dist2d_distpts_set(dl, sqrt(shortest_sqr), P1, P2);
return LW_TRUE;
}
@@ -2019,9 +1966,7 @@ lw_dist2d_seg_seg(const POINT2D *A, const POINT2D *B, const POINT2D *C, const PO
theP.x = A->x + r * (B->x - A->x);
theP.y = A->y + r * (B->y - A->y);
}
- dl->distance = 0.0;
- dl->p1 = theP;
- dl->p2 = theP;
+ lw_dist2d_distpts_set(dl, 0, &theP, &theP);
}
return LW_TRUE;
}
@@ -2365,9 +2310,7 @@ lw_dist2d_pt_seg(const POINT2D *p, const POINT2D *A, const POINT2D *B, DISTPTS *
/*If the point p is on the segment this is a more robust way to find out that*/
if ((((A->y - p->y) * (B->x - A->x) == (A->x - p->x) * (B->y - A->y))) && (dl->mode == DIST_MIN))
{
- dl->distance = 0.0;
- dl->p1 = *p;
- dl->p2 = *p;
+ lw_dist2d_distpts_set(dl, 0, p, p);
}
-----------------------------------------------------------------------
Summary of changes:
NEWS | 1 +
liblwgeom/measures.c | 151 ++++++++++++++++-----------------------------------
2 files changed, 48 insertions(+), 104 deletions(-)
hooks/post-receive
--
PostGIS
More information about the postgis-tickets
mailing list