layer_info RECORD;
topology_info RECORD;
rec RECORD;
+ rec2 RECORD;
tg topology.TopoGeometry;
- elems topology.TopoElementArray = '{{0,0}}';
+ elems INT[][];
+ elem INT[];
sql TEXT;
typ TEXT;
BEGIN
layer_info RECORD;
topology_info RECORD;
rec RECORD;
- elems topology.TopoElementArray = '{{0,0}}';
+ rec2 RECORD;
+ elem INT[];
+ elems INT[][];
sql TEXT;
typ TEXT;
tolerance FLOAT8;
-- and add them to the definition of it. We add them as soon
-- as possible so that each element can further edit the
-- definition by splitting
- FOR rec IN SELECT DISTINCT id(tg), alayer as lyr,
- CASE WHEN ST_Dimension(geom) = 0 THEN 1
- WHEN ST_Dimension(geom) = 1 THEN 2
- WHEN ST_Dimension(geom) = 2 THEN 3
- END as type,
- CASE WHEN ST_Dimension(geom) = 0 THEN
- topology.topogeo_addPoint(topology_info.name, geom, tolerance)
- WHEN ST_Dimension(geom) = 1 THEN
- topology.topogeo_addLineString(topology_info.name, geom, tolerance)
- WHEN ST_Dimension(geom) = 2 THEN
- topology.topogeo_addPolygon(topology_info.name, geom, tolerance)
- END as primitive
+ FOR rec IN SELECT id(tg), alayer as lyr,
+ geom, ST_Dimension(geom) as dims
FROM (SELECT (ST_Dump(ageom)).geom) as f
WHERE NOT ST_IsEmpty(geom)
LOOP
- -- TODO: consider use a single INSERT statement for the whole thing
- sql := 'INSERT INTO ' || quote_ident(topology_info.name)
- || '.relation(topogeo_id, layer_id, element_type, element_id) SELECT '
- || rec.id || ',' || rec.lyr || ',' || rec.type
- || ',' || rec.primitive
- -- NOTE: we're avoiding duplicated rows here
- || ' EXCEPT SELECT ' || rec.id || ', ' || rec.lyr
- || ', element_type, element_id FROM '
- || quote_ident(topology_info.name)
- || '.relation WHERE layer_id = ' || rec.lyr
- || ' AND topogeo_id = ' || rec.id;
+ FOR rec2 IN SELECT CASE
+ WHEN rec.dims = 0 THEN
+ topology.topogeo_addPoint(atopology, rec.geom, tolerance)
+ WHEN rec.dims = 1 THEN
+ topology.topogeo_addLineString(atopology, rec.geom, tolerance)
+ WHEN rec.dims = 2 THEN
+ topology.topogeo_addPolygon(atopology, rec.geom, tolerance)
+ END as primitive
+ LOOP
+ elem := ARRAY[rec.dims+1, rec2.primitive];
+ IF elems @> ARRAY[elem] THEN
#ifdef POSTGIS_TOPOLOGY_DEBUG
- RAISE DEBUG '%', sql;
+RAISE DEBUG 'Elem % already in %', elem, elems;
#endif
- EXECUTE sql;
+ ELSE
+#ifdef POSTGIS_TOPOLOGY_DEBUG
+RAISE DEBUG 'Elem % NOT in %', elem, elems;
+#endif
+ elems := elems || elem;
+ -- TODO: consider use a single INSERT statement for the whole thing
+ sql := 'INSERT INTO ' || quote_ident(atopology)
+ || '.relation(topogeo_id, layer_id, element_type, element_id) VALUES ('
+ || rec.id || ',' || rec.lyr || ',' || rec.dims+1
+ || ',' || rec2.primitive || ')'
+ -- NOTE: we're avoiding duplicated rows here
+ || ' EXCEPT SELECT ' || rec.id || ', ' || rec.lyr
+ || ', element_type, element_id FROM '
+ || quote_ident(topology_info.name)
+ || '.relation WHERE layer_id = ' || rec.lyr
+ || ' AND topogeo_id = ' || rec.id;
+#ifdef POSTGIS_TOPOLOGY_DEBUG
+ RAISE DEBUG '%', sql;
+#endif
+ EXECUTE sql;
+ END IF;
+ END LOOP;
END LOOP;
RETURN tg;
tg as ( select totopogeom(g, 'tt', 5) as g from inp )
select St_AsText(inp.g), st_astext(tg.g::geometry) from inp, tg;
-
-- Convert some empties
SELECT ST_AsText(toTopoGeom('POINT EMPTY', 'tt', 1)::geometry);
SELECT ST_AsText(toTopoGeom('MULTIPOINT EMPTY', 'tt', 1)::geometry);
tg as ( select totopogeom(g, 'tt', 5) as g from inp )
select '#1790.3', ST_HausdorffDistance(inp.g, tg.g::geometry), ST_HausdorffDistance(tg.g::geometry, inp.g) FROM inp, tg;
+-- http://trac.osgeo.org/postgis/ticket/1968
+with inp as ( select
+'MULTILINESTRING ((0 0, 10 0),(5 0, 5 5))'
+::geometry as g ),
+tg as ( select totopogeom(g, 'tt', 3) as g from inp )
+SELECT '#1968', ST_HausdorffDistance(inp.g, tg.g::geometry) FROM inp, tg;
+
-- Test adding portions to an existing TopoGeometry
INSERT INTO tt.f_areal (id, g)
SELECT -1, toTopoGeom('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))', 'tt', 4);