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.
246 lines
8.3 KiB
PL/PgSQL
246 lines
8.3 KiB
PL/PgSQL
-- etldoc: layer_transportation_name[shape=record fillcolor=lightpink, style="rounded,filled",
|
|
-- etldoc: label="layer_transportation_name | <z6> z6 | <z7> z7 | <z8> z8 |<z9> z9 |<z10> z10 |<z11> z11 |<z12> z12|<z13> z13|<z14_> z14+" ] ;
|
|
|
|
CREATE OR REPLACE FUNCTION layer_transportation_name(bbox geometry, zoom_level integer)
|
|
RETURNS TABLE
|
|
(
|
|
geometry geometry,
|
|
name text,
|
|
name_en text,
|
|
name_de text,
|
|
tags hstore,
|
|
ref text,
|
|
ref_length int,
|
|
network text,
|
|
route_1 text,
|
|
route_2 text,
|
|
route_3 text,
|
|
route_4 text,
|
|
route_5 text,
|
|
route_6 text,
|
|
class text,
|
|
subclass text,
|
|
brunnel text,
|
|
layer int,
|
|
level int,
|
|
indoor int
|
|
)
|
|
AS
|
|
$$
|
|
SELECT geometry,
|
|
tags->'name' AS name,
|
|
COALESCE(tags->'name:en', tags->'name') AS name_en,
|
|
COALESCE(tags->'name:de', tags->'name', tags->'name:en') AS name_de,
|
|
tags,
|
|
ref,
|
|
NULLIF(LENGTH(ref), 0) AS ref_length,
|
|
CASE
|
|
WHEN network IS NOT NULL
|
|
THEN network::text
|
|
WHEN length(coalesce(ref, '')) > 0
|
|
THEN 'road'
|
|
END AS network,
|
|
route_1, route_2, route_3, route_4, route_5, route_6,
|
|
highway_class(highway, '', subclass) AS class,
|
|
CASE
|
|
WHEN highway IS NOT NULL AND highway_class(highway, '', subclass) = 'path'
|
|
THEN highway
|
|
ELSE subclass
|
|
END AS subclass,
|
|
brunnel,
|
|
NULLIF(layer, 0) AS layer,
|
|
"level",
|
|
CASE WHEN indoor = TRUE THEN 1 END AS indoor
|
|
FROM (
|
|
|
|
-- etldoc: osm_transportation_name_linestring_gen4 -> layer_transportation_name:z6
|
|
SELECT geometry,
|
|
tags,
|
|
ref,
|
|
highway,
|
|
subclass,
|
|
brunnel,
|
|
network,
|
|
route_1,
|
|
route_2,
|
|
route_3,
|
|
route_4,
|
|
route_5,
|
|
route_6,
|
|
z_order,
|
|
NULL::int AS layer,
|
|
NULL::int AS level,
|
|
NULL::boolean AS indoor
|
|
FROM osm_transportation_name_linestring_gen4
|
|
WHERE zoom_level = 6
|
|
UNION ALL
|
|
|
|
-- etldoc: osm_transportation_name_linestring_gen3 -> layer_transportation_name:z7
|
|
SELECT geometry,
|
|
tags,
|
|
ref,
|
|
highway,
|
|
subclass,
|
|
brunnel,
|
|
network,
|
|
route_1,
|
|
route_2,
|
|
route_3,
|
|
route_4,
|
|
route_5,
|
|
route_6,
|
|
z_order,
|
|
NULL::int AS layer,
|
|
NULL::int AS level,
|
|
NULL::boolean AS indoor
|
|
FROM osm_transportation_name_linestring_gen3
|
|
WHERE ST_Length(geometry) > 20000 AND zoom_level = 7
|
|
UNION ALL
|
|
|
|
-- etldoc: osm_transportation_name_linestring_gen2 -> layer_transportation_name:z8
|
|
SELECT geometry,
|
|
tags,
|
|
ref,
|
|
highway,
|
|
subclass,
|
|
brunnel,
|
|
network,
|
|
route_1,
|
|
route_2,
|
|
route_3,
|
|
route_4,
|
|
route_5,
|
|
route_6,
|
|
z_order,
|
|
NULL::int AS layer,
|
|
NULL::int AS level,
|
|
NULL::boolean AS indoor
|
|
FROM osm_transportation_name_linestring_gen2
|
|
WHERE ST_Length(geometry) > 14000 AND zoom_level = 8
|
|
UNION ALL
|
|
|
|
-- etldoc: osm_transportation_name_linestring_gen1 -> layer_transportation_name:z9
|
|
-- etldoc: osm_transportation_name_linestring_gen1 -> layer_transportation_name:z10
|
|
-- etldoc: osm_transportation_name_linestring_gen1 -> layer_transportation_name:z11
|
|
SELECT geometry,
|
|
tags,
|
|
ref,
|
|
highway,
|
|
subclass,
|
|
brunnel,
|
|
network,
|
|
route_1,
|
|
route_2,
|
|
route_3,
|
|
route_4,
|
|
route_5,
|
|
route_6,
|
|
z_order,
|
|
NULL::int AS layer,
|
|
NULL::int AS level,
|
|
NULL::boolean AS indoor
|
|
FROM osm_transportation_name_linestring_gen1
|
|
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
|
|
SELECT geometry,
|
|
"tags",
|
|
ref,
|
|
highway,
|
|
subclass,
|
|
brunnel,
|
|
network,
|
|
route_1, route_2, route_3, route_4, route_5, route_6,
|
|
z_order,
|
|
layer,
|
|
"level",
|
|
indoor
|
|
FROM osm_transportation_name_linestring
|
|
WHERE zoom_level = 12
|
|
AND LineLabel(zoom_level, COALESCE(tags->'name', ref), geometry)
|
|
AND NOT highway_is_link(highway)
|
|
AND
|
|
CASE WHEN highway_class(highway, NULL::text, NULL::text) NOT IN ('path', 'minor') THEN TRUE
|
|
WHEN highway IN ('aerialway', 'unclassified', 'residential', 'shipway') THEN TRUE
|
|
WHEN route_rank = 1 THEN TRUE END
|
|
|
|
UNION ALL
|
|
|
|
-- etldoc: osm_transportation_name_linestring -> layer_transportation_name:z13
|
|
SELECT geometry,
|
|
"tags",
|
|
ref,
|
|
highway,
|
|
subclass,
|
|
brunnel,
|
|
network,
|
|
route_1, route_2, route_3, route_4, route_5, route_6,
|
|
z_order,
|
|
layer,
|
|
"level",
|
|
indoor
|
|
FROM osm_transportation_name_linestring
|
|
WHERE zoom_level = 13
|
|
AND LineLabel(zoom_level, COALESCE(tags->'name', ref), geometry)
|
|
AND
|
|
CASE WHEN highway <> 'path' THEN TRUE
|
|
WHEN highway = 'path' AND (
|
|
tags->'name' <> ''
|
|
OR network IS NOT NULL
|
|
OR sac_scale <> ''
|
|
OR route_rank <= 2
|
|
) THEN TRUE
|
|
END
|
|
|
|
UNION ALL
|
|
|
|
-- etldoc: osm_transportation_name_linestring -> layer_transportation_name:z14_
|
|
SELECT geometry,
|
|
"tags",
|
|
ref,
|
|
highway,
|
|
subclass,
|
|
brunnel,
|
|
network,
|
|
route_1, route_2, route_3, route_4, route_5, route_6,
|
|
z_order,
|
|
layer,
|
|
"level",
|
|
indoor
|
|
FROM osm_transportation_name_linestring
|
|
WHERE zoom_level >= 14
|
|
UNION ALL
|
|
|
|
-- etldoc: osm_highway_point -> layer_transportation_name:z10
|
|
SELECT
|
|
p.geometry,
|
|
p.tags,
|
|
p.ref,
|
|
(
|
|
SELECT highest_highway(l.tags->'highway')
|
|
FROM osm_highway_linestring l
|
|
WHERE ST_Intersects(p.geometry,l.geometry)
|
|
) AS class,
|
|
'junction'::text AS subclass,
|
|
NULL AS brunnel,
|
|
NULL AS network,
|
|
NULL::text AS route_1,
|
|
NULL::text AS route_2,
|
|
NULL::text AS route_3,
|
|
NULL::text AS route_4,
|
|
NULL::text AS route_5,
|
|
NULL::text AS route_6,
|
|
z_order,
|
|
layer,
|
|
NULL::int AS level,
|
|
NULL::boolean AS indoor
|
|
FROM osm_highway_point p
|
|
WHERE highway = 'motorway_junction' AND zoom_level >= 10
|
|
) AS zoom_levels
|
|
WHERE geometry && bbox
|
|
ORDER BY z_order ASC;
|
|
$$ LANGUAGE SQL STABLE
|
|
-- STRICT
|
|
PARALLEL SAFE;
|