From: Sandro Santilli Date: Sat, 7 Nov 2015 10:39:19 +0000 (+0000) Subject: Fix toTopoGeom loss of low-id primitives from TopoGeometry definition X-Git-Tag: 2.3.0beta1~385 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1fdcb24c85b92996b43fce5c527d540b1dc993b4;p=postgis Fix toTopoGeom loss of low-id primitives from TopoGeometry definition Affects toTopoGeom on including edge with id=2 and face with id=3 Includes tests. Fixes #3359 git-svn-id: http://svn.osgeo.org/postgis/trunk@14375 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/topology/sql/topogeometry/totopogeom.sql.in b/topology/sql/topogeometry/totopogeom.sql.in index 3b7d33ee8..1056a9d01 100644 --- a/topology/sql/topogeometry/totopogeom.sql.in +++ b/topology/sql/topogeometry/totopogeom.sql.in @@ -10,6 +10,8 @@ -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +/* #define POSTGIS_TOPOLOGY_DEBUG 1 */ + -- { -- Convert a simple geometry to a topologically-defined one -- @@ -23,12 +25,7 @@ $$ DECLARE layer_info RECORD; topology_info RECORD; - rec RECORD; - rec2 RECORD; tg topology.TopoGeometry; - elems INT[][]; - elem INT[]; - sql TEXT; typ TEXT; BEGIN @@ -135,8 +132,8 @@ DECLARE topology_info RECORD; rec RECORD; rec2 RECORD; - elem INT[]; - elems INT[][]; + elem TEXT; + elems TEXT[]; sql TEXT; typ TEXT; tolerance FLOAT8; @@ -251,10 +248,11 @@ BEGIN topology.topogeo_addPolygon(atopology, rec.geom, tolerance) END as primitive LOOP - elem := ARRAY[rec.dims+1, rec2.primitive]; + elem := ARRAY[rec.dims+1, rec2.primitive]::text; IF elems @> ARRAY[elem] THEN #ifdef POSTGIS_TOPOLOGY_DEBUG RAISE DEBUG 'Elem % already in %', elem, elems; +RAISE DEBUG '% @> ARRAY[%] returned true', elems, elem; #endif ELSE #ifdef POSTGIS_TOPOLOGY_DEBUG diff --git a/topology/test/regress/totopogeom.sql b/topology/test/regress/totopogeom.sql index 63be65ede..993bc6e88 100644 --- a/topology/test/regress/totopogeom.sql +++ b/topology/test/regress/totopogeom.sql @@ -200,6 +200,26 @@ SELECT 'tgup1.3', id(t.g), st_area(t.g), count(r.*) WHERE t.id = -1 AND r.layer_id = 4 AND r.topogeo_id = id(t.g) GROUP BY id(t.g), st_area(t.g); +-- http://trac.osgeo.org/postgis/ticket/3359 +-- NOTE: requires identifier of the second edge to be 2 +TRUNCATE tt.relation CASCADE; +TRUNCATE tt.edge_data CASCADE; +TRUNCATE tt.node CASCADE; +DELETE FROM tt.face WHERE face_id > 0; +SELECT '#3359.setval', + setval('tt.edge_data_edge_id_seq', 1, false), + -- face_id is intentionally set to 2 + setval('tt.face_face_id_seq', 2, false), + setval('tt.node_node_id_seq', 1, false); +SELECT '#3359.line.1', ST_Length(toTopoGeom('LINESTRING (0 0,1 0)' +::geometry, 'tt', 3)); +SELECT '#3359.line.2', ST_Length(toTopoGeom('LINESTRING (0 0,1 0,1 1)' +::geometry, 'tt', 3)); +SELECT '#3359.area.1', ST_Area(toTopoGeom('POLYGON ((0 0,1 0,1 1,0 1,0 0))' +::geometry, 'tt', 4)); +SELECT '#3359.area.2', ST_Area(toTopoGeom('POLYGON ((0 0,1 0,1 2,0 2,0 0))' +::geometry, 'tt', 4)); + DROP TABLE tt.f_coll; DROP TABLE tt.f_areal; DROP TABLE tt.f_lineal; diff --git a/topology/test/regress/totopogeom_expected b/topology/test/regress/totopogeom_expected index 6d9999187..7f222f82d 100644 --- a/topology/test/regress/totopogeom_expected +++ b/topology/test/regress/totopogeom_expected @@ -44,4 +44,9 @@ custom_search_path|0 tgup1.1|5|100|1 tgup1.2|5|200|2 tgup1.3|5|200|4 +#3359.setval|1|2|1 +#3359.line.1|1 +#3359.line.2|2 +#3359.area.1|1 +#3359.area.2|2 Topology 'tt' dropped