From: Sandro Santilli Date: Fri, 23 Mar 2012 22:23:05 +0000 (+0000) Subject: Enhance edge splitting robustness (#1711) X-Git-Tag: 2.0.0rc1~32 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e7296ab87dacab479a7f5da744102088d4d34c3b;p=postgis Enhance edge splitting robustness (#1711) git-svn-id: http://svn.osgeo.org/postgis/trunk@9539 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/topology/sql/sqlmm.sql.in.c b/topology/sql/sqlmm.sql.in.c index 103aaf017..10fe83715 100644 --- a/topology/sql/sqlmm.sql.in.c +++ b/topology/sql/sqlmm.sql.in.c @@ -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 diff --git a/topology/test/regress/st_modedgesplit.sql b/topology/test/regress/st_modedgesplit.sql index 94fc38a4d..80abf19c3 100644 --- a/topology/test/regress/st_modedgesplit.sql +++ b/topology/test/regress/st_modedgesplit.sql @@ -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(); diff --git a/topology/test/regress/st_modedgesplit_expected b/topology/test/regress/st_modedgesplit_expected index 7ca7a80e9..c91dc4568 100644 --- a/topology/test/regress/st_modedgesplit_expected +++ b/topology/test/regress/st_modedgesplit_expected @@ -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 diff --git a/topology/test/regress/st_newedgessplit.sql b/topology/test/regress/st_newedgessplit.sql index 3d24f96c0..775983413 100644 --- a/topology/test/regress/st_newedgessplit.sql +++ b/topology/test/regress/st_newedgessplit.sql @@ -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(); diff --git a/topology/test/regress/st_newedgessplit_expected b/topology/test/regress/st_newedgessplit_expected index bf41786df..8bf6e6750 100644 --- a/topology/test/regress/st_newedgessplit_expected +++ b/topology/test/regress/st_newedgessplit_expected @@ -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