diff --git a/layers/transportation/class.sql b/layers/transportation/class.sql index b15196e..8545430 100644 --- a/layers/transportation/class.sql +++ b/layers/transportation/class.sql @@ -9,7 +9,7 @@ $$ LANGUAGE SQL IMMUTABLE STRICT; -- The classes for highways are derived from the classes used in ClearTables -- https://github.com/ClearTables/ClearTables/blob/master/transportation.lua -CREATE OR REPLACE FUNCTION highway_class(highway TEXT, public_transport TEXT) RETURNS TEXT AS $$ +CREATE OR REPLACE FUNCTION highway_class(highway TEXT, public_transport TEXT, construction TEXT) RETURNS TEXT AS $$ SELECT CASE WHEN highway IN ('motorway', 'motorway_link') THEN 'motorway' WHEN highway IN ('trunk', 'trunk_link') THEN 'trunk' @@ -18,7 +18,18 @@ CREATE OR REPLACE FUNCTION highway_class(highway TEXT, public_transport TEXT) RE WHEN highway IN ('tertiary', 'tertiary_link') THEN 'tertiary' WHEN highway IN ('unclassified', 'residential', 'living_street', 'road') THEN 'minor' WHEN highway IN ('pedestrian', 'path', 'footway', 'cycleway', 'steps', 'bridleway', 'corridor') OR public_transport IN ('platform') THEN 'path' - WHEN highway IN ('service', 'track', 'raceway', 'construction') THEN highway + WHEN highway IN ('service', 'track', 'raceway') THEN highway + WHEN highway = 'construction' THEN CASE + WHEN construction IN ('motorway', 'motorway_link') THEN 'motorway_construction' + WHEN construction IN ('trunk', 'trunk_link') THEN 'trunk_construction' + WHEN construction IN ('primary', 'primary_link') THEN 'primary_construction' + WHEN construction IN ('secondary', 'secondary_link') THEN 'secondary_construction' + WHEN construction IN ('tertiary', 'tertiary_link') THEN 'tertiary_construction' + WHEN construction IS NULL OR construction IN ('unclassified', 'residential', 'living_street', 'road') THEN 'minor_construction' + WHEN construction IN ('pedestrian', 'path', 'footway', 'cycleway', 'steps', 'bridleway', 'corridor') OR public_transport IN ('platform') THEN 'path_construction' + WHEN construction IN ('service', 'track', 'raceway') THEN CONCAT(highway, '_construction') + ELSE NULL + END ELSE NULL END; $$ LANGUAGE SQL IMMUTABLE; diff --git a/layers/transportation/layer.sql b/layers/transportation/layer.sql index 651ea5b..72f3ecf 100644 --- a/layers/transportation/layer.sql +++ b/layers/transportation/layer.sql @@ -12,7 +12,7 @@ indoor INT, surface TEXT) AS $$ SELECT osm_id, geometry, CASE - WHEN NULLIF(highway, '') IS NOT NULL OR NULLIF(public_transport, '') IS NOT NULL THEN highway_class(highway, public_transport) + WHEN NULLIF(highway, '') IS NOT NULL OR NULLIF(public_transport, '') IS NOT NULL THEN highway_class(highway, public_transport, construction) WHEN NULLIF(railway, '') IS NOT NULL THEN railway_class(railway) WHEN NULLIF(aerialway, '') IS NOT NULL THEN aerialway WHEN NULLIF(shipway, '') IS NOT NULL THEN shipway @@ -21,7 +21,7 @@ indoor INT, surface TEXT) AS $$ CASE WHEN railway IS NOT NULL THEN railway WHEN (highway IS NOT NULL OR public_transport IS NOT NULL) - AND highway_class(highway, public_transport) = 'path' + AND highway_class(highway, public_transport, construction) = 'path' THEN COALESCE(NULLIF(public_transport, ''), highway) ELSE NULL END AS subclass, @@ -39,13 +39,13 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_transportation_merge_linestring_gen7 -> layer_transportation:z4 SELECT osm_id, geometry, - highway, NULL AS railway, NULL AS aerialway, NULL AS shipway, + highway, construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, NULL AS public_transport, NULL AS service, NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL::boolean AS is_ford, NULL::boolean AS is_ramp, NULL::int AS is_oneway, NULL as man_made, NULL::int AS layer, NULL::int AS level, NULL::boolean AS indoor, - NULL AS surface, + NULL AS surface, z_order FROM osm_transportation_merge_linestring_gen7 WHERE zoom_level = 4 @@ -54,7 +54,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_transportation_merge_linestring_gen6 -> layer_transportation:z5 SELECT osm_id, geometry, - highway, NULL AS railway, NULL AS aerialway, NULL AS shipway, + highway, construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, NULL AS public_transport, NULL AS service, NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL::boolean AS is_ford, @@ -68,7 +68,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_transportation_merge_linestring_gen5 -> layer_transportation:z6 SELECT osm_id, geometry, - highway, NULL AS railway, NULL AS aerialway, NULL AS shipway, + highway, construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, NULL AS public_transport, NULL AS service, NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL::boolean AS is_ford, @@ -82,7 +82,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_transportation_merge_linestring_gen4 -> layer_transportation:z7 SELECT osm_id, geometry, - highway, NULL AS railway, NULL AS aerialway, NULL AS shipway, + highway, construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, NULL AS public_transport, NULL AS service, NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL::boolean AS is_ford, @@ -96,7 +96,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_transportation_merge_linestring_gen3 -> layer_transportation:z8 SELECT osm_id, geometry, - highway, NULL AS railway, NULL AS aerialway, NULL AS shipway, + highway, construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, NULL AS public_transport, NULL AS service, NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL::boolean AS is_ford, @@ -111,7 +111,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_highway_linestring_gen2 -> layer_transportation:z10 SELECT osm_id, geometry, - highway, NULL AS railway, NULL AS aerialway, NULL AS shipway, + highway, construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, NULL AS public_transport, NULL AS service, NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL::boolean AS is_ford, @@ -126,7 +126,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_highway_linestring_gen1 -> layer_transportation:z11 SELECT osm_id, geometry, - highway, NULL AS railway, NULL AS aerialway, NULL AS shipway, + highway, construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, NULL AS public_transport, NULL AS service, NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL::boolean AS is_ford, @@ -143,7 +143,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_highway_linestring -> layer_transportation:z14_ SELECT osm_id, geometry, - highway, NULL AS railway, NULL AS aerialway, NULL AS shipway, + highway, construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, public_transport, service_value(service) AS service, is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, man_made, layer, @@ -158,12 +158,12 @@ indoor INT, surface TEXT) AS $$ FROM osm_highway_linestring WHERE NOT is_area AND ( zoom_level = 12 AND ( - highway_class(highway, public_transport) NOT IN ('track', 'path', 'minor') + highway_class(highway, public_transport, construction) NOT IN ('track', 'path', 'minor') OR highway IN ('unclassified', 'residential') ) AND man_made <> 'pier' OR zoom_level = 13 AND ( - highway_class(highway, public_transport) NOT IN ('track', 'path') AND man_made <> 'pier' + highway_class(highway, public_transport, construction) NOT IN ('track', 'path') AND man_made <> 'pier' OR man_made = 'pier' AND NOT ST_IsClosed(geometry) ) @@ -179,7 +179,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_railway_linestring_gen5 -> layer_transportation:z8 SELECT osm_id, geometry, - NULL AS highway, railway, NULL AS aerialway, NULL AS shipway, + NULL AS highway, NULL AS construction, railway, NULL AS aerialway, NULL AS shipway, NULL AS public_transport, service_value(service) AS service, NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL::boolean AS is_ford, @@ -194,7 +194,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_railway_linestring_gen4 -> layer_transportation:z9 SELECT osm_id, geometry, - NULL AS highway, railway, NULL AS aerialway, NULL AS shipway, + NULL AS highway, NULL AS construction, railway, NULL AS aerialway, NULL AS shipway, NULL AS public_transport, service_value(service) AS service, NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL::boolean AS is_ford, @@ -209,7 +209,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_railway_linestring_gen3 -> layer_transportation:z10 SELECT osm_id, geometry, - NULL AS highway, railway, NULL AS aerialway, NULL AS shipway, + NULL AS highway, NULL AS construction, railway, NULL AS aerialway, NULL AS shipway, NULL AS public_transport, service_value(service) AS service, is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, layer, NULL::int AS level, NULL::boolean AS indoor, @@ -222,7 +222,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_railway_linestring_gen2 -> layer_transportation:z11 SELECT osm_id, geometry, - NULL AS highway, railway, NULL AS aerialway, NULL AS shipway, + NULL AS highway, NULL AS construction, railway, NULL AS aerialway, NULL AS shipway, NULL AS public_transport, service_value(service) AS service, is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, layer, NULL::int AS level, NULL::boolean AS indoor, @@ -235,7 +235,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_railway_linestring_gen1 -> layer_transportation:z12 SELECT osm_id, geometry, - NULL AS highway, railway, NULL AS aerialway, NULL AS shipway, + NULL AS highway, NULL AS construction, railway, NULL AS aerialway, NULL AS shipway, NULL AS public_transport, service_value(service) AS service, is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, layer, NULL::int AS level, NULL::boolean AS indoor, @@ -249,7 +249,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_railway_linestring -> layer_transportation:z14_ SELECT osm_id, geometry, - NULL AS highway, railway, NULL AS aerialway, NULL AS shipway, + NULL AS highway, NULL AS construction, railway, NULL AS aerialway, NULL AS shipway, NULL AS public_transport, service_value(service) AS service, is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, layer, NULL::int AS level, NULL::boolean AS indoor, @@ -263,7 +263,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_aerialway_linestring_gen1 -> layer_transportation:z12 SELECT osm_id, geometry, - NULL AS highway, NULL as railway, aerialway, NULL AS shipway, + NULL AS highway, NULL AS construction, NULL as railway, aerialway, NULL AS shipway, NULL AS public_transport, service_value(service) AS service, is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, layer, NULL::int AS level, NULL::boolean AS indoor, @@ -276,7 +276,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_aerialway_linestring -> layer_transportation:z14_ SELECT osm_id, geometry, - NULL AS highway, NULL as railway, aerialway, NULL AS shipway, + NULL AS highway, NULL AS construction, NULL as railway, aerialway, NULL AS shipway, NULL AS public_transport, service_value(service) AS service, is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, layer, NULL::int AS level, NULL::boolean AS indoor, @@ -288,7 +288,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_shipway_linestring_gen2 -> layer_transportation:z11 SELECT osm_id, geometry, - NULL AS highway, NULL AS railway, NULL AS aerialway, shipway, + NULL AS highway, NULL AS construction, NULL AS railway, NULL AS aerialway, shipway, NULL AS public_transport, service_value(service) AS service, is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, layer, NULL::int AS level, NULL::boolean AS indoor, @@ -300,7 +300,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_shipway_linestring_gen1 -> layer_transportation:z12 SELECT osm_id, geometry, - NULL AS highway, NULL AS railway, NULL AS aerialway, shipway, + NULL AS highway, NULL AS construction, NULL AS railway, NULL AS aerialway, shipway, NULL AS public_transport, service_value(service) AS service, is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, layer, NULL::int AS level, NULL::boolean AS indoor, @@ -313,7 +313,7 @@ indoor INT, surface TEXT) AS $$ -- etldoc: osm_shipway_linestring -> layer_transportation:z14_ SELECT osm_id, geometry, - NULL AS highway, NULL AS railway, NULL AS aerialway, shipway, + NULL AS highway, NULL AS construction, NULL AS railway, NULL AS aerialway, shipway, NULL AS public_transport, service_value(service) AS service, is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, layer, NULL::int AS level, NULL::boolean AS indoor, diff --git a/layers/transportation/mapping.yaml b/layers/transportation/mapping.yaml index 7d10ed4..e4e8f7b 100644 --- a/layers/transportation/mapping.yaml +++ b/layers/transportation/mapping.yaml @@ -45,13 +45,13 @@ generalized_tables: # etldoc: imposm3 -> osm_highway_linestring_gen2 highway_linestring_gen2: source: highway_linestring_gen1 - sql_filter: highway IN ('motorway', 'trunk', 'primary', 'secondary', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link') AND NOT is_area + sql_filter: (highway IN ('motorway', 'trunk', 'primary', 'secondary', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link') OR highway = 'construction' AND construction IN ('motorway', 'trunk', 'primary', 'secondary', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link')) AND NOT is_area tolerance: ZRES11 # etldoc: imposm3 -> osm_highway_linestring_gen1 highway_linestring_gen1: source: highway_linestring - sql_filter: highway IN ('motorway', 'trunk', 'primary', 'secondary', 'tertiary', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link', 'tertiary_link') AND NOT is_area AND ST_IsValid(geometry) + sql_filter: (highway IN ('motorway', 'trunk', 'primary', 'secondary', 'tertiary', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link', 'tertiary_link') OR highway = 'construction' AND construction IN ('motorway', 'trunk', 'primary', 'secondary', 'tertiary', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link', 'tertiary_link')) AND NOT is_area AND ST_IsValid(geometry) tolerance: ZRES12 name_field: &name @@ -150,6 +150,9 @@ tables: - name: highway key: highway type: string + - name: construction + key: construction + type: string - *ref - *network - *z_order diff --git a/layers/transportation/update_transportation_merge.sql b/layers/transportation/update_transportation_merge.sql index 36d0931..06ef1e8 100644 --- a/layers/transportation/update_transportation_merge.sql +++ b/layers/transportation/update_transportation_merge.sql @@ -22,14 +22,14 @@ CREATE INDEX IF NOT EXISTS osm_highway_linestring_highway_idx -- Improve performance of the sql below CREATE INDEX IF NOT EXISTS osm_highway_linestring_highway_partial_idx ON osm_highway_linestring(highway) - WHERE highway IN ('motorway','trunk', 'primary'); + WHERE highway IN ('motorway','trunk', 'primary', 'construction'); -- etldoc: osm_highway_linestring -> osm_transportation_merge_linestring CREATE MATERIALIZED VIEW osm_transportation_merge_linestring AS ( SELECT (ST_Dump(geometry)).geom AS geometry, NULL::bigint AS osm_id, - highway, + highway, construction, z_order FROM ( SELECT @@ -37,7 +37,8 @@ CREATE MATERIALIZED VIEW osm_transportation_merge_linestring AS ( highway, min(z_order) AS z_order FROM osm_highway_linestring - WHERE highway IN ('motorway','trunk', 'primary') AND ST_IsValid(geometry) + WHERE (highway IN ('motorway','trunk', 'primary') OR highway = 'construction' AND construction IN ('motorway','trunk', 'primary')) + AND ST_IsValid(geometry) group by highway ) AS highway_union ); @@ -45,61 +46,64 @@ CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_geometry_idx ON osm_transportation_merge_linestring USING gist(geometry); CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_highway_partial_idx ON osm_transportation_merge_linestring(highway) - WHERE highway IN ('motorway','trunk', 'primary'); + WHERE highway IN ('motorway','trunk', 'primary', 'construction'); -- etldoc: osm_transportation_merge_linestring -> osm_transportation_merge_linestring_gen3 CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen3 AS ( - SELECT ST_Simplify(geometry, 120) AS geometry, osm_id, highway, z_order + SELECT ST_Simplify(geometry, 120) AS geometry, osm_id, highway, construction, z_order FROM osm_transportation_merge_linestring WHERE highway IN ('motorway','trunk', 'primary') + OR highway = 'construction' AND construction IN ('motorway','trunk', 'primary') ); CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen3_geometry_idx ON osm_transportation_merge_linestring_gen3 USING gist(geometry); CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen3_highway_partial_idx ON osm_transportation_merge_linestring_gen3(highway) - WHERE highway IN ('motorway','trunk', 'primary'); + WHERE highway IN ('motorway','trunk', 'primary', 'construction'); -- etldoc: osm_transportation_merge_linestring_gen3 -> osm_transportation_merge_linestring_gen4 CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen4 AS ( - SELECT ST_Simplify(geometry, 200) AS geometry, osm_id, highway, z_order + SELECT ST_Simplify(geometry, 200) AS geometry, osm_id, highway, construction, z_order FROM osm_transportation_merge_linestring_gen3 - WHERE highway IN ('motorway','trunk', 'primary') AND ST_Length(geometry) > 50 + WHERE (highway IN ('motorway','trunk', 'primary') OR highway = 'construction' AND construction IN ('motorway','trunk', 'primary')) + AND ST_Length(geometry) > 50 ); CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen4_geometry_idx ON osm_transportation_merge_linestring_gen4 USING gist(geometry); CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen4_highway_partial_idx ON osm_transportation_merge_linestring_gen4(highway) - WHERE highway IN ('motorway','trunk', 'primary'); + WHERE highway IN ('motorway','trunk', 'primary', 'construction'); -- etldoc: osm_transportation_merge_linestring_gen4 -> osm_transportation_merge_linestring_gen5 CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen5 AS ( - SELECT ST_Simplify(geometry, 500) AS geometry, osm_id, highway, z_order + SELECT ST_Simplify(geometry, 500) AS geometry, osm_id, highway, construction, z_order FROM osm_transportation_merge_linestring_gen4 - WHERE highway IN ('motorway','trunk') AND ST_Length(geometry) > 100 + WHERE (highway IN ('motorway','trunk') OR highway = 'construction' AND construction IN ('motorway','trunk')) + AND ST_Length(geometry) > 100 ); CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen5_geometry_idx ON osm_transportation_merge_linestring_gen5 USING gist(geometry); CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen5_highway_partial_idx ON osm_transportation_merge_linestring_gen5(highway) - WHERE highway IN ('motorway', 'trunk'); + WHERE highway IN ('motorway','trunk', 'construction'); -- etldoc: osm_transportation_merge_linestring_gen5 -> osm_transportation_merge_linestring_gen6 CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen6 AS ( - SELECT ST_Simplify(geometry, 1000) AS geometry, osm_id, highway, z_order + SELECT ST_Simplify(geometry, 1000) AS geometry, osm_id, highway, construction, z_order FROM osm_transportation_merge_linestring_gen5 - WHERE highway IN ('motorway','trunk') AND ST_Length(geometry) > 500 + WHERE (highway IN ('motorway','trunk') OR highway = 'construction' AND construction IN ('motorway','trunk')) AND ST_Length(geometry) > 500 ); CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen6_geometry_idx ON osm_transportation_merge_linestring_gen6 USING gist(geometry); CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen6_highway_partial_idx ON osm_transportation_merge_linestring_gen6(highway) - WHERE highway IN ('motorway','trunk'); + WHERE highway IN ('motorway','trunk', 'construction'); -- etldoc: osm_transportation_merge_linestring_gen6 -> osm_transportation_merge_linestring_gen7 CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen7 AS ( - SELECT ST_Simplify(geometry, 2000) AS geometry, osm_id, highway, z_order + SELECT ST_Simplify(geometry, 2000) AS geometry, osm_id, highway, construction, z_order FROM osm_transportation_merge_linestring_gen6 - WHERE highway IN ('motorway') AND ST_Length(geometry) > 1000 + WHERE (highway = 'motorway' OR highway = 'construction' AND construction = 'motorway') AND ST_Length(geometry) > 1000 ); CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen7_geometry_idx ON osm_transportation_merge_linestring_gen7 USING gist(geometry);