mirror of
https://github.com/gravitystorm/openstreetmap-carto.git
synced 2025-12-08 17:36:10 +00:00
* Restricted marking for motorway/trunk/primary * Add access marking for highway=pedestrian * Update functions.sql highway=pedestrian should support restricted access * Change pedestrian access marking colour Change pedestrian access marking colour to common light shade of grey. Also consolidate names.
76 lines
3.4 KiB
PL/PgSQL
76 lines
3.4 KiB
PL/PgSQL
/* Additional database functions for openstreetmap-carto */
|
|
|
|
/* Access functions below adapted from https://github.com/imagico/osm-carto-alternative-colors/tree/591c861112b4e5d44badd108f4cd1409146bca0b/sql/roads.sql */
|
|
|
|
/* Simplified 'yes', 'destination', 'no', 'unrecognised', NULL scale for access restriction
|
|
'no' is returned if the rendering for highway category does not support 'restricted'.
|
|
NULL is functionally equivalent to 'yes', but indicates the absence of a restriction
|
|
rather than a positive access = yes. 'unrecognised' corresponds to an uninterpretable
|
|
access restriction e.g. access=unknown or motorcar=occasionally */
|
|
CREATE OR REPLACE FUNCTION carto_int_access(accessvalue text, allow_restricted boolean)
|
|
RETURNS text
|
|
LANGUAGE SQL
|
|
IMMUTABLE PARALLEL SAFE
|
|
AS $$
|
|
SELECT
|
|
CASE
|
|
WHEN accessvalue IN ('yes', 'designated', 'permissive') THEN 'yes'
|
|
WHEN accessvalue IN ('destination', 'delivery', 'customers') THEN
|
|
CASE WHEN allow_restricted = TRUE THEN 'restricted' ELSE 'yes' END
|
|
WHEN accessvalue IN ('no', 'permit', 'private', 'agricultural', 'forestry', 'agricultural;forestry') THEN 'no'
|
|
WHEN accessvalue IS NULL THEN NULL
|
|
ELSE 'unrecognised'
|
|
END
|
|
$$;
|
|
|
|
/* Try to promote path to cycleway (if bicycle allowed), then bridleway (if horse)
|
|
This duplicates existing behaviour where designated access is required */
|
|
CREATE OR REPLACE FUNCTION carto_path_type(bicycle text, horse text)
|
|
RETURNS text
|
|
LANGUAGE SQL
|
|
IMMUTABLE PARALLEL SAFE
|
|
AS $$
|
|
SELECT
|
|
CASE
|
|
WHEN bicycle IN ('designated') THEN 'cycleway'
|
|
WHEN horse IN ('designated') THEN 'bridleway'
|
|
ELSE 'path'
|
|
END
|
|
$$;
|
|
|
|
/* Return int_access value which will be used to determine access marking.
|
|
Return values are documented above for carto_int_access function.
|
|
|
|
Note that the code handling the promotion of highway=path assumes that
|
|
promotion to cycleway or bridleway is based on the value of bicycle or
|
|
horse respectively. A more general formulation would be, for example,
|
|
WHEN 'cycleway' THEN carto_int_access(COALESCE(NULLIF(bicycle, 'unknown'), "access"), FALSE) */
|
|
CREATE OR REPLACE FUNCTION carto_highway_int_access(highway text, "access" text, foot text, bicycle text, horse text, motorcar text, motor_vehicle text, vehicle text)
|
|
RETURNS text
|
|
LANGUAGE SQL
|
|
IMMUTABLE PARALLEL SAFE
|
|
AS $$
|
|
SELECT
|
|
CASE
|
|
WHEN highway IN ('motorway', 'motorway_link', 'trunk', 'trunk_link', 'primary', 'primary_link', 'secondary',
|
|
'secondary_link', 'tertiary', 'tertiary_link', 'residential', 'unclassified', 'living_street', 'service', 'road') THEN
|
|
carto_int_access(
|
|
COALESCE(
|
|
NULLIF(motorcar, 'unknown'),
|
|
NULLIF(motor_vehicle, 'unknown'),
|
|
NULLIF(vehicle, 'unknown'),
|
|
"access"), TRUE)
|
|
WHEN highway = 'path' THEN
|
|
CASE carto_path_type(bicycle, horse)
|
|
WHEN 'cycleway' THEN carto_int_access(bicycle, FALSE)
|
|
WHEN 'bridleway' THEN carto_int_access(horse, FALSE)
|
|
ELSE carto_int_access(COALESCE(NULLIF(foot, 'unknown'), "access"), FALSE)
|
|
END
|
|
WHEN highway = 'pedestrian' THEN carto_int_access(COALESCE(NULLIF(foot, 'unknown'), "access"), TRUE)
|
|
WHEN highway IN ('footway', 'steps') THEN carto_int_access(COALESCE(NULLIF(foot, 'unknown'), "access"), FALSE)
|
|
WHEN highway = 'cycleway' THEN carto_int_access(COALESCE(NULLIF(bicycle, 'unknown'), "access"), FALSE)
|
|
WHEN highway = 'bridleway' THEN carto_int_access(COALESCE(NULLIF(horse, 'unknown'), "access"), FALSE)
|
|
ELSE carto_int_access("access", TRUE)
|
|
END
|
|
$$;
|