]> granicus.if.org Git - postgis/commitdiff
Skip collapsed edges after snapping (#1650)
authorSandro Santilli <strk@keybit.net>
Tue, 6 Mar 2012 13:21:01 +0000 (13:21 +0000)
committerSandro Santilli <strk@keybit.net>
Tue, 6 Mar 2012 13:21:01 +0000 (13:21 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@9407 b70326c6-7e19-0410-871a-916f4a2858ee

topology/sql/populate.sql.in.c
topology/test/regress/topogeo_addlinestring.sql
topology/test/regress/topogeo_addlinestring_expected

index eba03d0f62881a4894ec6165f05b37f479e7aff8..9c4206d5065760288b802d77ebd9ea1d74cdbfdd 100644 (file)
@@ -925,6 +925,18 @@ BEGIN
 #ifdef POSTGIS_TOPOLOGY_DEBUG
     RAISE DEBUG 'Snapped edge: %', ST_AsText(snapped);
 #endif
+    snapped := ST_CollectionExtract(ST_MakeValid(snapped), 2);
+#ifdef POSTGIS_TOPOLOGY_DEBUG
+    RAISE DEBUG 'Cleaned edge: %', ST_AsText(snapped);
+#endif
+
+    -- Check if the so-snapped edge collapsed (see #1650)
+    IF ST_IsEmpty(snapped) THEN
+#ifdef POSTGIS_TOPOLOGY_DEBUG
+      RAISE DEBUG 'Edge collapsed';
+#endif
+      RETURN;
+    END IF;
 
     -- Check if the so-snapped edge _now_ exists
     sql := 'SELECT edge_id FROM ' || quote_ident(atopology)
index baa5846922a2bbb93a9048ac7d15a1a63c771f3c..697079b598b5591383e3a06ffdf9b2cf2f1950a4 100644 (file)
@@ -145,8 +145,7 @@ SELECT check_changes();
 -- See http://trac.osgeo.org/postgis/ticket/1641
 
 -- clean all up first
-DELETE FROM city_data.edge_data; 
-DELETE FROM city_data.node; 
+DELETE FROM city_data.edge_data; DELETE FROM city_data.node; 
 DELETE FROM city_data.face where face_id > 0; 
 
 SELECT '#1641.1', TopoGeo_addLineString('city_data',
@@ -162,8 +161,7 @@ SELECT check_changes();
 
 -- Now w/out explicit tolerance (will use local min)
 -- clean all up first
-DELETE FROM city_data.edge_data; 
-DELETE FROM city_data.node; 
+DELETE FROM city_data.edge_data; DELETE FROM city_data.node; 
 DELETE FROM city_data.face where face_id > 0; 
 
 SELECT '#1641.3', TopoGeo_addLineString('city_data',
@@ -175,6 +173,17 @@ SELECT '#1641.4', TopoGeo_addLineString('city_data',
 ) ORDER BY 2;
 SELECT check_changes();
 
+-- See http://trac.osgeo.org/postgis/ticket/1650
+
+DELETE FROM city_data.edge_data; DELETE FROM city_data.node; 
+DELETE FROM city_data.face where face_id > 0; 
+
+SELECT '#1650.1' UNION ALL
+SELECT '#1650.2' || TopoGeo_addLineString('city_data',
+  'LINESTRING(0 0, 0 1)'
+, 2)::text;
+SELECT check_changes();
+
 -- Cleanups
 DROP FUNCTION check_changes();
 SELECT DropTopology('city_data');
index e59deb480daa98611dbd524630396a3f1d39014a..930ed795b4c52f9d385d94ecff2ce60d623c56aa 100644 (file)
@@ -144,4 +144,6 @@ E|62|sn60|en63
 E|63|sn63|en61
 E|64|sn62|en63
 E|65|sn63|en64
+#1650.1
+N|65|0|POINT(0 0)
 Topology 'city_data' dropped