From 9de3ff39216880fa56630bcb7a98b0faa3deaee1 Mon Sep 17 00:00:00 2001 From: Brian Sperlongano Date: Thu, 14 Sep 2023 09:55:01 -0400 Subject: [PATCH] Restore missing route zooms (#1579) This PR restores missing transportation_name features that are missing from zoom 11 and improves the mechanism by which transportation_name features are merged through lower zooms. This prevents route features from being dropped due to bridge interleaving (when a bridge interrupts an otherwise continuous route). This fix moves the length check to a later stage of processing and merges bridges/tunnels if they're too small. This is similar to the work done in the transportation layer to merge bridges that are too small to render lines. In this layer, bridges are merged when they're too small to justify a separate label. --- .../transportation_name.sql | 6 +- .../update_transportation_name.sql | 74 +++++++++++++------ 2 files changed, 55 insertions(+), 25 deletions(-) diff --git a/layers/transportation_name/transportation_name.sql b/layers/transportation_name/transportation_name.sql index 9db6d01b..db0e9010 100644 --- a/layers/transportation_name/transportation_name.sql +++ b/layers/transportation_name/transportation_name.sql @@ -94,7 +94,7 @@ FROM ( NULL::int AS level, NULL::boolean AS indoor FROM osm_transportation_name_linestring_gen3 - WHERE zoom_level = 7 + WHERE ST_Length(geometry) > 20000 AND zoom_level = 7 UNION ALL -- etldoc: osm_transportation_name_linestring_gen2 -> layer_transportation_name:z8 @@ -116,7 +116,7 @@ FROM ( NULL::int AS level, NULL::boolean AS indoor FROM osm_transportation_name_linestring_gen2 - WHERE zoom_level = 8 + WHERE ST_Length(geometry) > 14000 AND zoom_level = 8 UNION ALL -- etldoc: osm_transportation_name_linestring_gen1 -> layer_transportation_name:z9 @@ -140,7 +140,7 @@ FROM ( NULL::int AS level, NULL::boolean AS indoor FROM osm_transportation_name_linestring_gen1 - WHERE zoom_level BETWEEN 9 AND 11 + WHERE ST_Length(geometry) > 8000 / POWER(2, zoom_level - 9) AND zoom_level BETWEEN 9 AND 11 UNION ALL -- etldoc: osm_transportation_name_linestring -> layer_transportation_name:z12 diff --git a/layers/transportation_name/update_transportation_name.sql b/layers/transportation_name/update_transportation_name.sql index bdfabbba..e6496d11 100644 --- a/layers/transportation_name/update_transportation_name.sql +++ b/layers/transportation_name/update_transportation_name.sql @@ -267,7 +267,7 @@ CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_geometry_idx -- Create table for simplified LineStrings CREATE TABLE IF NOT EXISTS osm_transportation_name_linestring_gen1 ( id integer, - geometry geometry('LineString'), + geometry geometry, tags hstore, ref text, highway varchar, @@ -425,20 +425,30 @@ BEGIN -- etldoc: osm_transportation_name_linestring -> osm_transportation_name_linestring_gen1 INSERT INTO osm_transportation_name_linestring_gen1 (id, geometry, tags, ref, highway, subclass, brunnel, network, route_1, route_2, route_3, route_4, route_5, route_6, z_order) - SELECT id, ST_Simplify(geometry, 50) AS geometry, tags, ref, highway, subclass, brunnel, network, route_1, route_2, - route_3, route_4, route_5, route_6, z_order - FROM osm_transportation_name_linestring + SELECT MIN(id) as id, + ST_Simplify(ST_LineMerge(ST_Collect(geometry)), 50) AS geometry, + tags, ref, highway, subclass, brunnel, network, + route_1, route_2, route_3, route_4, route_5, route_6, z_order + FROM ( + SELECT id, + geometry, + tags, ref, highway, subclass, + CASE WHEN ST_Length(geometry) > 8000 THEN brunnel ELSE '' END AS brunnel, + network, route_1, route_2, route_3, route_4, route_5, route_6, z_order + FROM osm_transportation_name_linestring + ) osm_transportation_name_linestring_gen1_pre_merge WHERE ( full_update IS TRUE OR EXISTS ( SELECT NULL FROM transportation_name.name_changes_gen WHERE transportation_name.name_changes_gen.is_old IS FALSE AND - transportation_name.name_changes_gen.id = osm_transportation_name_linestring.id + transportation_name.name_changes_gen.id = osm_transportation_name_linestring_gen1_pre_merge.id ) ) AND ( - (highway IN ('motorway', 'trunk') OR highway = 'construction' AND subclass IN ('motorway', 'trunk')) AND - ST_Length(geometry) > 8000 - ) ON CONFLICT (id) DO UPDATE SET geometry = excluded.geometry, tags = excluded.tags, ref = excluded.ref, + (highway IN ('motorway', 'trunk') OR highway = 'construction' AND subclass IN ('motorway', 'trunk')) + ) + GROUP BY tags, ref, highway, subclass, brunnel, network, route_1, route_2, route_3, route_4, route_5, route_6, z_order + ON CONFLICT (id) DO UPDATE SET geometry = excluded.geometry, tags = excluded.tags, ref = excluded.ref, highway = excluded.highway, subclass = excluded.subclass, brunnel = excluded.brunnel, network = excluded.network, route_1 = excluded.route_1, route_2 = excluded.route_2, route_3 = excluded.route_3, route_4 = excluded.route_4, @@ -458,20 +468,30 @@ BEGIN -- etldoc: osm_transportation_name_linestring_gen1 -> osm_transportation_name_linestring_gen2 INSERT INTO osm_transportation_name_linestring_gen2 (id, geometry, tags, ref, highway, subclass, brunnel, network, route_1, route_2, route_3, route_4, route_5, route_6, z_order) - SELECT id, ST_Simplify(geometry, 120) AS geometry, tags, ref, highway, subclass, brunnel, network, route_1, route_2, - route_3, route_4, route_5, route_6, z_order - FROM osm_transportation_name_linestring_gen1 + SELECT MIN(id) as id, + ST_Simplify(ST_LineMerge(ST_Collect(geometry)), 120) AS geometry, + tags, ref, highway, subclass, brunnel, network, + route_1, route_2, route_3, route_4, route_5, route_6, z_order + FROM ( + SELECT id, + (ST_Dump(geometry)).geom AS geometry, + tags, ref, highway, subclass, + CASE WHEN ST_Length(geometry) > 14000 THEN brunnel ELSE '' END AS brunnel, + network, route_1, route_2, route_3, route_4, route_5, route_6, z_order + FROM osm_transportation_name_linestring_gen1 + ) osm_transportation_name_linestring_gen2_pre_merge WHERE ( full_update IS TRUE OR EXISTS ( SELECT NULL FROM transportation_name.name_changes_gen WHERE transportation_name.name_changes_gen.is_old IS FALSE AND - transportation_name.name_changes_gen.id = osm_transportation_name_linestring_gen1.id + transportation_name.name_changes_gen.id = osm_transportation_name_linestring_gen2_pre_merge.id ) ) AND ( - (highway IN ('motorway', 'trunk') OR highway = 'construction' AND subclass IN ('motorway', 'trunk')) AND - ST_Length(geometry) > 14000 - ) ON CONFLICT (id) DO UPDATE SET geometry = excluded.geometry, tags = excluded.tags, ref = excluded.ref, + (highway IN ('motorway', 'trunk') OR highway = 'construction' AND subclass IN ('motorway', 'trunk')) + ) + GROUP BY tags, ref, highway, subclass, brunnel, network, route_1, route_2, route_3, route_4, route_5, route_6, z_order + ON CONFLICT (id) DO UPDATE SET geometry = excluded.geometry, tags = excluded.tags, ref = excluded.ref, highway = excluded.highway, subclass = excluded.subclass, brunnel = excluded.brunnel, network = excluded.network, route_1 = excluded.route_1, route_2 = excluded.route_2, route_3 = excluded.route_3, route_4 = excluded.route_4, @@ -491,20 +511,30 @@ BEGIN -- etldoc: osm_transportation_name_linestring_gen2 -> osm_transportation_name_linestring_gen3 INSERT INTO osm_transportation_name_linestring_gen3 (id, geometry, tags, ref, highway, subclass, brunnel, network, route_1, route_2, route_3, route_4, route_5, route_6, z_order) - SELECT id, ST_Simplify(geometry, 200) AS geometry, tags, ref, highway, subclass, brunnel, network, route_1, route_2, - route_3, route_4, route_5, route_6, z_order - FROM osm_transportation_name_linestring_gen2 + SELECT MIN(id) as id, + ST_Simplify(ST_LineMerge(ST_Collect(geometry)), 200) AS geometry, + tags, ref, highway, subclass, brunnel, network, + route_1, route_2, route_3, route_4, route_5, route_6, z_order + FROM ( + SELECT id, + (ST_Dump(geometry)).geom AS geometry, + tags, ref, highway, subclass, + CASE WHEN ST_Length(geometry) > 20000 THEN brunnel ELSE '' END AS brunnel, + network, route_1, route_2, route_3, route_4, route_5, route_6, z_order + FROM osm_transportation_name_linestring_gen2 + ) osm_transportation_name_linestring_gen3_pre_merge WHERE ( full_update IS TRUE OR EXISTS ( SELECT NULL FROM transportation_name.name_changes_gen WHERE transportation_name.name_changes_gen.is_old IS FALSE AND - transportation_name.name_changes_gen.id = osm_transportation_name_linestring_gen2.id + transportation_name.name_changes_gen.id = osm_transportation_name_linestring_gen3_pre_merge.id ) ) AND ( - (highway = 'motorway' OR highway = 'construction' AND subclass = 'motorway') AND - ST_Length(geometry) > 20000 - ) ON CONFLICT (id) DO UPDATE SET geometry = excluded.geometry, tags = excluded.tags, ref = excluded.ref, + (highway = 'motorway' OR highway = 'construction' AND subclass = 'motorway') + ) + GROUP BY tags, ref, highway, subclass, brunnel, network, route_1, route_2, route_3, route_4, route_5, route_6, z_order + ON CONFLICT (id) DO UPDATE SET geometry = excluded.geometry, tags = excluded.tags, ref = excluded.ref, highway = excluded.highway, subclass = excluded.subclass, brunnel = excluded.brunnel, network = excluded.network, route_1 = excluded.route_1, route_2 = excluded.route_2, route_3 = excluded.route_3, route_4 = excluded.route_4,