From 808f035e5ca1e87ae439599500dcb7382b8eaea7 Mon Sep 17 00:00:00 2001 From: Paul Ramsey Date: Wed, 6 Sep 2017 16:20:19 +0000 Subject: [PATCH] #3670, Tolerance silently ignored in ST_RemoveRepeatedPoint for multipoint git-svn-id: http://svn.osgeo.org/postgis/trunk@15637 b70326c6-7e19-0410-871a-916f4a2858ee --- liblwgeom/lwmpoint.c | 13 ++++++++----- regress/remove_repeated_points.sql | 6 ++++++ regress/remove_repeated_points_expected | 3 +++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/liblwgeom/lwmpoint.c b/liblwgeom/lwmpoint.c index 5e6887564..db1a43ef5 100644 --- a/liblwgeom/lwmpoint.c +++ b/liblwgeom/lwmpoint.c @@ -94,28 +94,31 @@ lwmpoint_remove_repeated_points(const LWMPOINT *mpoint, double tolerance) uint32_t nnewgeoms; uint32_t i, j; LWGEOM **newgeoms; - + LWGEOM *lwpt1, *lwpt2; + newgeoms = lwalloc(sizeof(LWGEOM *)*mpoint->ngeoms); nnewgeoms = 0; for (i=0; ingeoms; ++i) { + lwpt1 = (LWGEOM*)mpoint->geoms[i]; /* Brute force, may be optimized by building an index */ int seen=0; for (j=0; jgeoms[i]) ) + lwpt2 = (LWGEOM*)newgeoms[j]; + if ( lwgeom_mindistance2d(lwpt1, lwpt2) <= tolerance ) { seen=1; break; } } if ( seen ) continue; - newgeoms[nnewgeoms++] = (LWGEOM*)lwpoint_clone(mpoint->geoms[i]); + newgeoms[nnewgeoms++] = lwgeom_clone_deep(lwpt1); } return (LWGEOM*)lwcollection_construct(mpoint->type, - mpoint->srid, mpoint->bbox ? gbox_copy(mpoint->bbox) : NULL, + mpoint->srid, + mpoint->bbox ? gbox_copy(mpoint->bbox) : NULL, nnewgeoms, newgeoms); } diff --git a/regress/remove_repeated_points.sql b/regress/remove_repeated_points.sql index 642440bf9..e8bf3ba8b 100644 --- a/regress/remove_repeated_points.sql +++ b/regress/remove_repeated_points.sql @@ -23,3 +23,9 @@ SELECT 12, ST_SRID(ST_RemoveRepeatedPoints('SRID=3;LINESTRING(0 0, 0 0, 0 0, 0 0 SELECT 13, ST_AsText(ST_RemoveRepeatedPoints('LINESTRING(0 0, 1 0, 2 0, 3 0, 4 0)',1.5)); SELECT 14, ST_AsText(ST_RemoveRepeatedPoints('LINESTRING(10 0,10 9,10 10)', 2)); +-- #3670 +SELECT 15, ST_AsText(ST_RemoveRepeatedPoints('MULTIPOINT(0 0, 0 0, 1 1, 2 2)'::geometry)); +SELECT 16, ST_AsText(ST_RemoveRepeatedPoints('MULTIPOINT(0 0, 0 0, 1 1, 2 2)'::geometry,0.1)); +SELECT 17, ST_AsText(ST_RemoveRepeatedPoints('MULTIPOINT(0 0, 0 0, 1 1, 4 4)'::geometry,2)); + + diff --git a/regress/remove_repeated_points_expected b/regress/remove_repeated_points_expected index 38214fc58..e15d235b5 100644 --- a/regress/remove_repeated_points_expected +++ b/regress/remove_repeated_points_expected @@ -13,3 +13,6 @@ 12|3 13|LINESTRING(0 0,2 0,4 0) 14|LINESTRING(10 0,10 10) +15|MULTIPOINT(0 0,1 1,2 2) +16|MULTIPOINT(0 0,1 1,2 2) +17|MULTIPOINT(0 0,4 4) -- 2.50.1