[postgis-tickets] [SCM] PostGIS branch stable-3.3 updated. 3.3.2-3-g2bf092c40
git at osgeo.org
git at osgeo.org
Wed Nov 16 16:02:53 PST 2022
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "PostGIS".
The branch, stable-3.3 has been updated
via 2bf092c400fc84b342bf8bf1137a07f03ee421f0 (commit)
from ea9cb50a62a0dcda53991ab5243fddee5fc0b195 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 2bf092c400fc84b342bf8bf1137a07f03ee421f0
Author: Sandro Santilli <strk at kbt.io>
Date: Thu Nov 17 00:59:34 2022 +0100
Fix misleading message about doubly connected edges healing
Closes #5289
Includes regress test
diff --git a/NEWS b/NEWS
index 83a6f25a1..33cfa7610 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,9 @@
+PostGIS 3.3.3dev
+YYYY/MM/DD
+
+* Bug Fixes *
+ - #5289, Fix misleading message about doubly connected edges healing (Sandro Santilli)
+
PostGIS 3.3.2
2022/11/12
This version requires PostgreSQL 11-15, GEOS 3.6 or higher, and Proj 5.2+
diff --git a/topology/sql/cleanup/RemoveUnusedPrimitives.sql.in b/topology/sql/cleanup/RemoveUnusedPrimitives.sql.in
index fba82fbdc..8f58d4008 100644
--- a/topology/sql/cleanup/RemoveUnusedPrimitives.sql.in
+++ b/topology/sql/cleanup/RemoveUnusedPrimitives.sql.in
@@ -580,7 +580,7 @@ BEGIN
removable_nodes_of_degree_2_in_bbox AS (
SELECT
n.node_id,
- array_agg(e.edge_id) edges
+ array_agg(e.edge_id ORDER BY e.edge_id) edges
FROM
unused_connected_nodes_in_bbox n,
%1$I.edge e
@@ -612,15 +612,22 @@ BEGIN
)
GROUP BY n.node_id, r.layer_id, r.topogeo_id
HAVING count(DISTINCT abs(r.element_id)) != 2
+ ),
+ valid_heals AS (
+ SELECT
+ node_id,
+ edges
+ FROM removable_nodes_of_degree_2_in_bbox
+ WHERE node_id NOT IN (
+ SELECT node_id FROM breaking_heals
+ )
)
SELECT
- node_id,
+ array_agg(node_id) connecting_nodes,
edges[1] edge1,
edges[2] edge2
- FROM removable_nodes_of_degree_2_in_bbox
- WHERE node_id NOT IN (
- SELECT node_id FROM breaking_heals
- )
+ FROM valid_heals
+ GROUP BY edges
$$,
topo.name
);
@@ -634,8 +641,8 @@ BEGIN
edge1 := COALESCE( (edgeMap -> rec.edge1::text)::int, rec.edge1);
edge2 := COALESCE( (edgeMap -> rec.edge2::text)::int, rec.edge2);
- RAISE DEBUG 'Should heal edges % (now %) and % (now %) bound by node %',
- rec.edge1, edge1, rec.edge2, edge2, rec.node_id;
+ RAISE DEBUG 'Should heal edges % (now %) and % (now %) bound by nodes %',
+ rec.edge1, edge1, rec.edge2, edge2, rec.connecting_nodes;
IF edge1 = edge2 THEN
-- Nothing to merge here, continue
@@ -646,16 +653,16 @@ BEGIN
BEGIN
-- TODO: replace ST_ModEdgeHeal loop with a faster direct deletion and healing
removedNode := topology.ST_ModEdgeHeal(topo.name, edge1, edge2);
- IF rec.node_id != removedNode THEN
+ IF NOT removedNode = ANY ( rec.connecting_nodes ) THEN
RAISE EXCEPTION 'Healing of edges % and % was reported '
- 'to remove node % while we expected % instead',
- edge1, edge2, removedNode, rec.node_id;
+ 'to remove node % while we expected any of % instead',
+ edge1, edge2, removedNode, rec.connecting_nodes;
END IF;
RAISE DEBUG 'Edge % merged into %, dropping node %', edge2, edge1, removedNode;
ok := 1;
EXCEPTION WHEN OTHERS
THEN
- RAISE WARNING 'Edges % and % joined by node % could not be healed: %', edge1, edge2, rec.node_id, SQLERRM;
+ RAISE WARNING 'Edges % and % joined by node % could not be healed: %', edge1, edge2, rec.connecting_nodes, SQLERRM;
END;
IF ok THEN
-- edge2 was now renamed to edge1, update map
diff --git a/topology/test/regress/removeunusedprimitives.sql b/topology/test/regress/removeunusedprimitives.sql
index cd966cd4d..345ba9f23 100644
--- a/topology/test/regress/removeunusedprimitives.sql
+++ b/topology/test/regress/removeunusedprimitives.sql
@@ -204,6 +204,24 @@ SELECT 't6', 'clean', topology.RemoveUnusedPrimitives('city_data');
SELECT 't6', 'changed', * FROM features.check_changed_features();
SELECT 't6', 'invalidity', * FROM topology.ValidateTopology('city_data');
+
+-- See https://trac.osgeo.org/postgis/ticket/5289
+SELECT NULL FROM (
+ SELECT toTopoGeom(
+ ST_MakeLine(
+ ST_EndPoint( ST_GeometryN(feature,1) ),
+ ST_StartPoint( ST_GeometryN(feature,1) )
+ ),
+ feature
+ ) FROM features.city_streets WHERE feature_name = 'R2'
+) foo;
+UPDATE features.city_streets SET geom = feature::geometry
+WHERE feature_name = 'R2';
+SELECT '#5289', 'clean', topology.RemoveUnusedPrimitives('city_data');
+SELECT '#5289', 'changed', * FROM features.check_changed_features();
+SELECT '#5289', 'invalidity', * FROM topology.ValidateTopology('city_data');
+
+
-- Cleanup
SELECT NULL FROM DropTopology('city_data');
DROP SCHEMA features CASCADE;
diff --git a/topology/test/regress/removeunusedprimitives_expected b/topology/test/regress/removeunusedprimitives_expected
index afcbe4895..400adf603 100644
--- a/topology/test/regress/removeunusedprimitives_expected
+++ b/topology/test/regress/removeunusedprimitives_expected
@@ -7,3 +7,4 @@ t3|clean|1
t4|clean|1
t5|clean|2
t6|clean|3
+#5289|clean|1
-----------------------------------------------------------------------
Summary of changes:
NEWS | 6 +++++
topology/sql/cleanup/RemoveUnusedPrimitives.sql.in | 31 +++++++++++++---------
topology/test/regress/removeunusedprimitives.sql | 18 +++++++++++++
.../test/regress/removeunusedprimitives_expected | 1 +
4 files changed, 44 insertions(+), 12 deletions(-)
hooks/post-receive
--
PostGIS
More information about the postgis-tickets
mailing list