-- 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
-- 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
\set VERBOSITY terse
-set client_min_messages to ERROR;
+set client_min_messages to WARNING;
-- Import city_data
\i load_topology.sql
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();
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
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();
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