]> granicus.if.org Git - postgis/commitdiff
#3670, Tolerance silently ignored in ST_RemoveRepeatedPoint for multipoint
authorPaul Ramsey <pramsey@cleverelephant.ca>
Wed, 6 Sep 2017 16:20:19 +0000 (16:20 +0000)
committerPaul Ramsey <pramsey@cleverelephant.ca>
Wed, 6 Sep 2017 16:20:19 +0000 (16:20 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@15637 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/lwmpoint.c
regress/remove_repeated_points.sql
regress/remove_repeated_points_expected

index 5e6887564569825255e324b503c1cf99dedb60eb..db1a43ef5aac7f2447d31bab3d8c66a789149642 100644 (file)
@@ -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; i<mpoint->ngeoms; ++i)
        {
+               lwpt1 = (LWGEOM*)mpoint->geoms[i];
                /* Brute force, may be optimized by building an index */
                int seen=0;
                for (j=0; j<nnewgeoms; ++j)
                {
-                       if ( lwpoint_same((LWPOINT*)newgeoms[j],
-                                         (LWPOINT*)mpoint->geoms[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);
 
 }
index 642440bf937e3060d006ca24f296d748d6b0befe..e8bf3ba8b0f44b8f9a496a930163ce009aefa859 100644 (file)
@@ -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));
+
+
index 38214fc58b7f84a8a4d1614f4761fc12eab61bf0..e15d235b5983421430273620ed591c47a3c94d9e 100644 (file)
@@ -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)