rec RECORD;
oldedge RECORD;
range GEOMETRY; -- movement range
+ tmp1 GEOMETRY;
+ tmp2 GEOMETRY;
sql TEXT;
iscw BOOLEAN;
BEGIN
-- Not in the specs:
-- Check topological isomorphism
--
- range := ST_MakeLine(oldedge.geom, ST_Reverse(acurve));
- RAISE DEBUG 'Made line: %', ST_AsText(range);
- range := ST_MakePolygon(range);
- RAISE DEBUG 'Made poly: %', ST_AsText(range);
- range := ST_CollectionExtract(ST_MakeValid(range), 3);
+ tmp1 := ST_MakeLine(ST_EndPoint(oldedge.geom), ST_StartPoint(oldedge.geom));
+ RAISE DEBUG 'end-to-start: %', ST_AsText(tmp1);
+
+ tmp2 := ST_MakeLine(oldedge.geom, tmp1);
+ IF ST_NumPoints(tmp2) < 4 THEN
+ tmp2 := ST_AddPoint(tmp2, ST_StartPoint(oldedge.geom));
+ END IF;
+ RAISE DEBUG 'Old-ring: %', ST_AsText(tmp2);
+ tmp2 := ST_CollectionExtract(ST_MakeValid(ST_MakePolygon(tmp2)), 3);
+ RAISE DEBUG 'Old-ring (poly): %', ST_AsText(tmp2);
+
+ range := ST_MakeLine(acurve, tmp1);
+ IF ST_NumPoints(range) < 4 THEN
+ range := ST_AddPoint(range, ST_StartPoint(oldedge.geom));
+ END IF;
+ RAISE DEBUG 'New-ring: %', ST_AsText(range);
+ range := ST_CollectionExtract(ST_MakeValid(ST_MakePolygon(range)), 3);
+ RAISE DEBUG 'New-ring (poly): %', ST_AsText(range);
+
+ range := ST_SymDifference(range, tmp2);
RAISE DEBUG 'Range motion: %', ST_AsText(range);
+
sql := 'SELECT node_id, geom FROM '
|| quote_ident(atopology)
|| '.node WHERE ST_Contains('
SELECT topology.ST_ChangeEdgeGeom('city_data', 2,
'LINESTRING(25 30, 28 39, 20 39, 25 30)');
+-- This movement should be fine
+SELECT 'T7.1', topology.ST_ChangeEdgeGeom('city_data', 2,
+'LINESTRING(25 30, 28 39, 17 39, 25 30)');
+
-- Test changing winding direction of closed edge
SELECT topology.ST_ChangeEdgeGeom('city_data', 26,
ST_Reverse('LINESTRING(4 31, 7 31, 4 34, 4 31)'));
SELECT topology.ST_ChangeEdgeGeom('city_data', 13,
'LINESTRING(21 6, 21 2, 6 2, 6 25, 50 25, 50 2, 35 2, 35 6)');
+
-- TODO: test moving closed edge into another face
-- TODO: test face mbr update