]> granicus.if.org Git - postgis/commitdiff
Enhance edge splitting robustness (#1711)
authorSandro Santilli <strk@keybit.net>
Fri, 23 Mar 2012 22:23:05 +0000 (22:23 +0000)
committerSandro Santilli <strk@keybit.net>
Fri, 23 Mar 2012 22:23:05 +0000 (22:23 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@9539 b70326c6-7e19-0410-871a-916f4a2858ee

topology/sql/sqlmm.sql.in.c
topology/test/regress/st_modedgesplit.sql
topology/test/regress/st_modedgesplit_expected
topology/test/regress/st_newedgessplit.sql
topology/test/regress/st_newedgessplit_expected

index 103aaf017b2fd5e035825591ddc6191f4b0892c3..10fe837151842c4ebbaff9f6ae36033f7d7ad6fe 100644 (file)
@@ -1905,8 +1905,12 @@ BEGIN
   -- Compute new edges
   --
   nodepos = ST_Line_locate_point(oldedge.geom, apoint);
+
   edge1 = ST_Line_substring(oldedge.geom, 0, nodepos);
+  edge1 = ST_SetPoint(edge1, ST_NPoints(edge1)-1, apoint);
+
   edge2 = ST_Line_substring(oldedge.geom, nodepos, 1);
+  edge2 = ST_SetPoint(edge2, 0, apoint);
 
   --
   -- Get ids for the new edges 
@@ -2198,9 +2202,12 @@ BEGIN
   -- Compute new edge
   --
   nodepos = ST_Line_Locate_Point(oldedge.geom, apoint);
+
   newedge1 = ST_Line_Substring(oldedge.geom, 0, nodepos);
-  newedge2 = ST_Line_Substring(oldedge.geom, nodepos, 1);
+  newedge1 = ST_SetPoint(newedge1, ST_NPoints(newedge1)-1, apoint);
 
+  newedge2 = ST_Line_Substring(oldedge.geom, nodepos, 1);
+  newedge2 = ST_SetPoint(newedge2, 0, apoint);
 
   --
   -- Get ids for the new edge
index 94fc38a4d56069349809fa0ec0a08dd78b5faa28..80abf19c383ddacfade3fb3eb411b494d5ab0dba 100644 (file)
@@ -1,6 +1,6 @@
 
 \set VERBOSITY terse
-set client_min_messages to ERROR;
+set client_min_messages to WARNING;
 
 -- Import city_data
 \i load_topology.sql
@@ -90,6 +90,37 @@ SELECT check_changes();
 SELECT 'closed', ST_ModEdgeSplit('city_data', 1, 'POINT(3 38)');
 SELECT check_changes();
 
+-- Robustness of edge splitting (#1711)
+
+-- clean all up first
+DELETE FROM city_data.edge_data; 
+DELETE FROM city_data.node; 
+DELETE FROM city_data.face where face_id > 0; 
+
+CREATE TEMP TABLE t AS
+SELECT
+'01020000000400000000000000000034400000000000002440000000000000244000000000000024400000000000002240000000000000284000000000000024400000000000003440'
+::geometry as line, 
+'010100000000000000000022400000000000002840'
+::geometry as point,
+null::int as edge_id,
+null::int as node_id
+;
+
+UPDATE t SET edge_id = AddEdge('city_data', line);
+UPDATE t SET node_id = ST_ModEdgeSplit('city_data', t.edge_id, t.point);
+SELECT 'robust.1', 'E'||edge_id, 'N'||node_id FROM t;
+SELECT check_changes();
+SELECT 'robust.2',
+ ST_Equals(t.point, ST_EndPoint(e1.geom)),
+ ST_Equals(t.point, ST_StartPoint(e2.geom))
+FROM t, city_data.edge e1, city_data.edge e2, city_data.node n
+WHERE n.node_id = t.node_id
+ AND e1.end_node = n.node_id
+ AND e2.start_node = n.node_id;
+
+DROP TABLE t;
+
 
 
 DROP FUNCTION check_changes();
index 7ca7a80e9620a339f7541558f527e558ec4ce207..c91dc4568d40072f12987b52f05df17084d0a9e0 100644 (file)
@@ -33,4 +33,11 @@ closed|27
 N|27||POINT(3 38)
 E|1|sn1|en27|nl31|nr-31|lf1|rf0
 E|31|sn27|en1|nl1|nr-1|lf1|rf0
+robust.1|E32|N30
+N|28||POINT(20 10)
+N|29||POINT(10 20)
+N|30||POINT(9 12)
+E|32|sn28|en30|nl33|nr32|lf0|rf0
+E|33|sn30|en29|nl-33|nr-32|lf0|rf0
+robust.2|t|t
 Topology 'city_data' dropped
index 3d24f96c0d5d9dbe7eca08720d6efb82c361ccc2..775983413f9214be46daaa11fb9e97ea1fed5aa4 100644 (file)
@@ -90,6 +90,36 @@ SELECT check_changes();
 SELECT 'closed', ST_NewEdgesSplit('city_data', 1, 'POINT(3 38)');
 SELECT check_changes();
 
+-- Robustness of edge splitting (#1711)
+
+-- clean all up first
+DELETE FROM city_data.edge_data; 
+DELETE FROM city_data.node; 
+DELETE FROM city_data.face where face_id > 0; 
+
+CREATE TEMP TABLE t AS
+SELECT
+'01020000000400000000000000000034400000000000002440000000000000244000000000000024400000000000002240000000000000284000000000000024400000000000003440'
+::geometry as line, 
+'010100000000000000000022400000000000002840'
+::geometry as point,
+null::int as edge_id,
+null::int as node_id
+;
+
+UPDATE t SET edge_id = AddEdge('city_data', line);
+UPDATE t SET node_id = ST_NewEdgesSplit('city_data', t.edge_id, t.point);
+SELECT 'robust.1', 'E'||edge_id, 'N'||node_id FROM t;
+SELECT check_changes();
+SELECT 'robust.2',
+ ST_Equals(t.point, ST_EndPoint(e1.geom)),
+ ST_Equals(t.point, ST_StartPoint(e2.geom))
+FROM t, city_data.edge e1, city_data.edge e2, city_data.node n
+WHERE n.node_id = t.node_id
+ AND e1.end_node = n.node_id
+ AND e2.start_node = n.node_id;
+
+DROP TABLE t;
 
 
 DROP FUNCTION check_changes();
index bf41786df73d6689f69e53cb4910822bd1cb12e4..8bf6e6750ca28b94cc72b128d873a6554c4c093f 100644 (file)
@@ -33,4 +33,11 @@ closed|27
 N|27||POINT(3 38)
 E|35|sn1|en27|nl36|nr-36|lf1|rf0
 E|36|sn27|en1|nl35|nr-35|lf1|rf0
+robust.1|E37|N30
+N|28||POINT(20 10)
+N|29||POINT(10 20)
+N|30||POINT(9 12)
+E|38|sn28|en30|nl39|nr38|lf0|rf0
+E|39|sn30|en29|nl-39|nr-38|lf0|rf0
+robust.2|t|t
 Topology 'city_data' dropped