[postgis-tickets] r14368 - Fix toTopoGeom loss of low-id primitives from TopoGeometry definition

Sandro Santilli strk at keybit.net
Sat Nov 7 01:57:38 PST 2015


Author: strk
Date: 2015-11-07 01:57:38 -0800 (Sat, 07 Nov 2015)
New Revision: 14368

Modified:
   branches/2.0/topology/sql/topogeometry/totopogeom.sql.in.c
   branches/2.0/topology/test/regress/totopogeom.sql
   branches/2.0/topology/test/regress/totopogeom_expected
Log:
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

Modified: branches/2.0/topology/sql/topogeometry/totopogeom.sql.in.c
===================================================================
--- branches/2.0/topology/sql/topogeometry/totopogeom.sql.in.c	2015-11-06 21:40:40 UTC (rev 14367)
+++ branches/2.0/topology/sql/topogeometry/totopogeom.sql.in.c	2015-11-07 09:57:38 UTC (rev 14368)
@@ -10,6 +10,8 @@
 --
 -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
+#define POSTGIS_TOPOLOGY_DEBUG 1
+
 -- {
 --  Convert a simple geometry to a topologically-defined one
 --
@@ -26,8 +28,8 @@
   rec RECORD;
   rec2 RECORD;
   tg topology.TopoGeometry;
-  elems INT[][];
-  elem INT[];
+  elems TEXT[];
+  elem TEXT;
   sql TEXT;
   typ TEXT;
   tolerance FLOAT8;
@@ -134,10 +136,11 @@
          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

Modified: branches/2.0/topology/test/regress/totopogeom.sql
===================================================================
--- branches/2.0/topology/test/regress/totopogeom.sql	2015-11-06 21:40:40 UTC (rev 14367)
+++ branches/2.0/topology/test/regress/totopogeom.sql	2015-11-07 09:57:38 UTC (rev 14368)
@@ -182,6 +182,26 @@
 tg as ( select totopogeom(g, 'tt', 3) as g from inp )
 SELECT '#1968.2', ST_HausdorffDistance(inp.g, tg.g::geometry) FROM inp, tg;
 
+-- 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;

Modified: branches/2.0/topology/test/regress/totopogeom_expected
===================================================================
--- branches/2.0/topology/test/regress/totopogeom_expected	2015-11-06 21:40:40 UTC (rev 14367)
+++ branches/2.0/topology/test/regress/totopogeom_expected	2015-11-07 09:57:38 UTC (rev 14368)
@@ -41,4 +41,9 @@
 #1790.3|0|0
 #1968.1|0
 #1968.2|0
+#3359.setval|1|2|1
+#3359.line.1|1
+#3359.line.2|2
+#3359.area.1|1
+#3359.area.2|2
 Topology 'tt' dropped



More information about the postgis-tickets mailing list