From 9dde5f7da2256ea75c9231e839af5fe03947f6a1 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Tue, 7 Feb 2012 10:14:37 +0000 Subject: [PATCH] Allow changing a closed edge (but w/out fixing linking, see #892) git-svn-id: http://svn.osgeo.org/postgis/trunk@9063 b70326c6-7e19-0410-871a-916f4a2858ee --- topology/sql/sqlmm.sql.in.c | 23 ++++++++++++++----- topology/test/regress/st_changeedgegeom.sql | 5 +++- .../test/regress/st_changeedgegeom_expected | 1 + 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/topology/sql/sqlmm.sql.in.c b/topology/sql/sqlmm.sql.in.c index 6ab4ee3e7..8f8dfb93c 100644 --- a/topology/sql/sqlmm.sql.in.c +++ b/topology/sql/sqlmm.sql.in.c @@ -2605,14 +2605,18 @@ BEGIN -- -- g) Check if curve crosses any node - -- _within_ used to let endpoints out -- - FOR rec IN EXECUTE 'SELECT node_id FROM ' - || quote_ident(atopology) || '.node - WHERE ST_Within(geom, ' || quote_literal(acurve::text) || '::geometry)' + FOR rec IN EXECUTE + 'SELECT node_id, ST_Relate(geom, ' + || quote_literal(acurve::text) || '::geometry, 2) as relate FROM ' + || quote_ident(atopology) + || '.node WHERE geom && ' + || quote_literal(acurve::text) + || '::geometry' LOOP - RAISE EXCEPTION - 'SQL/MM Spatial exception - geometry crosses a node'; + IF ST_RelateMatch(rec.relate, 'T********') THEN + RAISE EXCEPTION 'SQL/MM Spatial exception - geometry crosses a node'; + END IF; END LOOP; -- @@ -2657,6 +2661,13 @@ BEGIN || ' SET geom = ' || quote_literal(acurve::text) || ' WHERE edge_id = ' || anedge; + -- + -- TODO: Check if we need to update linking + -- We do if: + -- o edge is closed and we changed direction) + -- o edge moved to another face + -- + RETURN 'Edge ' || anedge || ' changed'; END diff --git a/topology/test/regress/st_changeedgegeom.sql b/topology/test/regress/st_changeedgegeom.sql index c0e2bcc57..d2278492f 100644 --- a/topology/test/regress/st_changeedgegeom.sql +++ b/topology/test/regress/st_changeedgegeom.sql @@ -33,7 +33,10 @@ SELECT topology.ST_ChangeEdgeGeom('city_data', 5, SELECT topology.ST_ChangeEdgeGeom('city_data', 5, 'LINESTRING(41 40, 49 40, 49 34, 57 33)'); --- TODO: test changing closed edge +-- Change a closed edge +SELECT topology.ST_ChangeEdgeGeom('city_data', 26, + 'LINESTRING(4 31, 7 31, 4 34, 4 31)'); + -- TODO: test reverse direction of closed edge SELECT topology.DropTopology('city_data'); diff --git a/topology/test/regress/st_changeedgegeom_expected b/topology/test/regress/st_changeedgegeom_expected index a6a94142c..3de3f8e57 100644 --- a/topology/test/regress/st_changeedgegeom_expected +++ b/topology/test/regress/st_changeedgegeom_expected @@ -12,4 +12,5 @@ ERROR: SQL/MM Spatial exception - non-existent edge 666 ERROR: SQL/MM Spatial exception - geometry crosses an edge Edge 5 changed Edge 5 changed +Edge 26 changed Topology 'city_data' dropped -- 2.40.0