mirror of
https://git.osgeo.org/gitea/postgis/postgis
synced 2024-10-24 17:12:35 +00:00
a5532e02b7
git-svn-id: http://svn.osgeo.org/postgis/trunk@9908 b70326c6-7e19-0410-871a-916f4a2858ee
114 lines
3.8 KiB
PL/PgSQL
114 lines
3.8 KiB
PL/PgSQL
\set VERBOSITY terse
|
|
set client_min_messages to ERROR;
|
|
|
|
\i load_topology.sql
|
|
|
|
-- Save max node,edge and face ids
|
|
select 'node'::text as what, max(node_id) INTO city_data.limits FROM city_data.node;
|
|
INSERT INTO city_data.limits select 'edge'::text as what, max(edge_id) FROM city_data.edge;
|
|
INSERT INTO city_data.limits select 'face'::text as what, max(face_id) FROM city_data.face;
|
|
SELECT 'max',* from city_data.limits;
|
|
|
|
-- Check changes since last saving, save more
|
|
-- {
|
|
CREATE OR REPLACE FUNCTION check_changes()
|
|
RETURNS TABLE (o text)
|
|
AS $$
|
|
DECLARE
|
|
rec RECORD;
|
|
sql text;
|
|
BEGIN
|
|
-- Check effect on nodes
|
|
sql := 'SELECT n.node_id, ''N|'' || n.node_id || ''|'' ||
|
|
COALESCE(n.containing_face::text,'''') || ''|'' ||
|
|
ST_AsText(ST_SnapToGrid(n.geom, 0.2))::text as xx
|
|
FROM city_data.node n WHERE n.node_id > (
|
|
SELECT max FROM city_data.limits WHERE what = ''node''::text )
|
|
ORDER BY n.node_id';
|
|
|
|
FOR rec IN EXECUTE sql LOOP
|
|
o := rec.xx;
|
|
RETURN NEXT;
|
|
END LOOP;
|
|
|
|
-- Check effect on edges
|
|
sql := '
|
|
WITH node_limits AS ( SELECT max FROM city_data.limits WHERE what = ''node''::text ),
|
|
edge_limits AS ( SELECT max FROM city_data.limits WHERE what = ''edge''::text )
|
|
SELECT ''E|'' || e.edge_id || ''|sn'' || e.start_node || ''|en'' || e.end_node :: text as xx
|
|
FROM city_data.edge e, node_limits nl, edge_limits el
|
|
WHERE e.start_node > nl.max
|
|
OR e.end_node > nl.max
|
|
OR e.edge_id > el.max
|
|
ORDER BY e.edge_id;
|
|
';
|
|
|
|
FOR rec IN EXECUTE sql LOOP
|
|
o := rec.xx;
|
|
RETURN NEXT;
|
|
END LOOP;
|
|
|
|
-- Check effect on faces
|
|
sql := '
|
|
WITH face_limits AS ( SELECT max FROM city_data.limits WHERE what = ''face''::text )
|
|
SELECT ''F|'' || f.face_id ::text as xx
|
|
FROM city_data.face f, face_limits fl
|
|
WHERE f.face_id > fl.max
|
|
ORDER BY f.face_id;
|
|
';
|
|
|
|
FOR rec IN EXECUTE sql LOOP
|
|
o := rec.xx;
|
|
RETURN NEXT;
|
|
END LOOP;
|
|
|
|
UPDATE city_data.limits SET max = (SELECT max(n.node_id) FROM city_data.node n) WHERE what = 'node';
|
|
UPDATE city_data.limits SET max = (SELECT max(e.edge_id) FROM city_data.edge e) WHERE what = 'edge';
|
|
UPDATE city_data.limits SET max = (SELECT max(f.face_id) FROM city_data.face f) WHERE what = 'face';
|
|
|
|
END;
|
|
$$ LANGUAGE 'plpgsql';
|
|
-- }
|
|
|
|
|
|
-- Invalid calls
|
|
SELECT 'invalid', TopoGeo_addPolygon('city_data', 'MULTILINESTRING((36 26, 38 30))');
|
|
SELECT 'invalid', TopoGeo_addPolygon('city_data', 'POINT(36 26)');
|
|
SELECT 'invalid', TopoGeo_addPolygon('invalid', 'POLYGON((36 26, 40 24, 40 30, 36 26))');
|
|
|
|
-- Isolated face in universal face
|
|
SELECT 'iso_uni', TopoGeo_addPolygon('city_data', 'POLYGON((36 26, 38 30, 43 26, 36 26))');
|
|
SELECT check_changes();
|
|
|
|
-- Isolated face in universal face with hole
|
|
SELECT 'iso_uni_hole', TopoGeo_addPolygon('city_data', 'POLYGON((9 28, 16 29, 16 23, 10 23, 9 28),(15 25, 13 27, 11 24, 15 25))');
|
|
SELECT check_changes();
|
|
|
|
-- Existing single face
|
|
SELECT 'ex', TopoGeo_addPolygon('city_data', 'POLYGON((21 22,35 22,35 14,21 14,21 22))');
|
|
SELECT check_changes();
|
|
|
|
-- Union of existing faces
|
|
SELECT 'ex_union', TopoGeo_addPolygon('city_data', 'POLYGON((9 14,21 14,35 14,35 6,21 6,9 6,9 14))') ORDER BY 2;
|
|
SELECT check_changes();
|
|
|
|
-- Half an existing face
|
|
SELECT 'half', TopoGeo_addPolygon('city_data', 'POLYGON((21 14, 35 22, 35 14, 21 14))');
|
|
SELECT check_changes();
|
|
|
|
-- Split two existing faces
|
|
SELECT 'split', TopoGeo_addPolygon('city_data', 'POLYGON((21 14, 21 22, 35 14, 21 14))') ORDER BY 2;
|
|
SELECT check_changes();
|
|
|
|
-- Union of existing face, with hole
|
|
SELECT 'ex_hole', TopoGeo_addPolygon('city_data', 'POLYGON((9 22,47 22,47 6,9 6,9 22),(21 14,28 18,35 14,21 14))') ORDER BY 2;
|
|
SELECT check_changes();
|
|
|
|
-- Union of existing face, with hole and a tolerance
|
|
SELECT 'ex_hole_snap', TopoGeo_addPolygon('city_data', 'POLYGON((9 22,35 22.5, 47 22,47 6,9 6,9 22),(21 14,28 17.5,35 14,21 14))', 1) ORDER BY 2;
|
|
SELECT check_changes();
|
|
|
|
DROP FUNCTION check_changes();
|
|
SELECT DropTopology('city_data');
|
|
|