Merge remote-tracking branch 'github/master' into merge-gh-2025

# Conflicts:
#	layers/boundary/mapping.yaml
#	layers/mountain_peak/style.json
#	layers/place/style.json
#	layers/poi/poi.yaml
This commit is contained in:
2025-06-10 21:05:25 +02:00
84 changed files with 1714 additions and 874 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 772 KiB

After

Width:  |  Height:  |  Size: 865 KiB

View File

@@ -102,10 +102,6 @@ name_de_field: &name_de
name: name_de
key: name:de
type: string
short_name_field: &short_name
key: short_name
name: short_name
type: string
tunnel_field: &tunnel
key: tunnel
name: is_tunnel
@@ -236,7 +232,6 @@ tables:
- *name_de
- name: tags
type: hstore_tags
- *short_name
- *tunnel
- *bridge
- *ramp
@@ -316,12 +311,10 @@ tables:
- *name_de
- name: tags
type: hstore_tags
- *short_name
- *tunnel
- *bridge
- *ramp
- *ford
- *oneway
- *area
- *service
- *usage
@@ -355,7 +348,6 @@ tables:
- *name_de
- name: tags
type: hstore_tags
- *short_name
- *tunnel
- *bridge
- *ramp
@@ -394,12 +386,10 @@ tables:
- *name_de
- name: tags
type: hstore_tags
- *short_name
- *tunnel
- *bridge
- *ramp
- *ford
- *oneway
- *area
- *service
- *usage
@@ -493,6 +483,9 @@ tables:
- name: colour
key: colour
type: string
- name: ref_colour
key: ref:colour
type: string
mapping:
route:
- road

View File

@@ -17,7 +17,9 @@ $$
'us-interstate', 'us-highway', 'us-state',
'ca-transcanada', 'ca-provincial-arterial', 'ca-provincial',
'gb-motorway', 'gb-trunk', 'gb-primary',
'ie-motorway', 'ie-national', 'ie-regional'
'ie-motorway', 'ie-national', 'ie-regional',
'e-road',
'a-road'
);
END
$$;
@@ -29,6 +31,27 @@ $$
-- Canada
'ca-transcanada', 'ca-provincial-arterial',
-- United States
'us-interstate');
'us-interstate', 'us-highway',
-- UK
'gb-motorway', 'gb-trunk',
-- Ireland
'ie-motorway', 'ie-national',
-- Europe
'e-road',
-- Asia
'a-road'
);
$$ LANGUAGE sql IMMUTABLE
PARALLEL SAFE;
CREATE OR REPLACE FUNCTION create_route_hstore(network TEXT, ref TEXT, name TEXT, colour TEXT, ref_colour TEXT)
RETURNS hstore AS $$
SELECT CASE
WHEN network = '' THEN hstore('')
ELSE hstore(
ARRAY['network', 'ref', 'name', 'colour'],
ARRAY[network, NULLIF(ref, ''), NULLIF(name, ''), COALESCE(NULLIF(colour, ''), NULLIF(ref_colour, ''))]
)
END;
$$ LANGUAGE sql IMMUTABLE
PARALLEL SAFE;

View File

@@ -4529,37 +4529,21 @@
"all",
[
"==",
[
"geometry-type"
],
"$type",
"LineString"
],
[
"all",
[
"match",
[
"get",
"brunnel"
],
[
"bridge",
"tunnel"
],
false,
true
"!in",
"brunnel",
"bridge",
"tunnel"
],
[
"match",
[
"get",
"class"
],
[
"minor"
],
true,
false
"in",
"class",
"minor"
]
]
],
@@ -4633,37 +4617,21 @@
"all",
[
"==",
[
"geometry-type"
],
"$type",
"LineString"
],
[
"all",
[
"match",
[
"get",
"brunnel"
],
[
"bridge",
"tunnel"
],
false,
true
"!in",
"brunnel",
"bridge",
"tunnel"
],
[
"match",
[
"get",
"class"
],
[
"minor_construction"
],
true,
false
"in",
"class",
"minor_construction"
]
]
],
@@ -5607,7 +5575,7 @@
"stops": [
[
8,
" #787878"
"#787878"
],
[
14,
@@ -7834,4 +7802,4 @@
"order": 178
}
]
}
}

View File

@@ -62,7 +62,7 @@ SELECT osm_id,
NULLIF(service, '') AS service,
access,
CASE WHEN toll = TRUE THEN 1 END AS toll,
CASE WHEN highway NOT IN ('', 'motorway') AND expressway = TRUE THEN 1 END AS expressway,
CASE WHEN highway NOT IN ('', 'motorway') AND NOT is_ramp AND expressway = TRUE THEN 1 END AS expressway,
NULLIF(layer, 0) AS layer,
"level",
CASE WHEN indoor = TRUE THEN 1 END AS indoor,
@@ -372,7 +372,7 @@ FROM (
hl.z_order
FROM osm_highway_linestring hl
LEFT OUTER JOIN osm_transportation_name_network n ON hl.osm_id = n.osm_id
WHERE NOT is_area
WHERE zoom_level > 11 AND NOT is_area
AND
CASE WHEN zoom_level = 12 THEN
CASE WHEN transportation_filter_z12(hl.highway, hl.construction) THEN TRUE
@@ -483,7 +483,7 @@ FROM (
is_ford,
NULL::boolean AS expressway,
is_ramp,
is_oneway,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
@@ -518,7 +518,7 @@ FROM (
is_ford,
NULL::boolean AS expressway,
is_ramp,
is_oneway,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
@@ -553,7 +553,7 @@ FROM (
is_ford,
NULL::boolean AS expressway,
is_ramp,
is_oneway,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
@@ -589,7 +589,7 @@ FROM (
is_ford,
NULL::boolean AS expressway,
is_ramp,
is_oneway,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
@@ -625,7 +625,7 @@ FROM (
is_ford,
NULL::boolean AS expressway,
is_ramp,
is_oneway,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
@@ -659,7 +659,7 @@ FROM (
is_ford,
NULL::boolean AS expressway,
is_ramp,
is_oneway,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
@@ -692,7 +692,7 @@ FROM (
is_ford,
NULL::boolean AS expressway,
is_ramp,
is_oneway,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
@@ -725,7 +725,7 @@ FROM (
is_ford,
NULL::boolean AS expressway,
is_ramp,
is_oneway,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
@@ -758,7 +758,7 @@ FROM (
is_ford,
NULL::boolean AS expressway,
is_ramp,
is_oneway,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
@@ -791,7 +791,7 @@ FROM (
is_ford,
NULL::boolean AS expressway,
is_ramp,
is_oneway,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
@@ -824,7 +824,7 @@ FROM (
is_ford,
NULL::boolean AS expressway,
is_ramp,
is_oneway,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
@@ -857,7 +857,7 @@ FROM (
is_ford,
NULL::boolean AS expressway,
is_ramp,
is_oneway,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
@@ -890,7 +890,7 @@ FROM (
is_ford,
NULL::boolean AS expressway,
is_ramp,
is_oneway,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
@@ -923,7 +923,7 @@ FROM (
is_ford,
NULL::boolean AS expressway,
is_ramp,
is_oneway,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
@@ -956,7 +956,7 @@ FROM (
is_ford,
NULL::boolean AS expressway,
is_ramp,
is_oneway,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
@@ -990,7 +990,7 @@ FROM (
is_ford,
NULL::boolean AS expressway,
is_ramp,
is_oneway,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,

View File

@@ -48,6 +48,7 @@ WHERE length(ref) > 1
CREATE OR REPLACE FUNCTION osm_route_member_network_type(network text, ref text) RETURNS route_network_type AS
$$
SELECT CASE
-- https://wiki.openstreetmap.org/wiki/United_States_roads_tagging
WHEN network = 'US:I' THEN 'us-interstate'::route_network_type
WHEN network = 'US:US' THEN 'us-highway'::route_network_type
WHEN network LIKE 'US:__' THEN 'us-state'::route_network_type
@@ -58,7 +59,7 @@ SELECT CASE
CASE
WHEN ref LIKE '4__' THEN 'ca-provincial-arterial'::route_network_type
WHEN ref = 'QEW' THEN 'ca-provincial-arterial'::route_network_type
ELSE 'ca-provincial-arterial'::route_network_type
ELSE 'ca-provincial'::route_network_type
END
WHEN network = 'CA:MB:PTH' AND ref = '75' THEN 'ca-provincial-arterial'::route_network_type
WHEN network = 'CA:AB:primary' AND ref IN ('2','3','4') THEN 'ca-provincial-arterial'::route_network_type
@@ -85,6 +86,7 @@ CREATE TABLE IF NOT EXISTS transportation_route_member_coalesced
name varchar,
osmc_symbol varchar,
colour varchar,
ref_colour varchar,
network_type route_network_type,
concurrency_index integer,
rank integer,
@@ -104,33 +106,6 @@ BEGIN
USING transportation_name.network_changes c
WHERE c.is_old IS TRUE AND transportation_route_member_coalesced.member = c.osm_id;
-- Create GBR/IRE relations (so we can use it in the same way as other relations)
-- etldoc: gbr_route_members_view -> transportation_route_member_coalesced
INSERT INTO transportation_route_member_coalesced (member, network, ref, network_type, concurrency_index, osm_id)
SELECT member, network, ref, osm_route_member_network_type(network, ref) AS network_type,
1 AS concurrency_index, 0 AS osm_id
FROM gbr_route_members_view
WHERE full_update OR EXISTS(
SELECT NULL
FROM transportation_name.network_changes c
WHERE c.is_old IS FALSE AND c.osm_id = gbr_route_members_view.member
)
GROUP BY member, network, ref
ON CONFLICT (member, network, ref) DO NOTHING;
-- etldoc: ire_route_members_view -> transportation_route_member_coalesced
INSERT INTO transportation_route_member_coalesced (member, network, ref, network_type, concurrency_index, osm_id)
SELECT member, network, ref, osm_route_member_network_type(network, ref) AS network_type,
1 AS concurrency_index, 0 AS osm_id
FROM ire_route_members_view
WHERE full_update OR EXISTS(
SELECT NULL
FROM transportation_name.network_changes c
WHERE c.is_old IS FALSE AND c.osm_id = ire_route_members_view.member
)
GROUP BY member, network, ref
ON CONFLICT (member, network, ref) DO NOTHING;
-- etldoc: osm_route_member -> transportation_route_member_coalesced
INSERT INTO transportation_route_member_coalesced
SELECT
@@ -147,33 +122,40 @@ BEGIN
END AS rank
FROM (
-- etldoc: osm_route_member -> osm_route_member
-- etldoc: gbr_route_members_view -> osm_route_member
-- etldoc: ire_route_members_view -> osm_route_member
-- see http://wiki.openstreetmap.org/wiki/Relation:route#Road_routes
SELECT DISTINCT ON (member, network, ref)
member,
network,
ref,
SELECT DISTINCT ON (member, COALESCE(rel.network, ''), COALESCE(rel.ref, ''))
rel.member,
COALESCE(NULLIF(rel.network,''), gb_way.network, ir_way.network, '') AS network,
COALESCE(rel.ref, '') AS ref,
osm_id,
role,
type,
name,
osmc_symbol,
colour
FROM osm_route_member
colour,
ref_colour
FROM osm_route_member rel
LEFT JOIN gbr_route_members_view gb_way ON (gb_way.member=rel.member)
LEFT JOIN ire_route_members_view ir_way ON (ir_way.member=rel.member)
WHERE full_update OR EXISTS(
SELECT NULL
FROM transportation_name.network_changes c
WHERE c.is_old IS FALSE AND c.osm_id = osm_route_member.member
WHERE c.is_old IS FALSE AND c.osm_id = rel.member
)
) osm_route_member_filtered
ON CONFLICT (member, network, ref) DO UPDATE SET osm_id = EXCLUDED.osm_id, role = EXCLUDED.role,
type = EXCLUDED.type, name = EXCLUDED.name,
osmc_symbol = EXCLUDED.osmc_symbol, colour = EXCLUDED.colour,
osmc_symbol = EXCLUDED.osmc_symbol, colour = EXCLUDED.colour, ref_colour = EXCLUDED.ref_colour,
concurrency_index = EXCLUDED.concurrency_index,
rank = EXCLUDED.rank;
END;
$$ LANGUAGE plpgsql;
-- Indexes which can be utilized during full-update for queries originating from update_osm_route_member() function
CREATE INDEX IF NOT EXISTS osm_route_member_member_network_ref_idx ON osm_route_member (member, network, ref);
CREATE INDEX IF NOT EXISTS osm_route_member_member_network_ref_idx
ON osm_route_member (member, COALESCE(network, ''), COALESCE(ref, ''));
-- Analyze created index
ANALYZE osm_route_member;

View File

@@ -22,7 +22,7 @@ SELECT
ST_Length(g) *
COS(RADIANS(ST_Y(ST_Centroid(ST_Transform(g, 4326))))) *
POW(2, zoom_level) / 20131560 > 0.02
$$ LANGUAGE SQL IMMUTABLE LEAKPROOF
$$ LANGUAGE SQL IMMUTABLE
PARALLEL SAFE;
-- Determine whether a segment is long enough to have layer attributes
@@ -39,7 +39,24 @@ SELECT
COS(RADIANS(ST_Y(ST_Centroid(ST_Transform(g, 4326))))) *
POW(2, zoom_level) / 20131560 > 0.02
THEN layer END
$$ LANGUAGE SQL IMMUTABLE LEAKPROOF
$$ LANGUAGE SQL IMMUTABLE
PARALLEL SAFE;
-- Determine whether a segment is long enough to have an attribute
CREATE OR REPLACE FUNCTION visible_text(g geometry, attr text, zoom_level integer)
RETURNS text AS
$$
SELECT
CASE WHEN
-- Width of a tile in meters (111,842 is the length of one degree of latitude at the equator in meters)
-- 111,842 * 180 / 2^zoom_level
-- = 20131560 / POW(2, zoom_level)
-- Drop brunnel if length of way < 2% of tile width (less than 3 pixels)
ST_Length(g) *
COS(RADIANS(ST_Y(ST_Centroid(ST_Transform(g, 4326))))) *
POW(2, zoom_level) / 20131560 > 0.02
THEN attr END
$$ LANGUAGE SQL IMMUTABLE
PARALLEL SAFE;
-- Instead of using relations to find out the road names we
@@ -49,7 +66,8 @@ $$ LANGUAGE SQL IMMUTABLE LEAKPROOF
-- etldoc: osm_highway_linestring -> osm_transportation_name_network
-- etldoc: transportation_route_member_coalesced -> osm_transportation_name_network
CREATE TABLE IF NOT EXISTS osm_transportation_name_network AS
DROP TABLE IF EXISTS osm_transportation_name_network;
CREATE TABLE osm_transportation_name_network AS
SELECT
geometry,
osm_id,
@@ -84,12 +102,12 @@ FROM (
CASE WHEN highway IN ('footway', 'steps') THEN layer END AS layer,
CASE WHEN highway IN ('footway', 'steps') THEN level END AS level,
CASE WHEN highway IN ('footway', 'steps') THEN indoor END AS indoor,
NULLIF(rm1.network, '') || '=' || COALESCE(rm1.ref, '') AS route_1,
NULLIF(rm2.network, '') || '=' || COALESCE(rm2.ref, '') AS route_2,
NULLIF(rm3.network, '') || '=' || COALESCE(rm3.ref, '') AS route_3,
NULLIF(rm4.network, '') || '=' || COALESCE(rm4.ref, '') AS route_4,
NULLIF(rm5.network, '') || '=' || COALESCE(rm5.ref, '') AS route_5,
NULLIF(rm6.network, '') || '=' || COALESCE(rm6.ref, '') AS route_6,
create_route_hstore(rm1.network, rm1.ref, rm1.name, rm1.colour, rm1.ref_colour) AS route_1,
create_route_hstore(rm2.network, rm2.ref, rm2.name, rm2.colour, rm2.ref_colour) AS route_2,
create_route_hstore(rm3.network, rm3.ref, rm3.name, rm3.colour, rm3.ref_colour) AS route_3,
create_route_hstore(rm4.network, rm4.ref, rm4.name, rm4.colour, rm4.ref_colour) AS route_4,
create_route_hstore(rm5.network, rm5.ref, rm5.name, rm5.colour, rm5.ref_colour) AS route_5,
create_route_hstore(rm6.network, rm6.ref, rm6.name, rm6.colour, rm6.ref_colour) AS route_6,
hl.z_order,
LEAST(rm1.rank, rm2.rank, rm3.rank, rm4.rank, rm5.rank, rm6.rank) AS route_rank
FROM osm_highway_linestring hl
@@ -126,6 +144,8 @@ CREATE TABLE IF NOT EXISTS osm_transportation_merge_linestring_gen_z11(
id SERIAL,
osm_id bigint,
source_ids bigint[],
new_source_ids bigint[],
old_source_ids bigint[],
highway character varying,
network character varying,
construction character varying,
@@ -144,12 +164,23 @@ CREATE TABLE IF NOT EXISTS osm_transportation_merge_linestring_gen_z11(
layer integer
);
ALTER TABLE osm_transportation_merge_linestring_gen_z11 ADD COLUMN IF NOT EXISTS source_ids bigint[];
ALTER TABLE osm_transportation_merge_linestring_gen_z11 ADD COLUMN IF NOT EXISTS new_source_ids BIGINT[];
ALTER TABLE osm_transportation_merge_linestring_gen_z11 ADD COLUMN IF NOT EXISTS old_source_ids BIGINT[];
CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen_z11_n_source_ids_not_null_idx
ON osm_transportation_merge_linestring_gen_z11 ((new_source_ids IS NOT NULL));
CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen_z11_o_source_ids_not_null_idx
ON osm_transportation_merge_linestring_gen_z11 ((old_source_ids IS NOT NULL));
-- Create osm_transportation_merge_linestring_gen_z10 as a copy of osm_transportation_merge_linestring_gen_z11 but
-- drop the "source_ids" column. This can be done because z10 and z9 tables are only simplified and not merged,
-- therefore relations to sources are direct via the id column.
CREATE TABLE IF NOT EXISTS osm_transportation_merge_linestring_gen_z10
(LIKE osm_transportation_merge_linestring_gen_z11);
ALTER TABLE osm_transportation_merge_linestring_gen_z10 DROP COLUMN IF EXISTS source_ids;
ALTER TABLE osm_transportation_merge_linestring_gen_z10 DROP COLUMN IF EXISTS new_source_ids;
ALTER TABLE osm_transportation_merge_linestring_gen_z10 DROP COLUMN IF EXISTS old_source_ids;
-- Create osm_transportation_merge_linestring_gen_z9 as a copy of osm_transportation_merge_linestring_gen_z10
CREATE TABLE IF NOT EXISTS osm_transportation_merge_linestring_gen_z9
@@ -445,10 +476,12 @@ CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen_z9_geometry_i
-- etldoc: osm_transportation_merge_linestring_gen_z9 -> osm_transportation_merge_linestring_gen_z8
CREATE TABLE IF NOT EXISTS osm_transportation_merge_linestring_gen_z8(
geometry geometry('LineString'),
geometry geometry,
id SERIAL,
osm_id bigint,
source_ids int[],
new_source_ids bigint[],
old_source_ids bigint[],
highway character varying,
network character varying,
construction character varying,
@@ -459,12 +492,23 @@ CREATE TABLE IF NOT EXISTS osm_transportation_merge_linestring_gen_z8(
z_order integer
);
ALTER TABLE osm_transportation_merge_linestring_gen_z8 ADD COLUMN IF NOT EXISTS source_ids bigint[];
ALTER TABLE osm_transportation_merge_linestring_gen_z8 ADD COLUMN IF NOT EXISTS new_source_ids bigint[];
ALTER TABLE osm_transportation_merge_linestring_gen_z8 ADD COLUMN IF NOT EXISTS old_source_ids bigint[];
CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen_z8_n_source_ids_not_null_idx
ON osm_transportation_merge_linestring_gen_z8 ((new_source_ids IS NOT NULL));
CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen_z8_o_source_ids_not_null_idx
ON osm_transportation_merge_linestring_gen_z8 ((old_source_ids IS NOT NULL));
-- Create osm_transportation_merge_linestring_gen_z7 as a copy of osm_transportation_merge_linestring_gen_z8 but
-- drop the "source_ids" column. This can be done because z7 to z5 tables are only simplified and not merged,
-- therefore relations to sources are direct via the id column.
CREATE TABLE IF NOT EXISTS osm_transportation_merge_linestring_gen_z7
(LIKE osm_transportation_merge_linestring_gen_z8);
ALTER TABLE osm_transportation_merge_linestring_gen_z7 DROP COLUMN IF EXISTS source_ids;
ALTER TABLE osm_transportation_merge_linestring_gen_z7 DROP COLUMN IF EXISTS new_source_ids;
ALTER TABLE osm_transportation_merge_linestring_gen_z7 DROP COLUMN IF EXISTS old_source_ids;
-- Create osm_transportation_merge_linestring_gen_z6 as a copy of osm_transportation_merge_linestring_gen_z7
CREATE TABLE IF NOT EXISTS osm_transportation_merge_linestring_gen_z6
@@ -662,25 +706,68 @@ BEGIN
-- etldoc: osm_transportation_merge_linestring_gen_z8 -> osm_transportation_merge_linestring_gen_z7
INSERT INTO osm_transportation_merge_linestring_gen_z7
SELECT ST_Simplify(geometry, ZRes(9)) AS geometry,
id,
osm_id,
highway,
network,
construction,
-- Remove bridge/tunnel/ford attributes from short sections of road so they can be merged
visible_brunnel(geometry, is_bridge, 8) AS is_bridge,
visible_brunnel(geometry, is_tunnel, 8) AS is_tunnel,
visible_brunnel(geometry, is_ford, 8) AS is_ford,
expressway,
z_order
FROM osm_transportation_merge_linestring_gen_z8
WITH roads_z8 AS (
SELECT id,
osm_id,
ST_SnapToGrid(
ST_Node(
ST_Collect(
ST_Simplify(geometry, ZRes(9))
)
), ZRes(9)
) AS geometry,
highway,
NULLIF(network, '') as network,
construction,
is_bridge,
is_tunnel,
is_ford,
expressway,
z_order
FROM osm_transportation_merge_linestring_gen_z8
GROUP BY id, osm_id, highway, construction, network, is_bridge, is_tunnel, is_ford, expressway, z_order
),
roads_z8_merge AS (
SELECT id,
osm_id,
ST_LineMerge(
ST_Union(geometry)
) AS geometry,
highway,
network,
construction,
is_bridge,
is_tunnel,
is_ford,
expressway,
z_order
FROM roads_z8
GROUP BY id, osm_id, highway, network, construction, is_bridge, is_tunnel, is_ford, expressway, z_order
)
SELECT CASE
WHEN ST_StartPoint(geometry) = ST_EndPoint(geometry)
THEN ST_RemovePoint(geometry, ST_NPoints(geometry) - 1)
ELSE geometry
END AS geometry,
id,
osm_id,
highway,
network,
construction,
-- Remove bridge/tunnel/ford attributes from short sections of road so they can be merged
visible_brunnel(geometry, is_bridge, 8) AS is_bridge,
visible_brunnel(geometry, is_tunnel, 8) AS is_tunnel,
visible_brunnel(geometry, is_ford, 8) AS is_ford,
expressway,
z_order
FROM roads_z8_merge
-- Current view: motorway/trunk/primary
WHERE
(full_update IS TRUE OR EXISTS(
SELECT NULL FROM transportation.changes_z4_z5_z6_z7
WHERE transportation.changes_z4_z5_z6_z7.is_old IS FALSE AND
transportation.changes_z4_z5_z6_z7.id = osm_transportation_merge_linestring_gen_z8.id
transportation.changes_z4_z5_z6_z7.id = roads_z8_merge.id
)) AND
(ST_Length(geometry) > 50)
ON CONFLICT (id) DO UPDATE SET osm_id = excluded.osm_id, highway = excluded.highway, network = excluded.network,
@@ -803,7 +890,12 @@ BEGIN
WHERE transportation.changes_z4_z5_z6_z7.is_old IS FALSE AND
transportation.changes_z4_z5_z6_z7.id = osm_transportation_merge_linestring_gen_z5.id
)) AND
osm_national_network(network) AND
-- All motorways without network (e.g. EU, Asia, South America)
((highway = 'motorway' OR construction = 'motorway') AND (network is NULL or network = '')
) OR
-- All roads in network included in osm_national_network except gb-trunk and us-highway
( (osm_national_network(network) AND network NOT IN ('gb-trunk', 'us-highway')
)) AND
-- Current view: national-importance motorways and trunks
ST_Length(geometry) > 1000
ON CONFLICT (id) DO UPDATE SET osm_id = excluded.osm_id, highway = excluded.highway, network = excluded.network,
@@ -857,6 +949,12 @@ CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen_z4_geometry_i
-- osm_highway_linestring_gen_z11 -> osm_transportation_merge_linestring_gen_z11
-- osm_transportation_merge_linestring_gen_z11 -> osm_transportation_merge_linestring_gen_z10
-- osm_transportation_merge_linestring_gen_z11 -> osm_transportation_merge_linestring_gen_z9
CREATE OR REPLACE AGGREGATE array_cat_agg(anycompatiblearray) (
SFUNC=array_cat,
STYPE=anycompatiblearray,
INITCOND = '{}'
);
CREATE TABLE IF NOT EXISTS transportation.changes_z11
(
is_old boolean NULL,
@@ -958,7 +1056,8 @@ BEGIN
-- Create a table containing all LineStrings which should be merged
CREATE TEMPORARY TABLE linestrings_to_merge AS
-- Add all Source-LineStrings affected by this update
SELECT osm_highway_linestring_gen_z11.osm_id, NULL::INTEGER AS id, geometry, highway, network, construction,
SELECT osm_highway_linestring_gen_z11.osm_id, NULL::INTEGER AS id, NULL::BIGINT[] AS source_ids,
geometry, highway, network, construction,
visible_brunnel(geometry, is_bridge, 11) AS is_bridge,
visible_brunnel(geometry, is_tunnel, 11) AS is_tunnel,
visible_brunnel(geometry, is_ford, 11) AS is_ford,
@@ -981,22 +1080,22 @@ BEGIN
-- Drop temporary tables early to save resources
DROP TABLE affected_merged_linestrings;
-- Create index on geometry column and analyze the created table to speed up subsequent queries
CREATE INDEX ON linestrings_to_merge USING GIST (geometry);
-- Analyze the created table to speed up subsequent queries
ANALYZE linestrings_to_merge;
-- Add all Merged-LineStrings intersecting with Source-LineStrings affected by this update
INSERT INTO linestrings_to_merge
SELECT s.source_id AS osm_id, m.id,
geometry, highway, network, construction,
visible_brunnel(geometry, is_bridge, 11) AS is_bridge,
visible_brunnel(geometry, is_tunnel, 11) AS is_tunnel,
visible_brunnel(geometry, is_ford, 11) AS is_ford,
expressway, bicycle, foot, horse, mtb_scale, sac_scale, access, toll,
visible_layer(geometry, layer, 11) AS layer, z_order
FROM osm_transportation_merge_linestring_gen_z11 m
JOIN osm_transportation_merge_linestring_gen_z11_source_ids s ON (m.id = s.id)
WHERE EXISTS(SELECT NULL FROM linestrings_to_merge WHERE ST_Intersects(linestrings_to_merge.geometry, m.geometry));
SELECT NULL::BIGINT AS osm_id, m.id,
ARRAY(
SELECT s.source_id FROM osm_transportation_merge_linestring_gen_z11_source_ids s WHERE s.id = m.id
)::BIGINT[] AS source_ids, m.geometry, m.highway, m.network, m.construction,
visible_brunnel(m.geometry, m.is_bridge, 11) AS is_bridge,
visible_brunnel(m.geometry, m.is_tunnel, 11) AS is_tunnel,
visible_brunnel(m.geometry, m.is_ford, 11) AS is_ford,
m.expressway, m.bicycle, m.foot, m.horse, m.mtb_scale, m.sac_scale, m.access, m.toll,
visible_layer(m.geometry, m.layer, 11) AS layer, m.z_order
FROM linestrings_to_merge
JOIN osm_transportation_merge_linestring_gen_z11 m ON (ST_Intersects(linestrings_to_merge.geometry, m.geometry));
-- Analyze the created table to speed up subsequent queries
ANALYZE linestrings_to_merge;
@@ -1039,16 +1138,12 @@ BEGIN
CREATE INDEX ON clustered_linestrings_to_merge (cluster_group, cluster);
ANALYZE clustered_linestrings_to_merge;
-- Create temporary Merged-LineString to Source-LineStrings-ID column to store relations before they have been
-- intersected
ALTER TABLE osm_transportation_merge_linestring_gen_z11 ADD COLUMN IF NOT EXISTS source_ids bigint[];
WITH inserted_linestrings AS (
-- Merge LineStrings of each cluster and insert them
INSERT INTO osm_transportation_merge_linestring_gen_z11(geometry, source_ids, highway, network, construction,
is_bridge, is_tunnel, is_ford, expressway, z_order,
bicycle, foot, horse, mtb_scale, sac_scale, access,
toll, layer)
INSERT INTO osm_transportation_merge_linestring_gen_z11(geometry, new_source_ids, old_source_ids, highway,
network, construction, is_bridge, is_tunnel, is_ford,
expressway, z_order, bicycle, foot, horse, mtb_scale,
sac_scale, access, toll, layer)
SELECT (ST_Dump(ST_LineMerge(ST_Union(geometry)))).geom AS geometry,
-- We use St_Union instead of St_Collect to ensure no overlapping points exist within the geometries to
-- merge. https://postgis.net/docs/ST_Union.html
@@ -1057,7 +1152,8 @@ BEGIN
-- https://postgis.net/docs/ST_LineMerge.html
-- In order to not end up with a mixture of LineStrings and MultiLineStrings we dump eventual
-- MultiLineStrings via ST_Dump. https://postgis.net/docs/ST_Dump.html
array_agg(osm_id) AS source_ids,
coalesce( array_agg(osm_id) FILTER (WHERE osm_id IS NOT NULL), '{}' )::BIGINT[] AS new_source_ids,
array_cat_agg(source_ids)::BIGINT[] AS old_source_ids,
highway,
network,
construction,
@@ -1077,7 +1173,7 @@ BEGIN
FROM clustered_linestrings_to_merge
GROUP BY cluster_group, cluster, highway, network, construction, is_bridge, is_tunnel, is_ford, expressway,
bicycle, foot, horse, mtb_scale, sac_scale, access, toll, layer
RETURNING id, source_ids, geometry
RETURNING id, new_source_ids, old_source_ids, geometry
)
-- Store OSM-IDs of Source-LineStrings by intersecting Merged-LineStrings with their sources.
-- This is required because ST_LineMerge only merges across singular intersections and groups its output into a
@@ -1085,8 +1181,14 @@ BEGIN
INSERT INTO osm_transportation_merge_linestring_gen_z11_source_ids (id, source_id)
SELECT m.id, source_id
FROM (
SELECT id, unnest(source_ids) AS source_id, geometry
SELECT id, source_id, geometry
FROM inserted_linestrings
CROSS JOIN LATERAL (
SELECT DISTINCT all_source_ids.source_id
FROM unnest(
array_cat(inserted_linestrings.new_source_ids, inserted_linestrings.old_source_ids)
) AS all_source_ids(source_id)
) source_ids
) m
JOIN osm_highway_linestring_gen_z11 s ON (m.source_id = s.osm_id)
WHERE ST_Intersects(s.geometry, m.geometry)
@@ -1095,8 +1197,9 @@ BEGIN
-- Cleanup remaining table
DROP TABLE clustered_linestrings_to_merge;
-- Drop temporary Merged-LineString to Source-LineStrings-ID column
ALTER TABLE osm_transportation_merge_linestring_gen_z11 DROP COLUMN IF EXISTS source_ids;
-- Restore temporary Merged-LineString to Source-LineStrings-ID columns
UPDATE osm_transportation_merge_linestring_gen_z11 SET new_source_ids = NULL WHERE new_source_ids IS NOT NULL;
UPDATE osm_transportation_merge_linestring_gen_z11 SET old_source_ids = NULL WHERE old_source_ids IS NOT NULL;
-- noinspection SqlWithoutWhere
DELETE FROM transportation.changes_z11;
@@ -1246,7 +1349,7 @@ BEGIN
-- Create a table containing all LineStrings which should be merged
CREATE TEMPORARY TABLE linestrings_to_merge AS
-- Add all Source-LineStrings affected by this update
SELECT id AS source_id, NULL::int AS id, geometry, highway, network, construction,
SELECT id AS source_id, NULL::INT AS id, NULL::INT[] AS source_ids, geometry, highway, network, construction,
visible_brunnel(geometry, is_bridge, 9) AS is_bridge,
visible_brunnel(geometry, is_tunnel, 9) AS is_tunnel,
visible_brunnel(geometry, is_ford, 9) AS is_ford, expressway, z_order
@@ -1260,31 +1363,32 @@ BEGIN
ORDER BY source_id
) affected_source_linestrings
JOIN osm_transportation_merge_linestring_gen_z9 ON (
affected_source_linestrings.source_id = osm_transportation_merge_linestring_gen_z9.id AND
(
highway IN ('motorway', 'trunk', 'primary') OR
construction IN ('motorway', 'trunk', 'primary')
) AND
ST_IsValid(geometry) AND
access IS NULL
);
affected_source_linestrings.source_id = osm_transportation_merge_linestring_gen_z9.id
)
WHERE (
highway IN ('motorway', 'trunk', 'primary') OR
construction IN ('motorway', 'trunk', 'primary')
) AND
ST_IsValid(geometry) AND
access IS NULL;
-- Drop temporary tables early to save resources
DROP TABLE affected_merged_linestrings;
-- Create index on geometry column and analyze the created table to speed up subsequent queries
CREATE INDEX ON linestrings_to_merge USING GIST (geometry);
-- Analyze the created table to speed up subsequent queries
ANALYZE linestrings_to_merge;
-- Add all Merged-LineStrings intersecting with Source-LineStrings affected by this update
INSERT INTO linestrings_to_merge
SELECT s.source_id, m.id, geometry, highway, network, construction,
visible_brunnel(geometry, is_bridge, 9) AS is_bridge,
visible_brunnel(geometry, is_tunnel, 9) AS is_tunnel,
visible_brunnel(geometry, is_ford, 9) AS is_ford, expressway, z_order
FROM osm_transportation_merge_linestring_gen_z8 m
JOIN osm_transportation_merge_linestring_gen_z8_source_ids s ON (m.id = s.id)
WHERE EXISTS(SELECT NULL FROM linestrings_to_merge WHERE ST_Intersects(linestrings_to_merge.geometry, m.geometry));
SELECT NULL::INT AS source_id, m.id,
ARRAY(
SELECT s.source_id FROM osm_transportation_merge_linestring_gen_z8_source_ids s WHERE s.id = m.id
)::INT[] AS source_ids, m.geometry, m.highway, m.network, m.construction,
visible_brunnel(m.geometry, m.is_bridge, 9) AS is_bridge,
visible_brunnel(m.geometry, m.is_tunnel, 9) AS is_tunnel,
visible_brunnel(m.geometry, m.is_ford, 9) AS is_ford, m.expressway, m.z_order
FROM linestrings_to_merge
JOIN osm_transportation_merge_linestring_gen_z8 m ON (ST_Intersects(linestrings_to_merge.geometry, m.geometry));
-- Analyze the created table to speed up subsequent queries
ANALYZE linestrings_to_merge;
@@ -1325,14 +1429,13 @@ BEGIN
CREATE INDEX ON clustered_linestrings_to_merge (cluster_group, cluster);
ANALYZE clustered_linestrings_to_merge;
-- Create temporary Merged-LineString to Source-LineStrings-ID column to store relations before they have been
-- Create temporary Merged-LineString to Source-LineStrings-ID columns to store relations before they have been
-- intersected
ALTER TABLE osm_transportation_merge_linestring_gen_z8 ADD COLUMN IF NOT EXISTS source_ids bigint[];
WITH inserted_linestrings AS (
-- Merge LineStrings of each cluster and insert them
INSERT INTO osm_transportation_merge_linestring_gen_z8(geometry, source_ids, highway, network, construction,
is_bridge, is_tunnel, is_ford, expressway, z_order)
INSERT INTO osm_transportation_merge_linestring_gen_z8(geometry, new_source_ids, old_source_ids, highway,
network, construction, is_bridge, is_tunnel, is_ford,
expressway, z_order)
SELECT (ST_Dump(ST_Simplify(ST_LineMerge(ST_Union(geometry)), ZRes(10)))).geom AS geometry,
-- We use St_Union instead of St_Collect to ensure no overlapping points exist within the geometries to
-- merge. https://postgis.net/docs/ST_Union.html
@@ -1341,7 +1444,8 @@ BEGIN
-- https://postgis.net/docs/ST_LineMerge.html
-- In order to not end up with a mixture of LineStrings and MultiLineStrings we dump eventual
-- MultiLineStrings via ST_Dump. https://postgis.net/docs/ST_Dump.html
array_agg(source_id) as source_ids,
coalesce( array_agg(source_id) FILTER (WHERE source_id IS NOT NULL), '{}' )::INT[] AS new_source_ids,
array_cat_agg(source_ids)::INT[] as old_source_ids,
highway,
network,
construction,
@@ -1352,7 +1456,7 @@ BEGIN
min(z_order) as z_order
FROM clustered_linestrings_to_merge
GROUP BY cluster_group, cluster, highway, network, construction, is_bridge, is_tunnel, is_ford, expressway
RETURNING id, source_ids, geometry
RETURNING id, new_source_ids, old_source_ids, geometry
)
-- Store OSM-IDs of Source-LineStrings by intersecting Merged-LineStrings with their sources. This required because
-- ST_LineMerge only merges across singular intersections and groups its output into a MultiLineString if
@@ -1360,8 +1464,14 @@ BEGIN
INSERT INTO osm_transportation_merge_linestring_gen_z8_source_ids (id, source_id)
SELECT m.id, m.source_id
FROM (
SELECT id, unnest(source_ids) AS source_id, geometry
SELECT id, source_id, geometry
FROM inserted_linestrings
CROSS JOIN LATERAL (
SELECT DISTINCT all_source_ids.source_id
FROM unnest(
array_cat(inserted_linestrings.new_source_ids, inserted_linestrings.old_source_ids)
) AS all_source_ids(source_id)
) source_ids
) m
JOIN osm_transportation_merge_linestring_gen_z9 s ON (m.source_id = s.id)
WHERE ST_Intersects(s.geometry, m.geometry)
@@ -1370,9 +1480,10 @@ BEGIN
-- Cleanup
DROP TABLE clustered_linestrings_to_merge;
-- Drop temporary Merged-LineString to Source-LineStrings-ID column
ALTER TABLE osm_transportation_merge_linestring_gen_z8 DROP COLUMN IF EXISTS source_ids;
-- Restore temporary Merged-LineString to Source-LineStrings-ID columns
UPDATE osm_transportation_merge_linestring_gen_z8 SET new_source_ids = NULL WHERE new_source_ids IS NOT NULL;
UPDATE osm_transportation_merge_linestring_gen_z8 SET old_source_ids = NULL WHERE old_source_ids IS NOT NULL;
-- noinspection SqlWithoutWhere
DELETE FROM transportation.changes_z9;
-- noinspection SqlWithoutWhere