From 08453791fe8445ec51388dbdc158b6533349dbdc Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Thu, 26 Apr 2012 20:10:22 +0000 Subject: [PATCH] Fix false edge-node crossing report in ValidateTopology (#1625) git-svn-id: http://svn.osgeo.org/postgis/trunk@9683 b70326c6-7e19-0410-871a-916f4a2858ee --- NEWS | 1 + topology/test/Makefile | 3 ++- topology/test/regress/validatetopology.sql | 21 +++++++++++++++++++ .../test/regress/validatetopology_expected | 1 + topology/topology.sql.in.c | 4 ++-- 5 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 topology/test/regress/validatetopology.sql create mode 100644 topology/test/regress/validatetopology_expected diff --git a/NEWS b/NEWS index 793e362fb..76fc6c5c6 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ PostGIS 2.0.1 * Bug Fixes * + - #1625, fix false edge-node crossing report in ValidateTopology. - #1791, fix ST_Azimuth with very close but distinct points. - #1775, ST_ChangeEdgeGeom collision detection with 2-vertex target. - #1776, fix ST_SymDifference(empty, geom) to return geom. diff --git a/topology/test/Makefile b/topology/test/Makefile index bc143f385..1728bd190 100644 --- a/topology/test/Makefile +++ b/topology/test/Makefile @@ -61,7 +61,8 @@ TESTS = regress/legacy_validate.sql regress/legacy_predicate.sql \ regress/getfacebypoint.sql \ regress/getringedges.sql \ regress/gettopogeomelements.sql \ - regress/layertrigger.sql + regress/layertrigger.sql \ + regress/validatetopology.sql check: topo_predicates.sql load_topology.sql load_topology-4326.sql $(MAKE) -C ../../regress staged-install diff --git a/topology/test/regress/validatetopology.sql b/topology/test/regress/validatetopology.sql new file mode 100644 index 000000000..f9c9236a8 --- /dev/null +++ b/topology/test/regress/validatetopology.sql @@ -0,0 +1,21 @@ +\set VERBOSITY terse +set client_min_messages to ERROR; + +-- TODO: merge legacy_validate.sql here + +-- See ticket #1789 +select null from ( select topology.CreateTopology('t') > 0 ) as ct; +COPY t.node (node_id, containing_face, geom) FROM stdin; +1 \N 01010000000000000000E065C002000000008056C0 +2 \N 01010000000000000000E065C000000000008056C0 +3 \N 010100000000000000009865C04FE5D4AD958655C0 +\. +COPY t.edge_data (edge_id, start_node, end_node, next_left_edge, abs_next_left_edge, next_right_edge, abs_next_right_edge, left_face, right_face, geom) FROM stdin; +1 1 3 2 2 1 1 0 0 0102000000020000000000000000E065C002000000008056C000000000009865C04FE5D4AD958655C0 +2 3 2 -2 2 -1 1 0 0 01020000000200000000000000009865C04FE5D4AD958655C00000000000E065C000000000008056C0 +\. +SELECT '#1789', * FROM ValidateTopology('t') UNION +SELECT '#1789', '---', null, null ORDER BY 1,2,3,4; +select null from ( select topology.DropTopology('t') ) as dt; + + diff --git a/topology/test/regress/validatetopology_expected b/topology/test/regress/validatetopology_expected new file mode 100644 index 000000000..8fe2cef51 --- /dev/null +++ b/topology/test/regress/validatetopology_expected @@ -0,0 +1 @@ +#1789|---|| diff --git a/topology/topology.sql.in.c b/topology/topology.sql.in.c index 3f217b0be..63dbacf94 100644 --- a/topology/topology.sql.in.c +++ b/topology/topology.sql.in.c @@ -1347,7 +1347,7 @@ BEGIN || quote_ident(toponame) || '.node a, ' || quote_ident(toponame) || '.node b ' || 'WHERE a.node_id < b.node_id ' - || ' AND ST_DWithin(a.geom, b.geom, 0)' + || ' AND ST_DWithin(a.geom, b.geom, 0)' -- NOTE: see #1625 and #1789 LOOP retrec.error = 'coincident nodes'; retrec.id1 = rec.id1; @@ -1362,7 +1362,7 @@ BEGIN || quote_ident(toponame) || '.edge e ' || 'WHERE e.start_node != n.node_id ' || 'AND e.end_node != n.node_id ' - || 'AND ST_DWithin(n.geom, e.geom, 0)' + || 'AND ST_Within(n.geom, e.geom)' LOOP retrec.error = 'edge crosses node'; retrec.id1 = rec.id1; -- 2.40.0