-- etldoc: layer_place[shape=record fillcolor=lightpink, style="rounded,filled", -- etldoc: label="layer_place | z0-3| z4-7| z8-11| z12-z14+" ] ; CREATE OR REPLACE FUNCTION layer_place(bbox geometry, zoom_level int, pixel_width numeric) RETURNS TABLE ( osm_id bigint, geometry geometry, name text, name_en text, name_de text, tags hstore, class text, "rank" int, capital int, iso_a2 text ) AS $$ SELECT * FROM ( SELECT -- etldoc: osm_continent_point -> layer_place:z0_3 osm_id * 10 AS osm_id, geometry, name, COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, tags, 'continent' AS class, 1 AS "rank", NULL::int AS capital, NULL::text AS iso_a2 FROM osm_continent_point WHERE geometry && bbox AND zoom_level < 4 UNION ALL SELECT -- etldoc: osm_country_point -> layer_place:z0_3 -- etldoc: osm_country_point -> layer_place:z4_7 -- etldoc: osm_country_point -> layer_place:z8_11 -- etldoc: osm_country_point -> layer_place:z12_14 osm_id * 10 AS osm_id, geometry, name, COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, tags, 'country' AS class, "rank", NULL::int AS capital, iso3166_1_alpha_2 AS iso_a2 FROM osm_country_point WHERE geometry && bbox AND "rank" <= zoom_level + 1 AND name <> '' UNION ALL SELECT -- etldoc: osm_state_point -> layer_place:z0_3 -- etldoc: osm_state_point -> layer_place:z4_7 -- etldoc: osm_state_point -> layer_place:z8_11 -- etldoc: osm_state_point -> layer_place:z12_14 osm_id * 10 AS osm_id, geometry, name, COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, tags, 'state' AS class, "rank", NULL::int AS capital, NULL::text AS iso_a2 FROM osm_state_point WHERE geometry && bbox AND name <> '' AND ("rank" + 2 <= zoom_level) AND ( zoom_level >= 5 OR is_in_country IN ('United Kingdom', 'USA', 'Россия', 'Brasil', 'China', 'India') OR is_in_country_code IN ('AU', 'CN', 'IN', 'BR', 'US')) UNION ALL SELECT -- etldoc: osm_island_point -> layer_place:z12_14 osm_id * 10 AS osm_id, geometry, name, COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, tags, 'island' AS class, 7 AS "rank", NULL::int AS capital, NULL::text AS iso_a2 FROM osm_island_point WHERE zoom_level >= 12 AND geometry && bbox UNION ALL SELECT -- etldoc: osm_island_polygon -> layer_place:z8_11 -- etldoc: osm_island_polygon -> layer_place:z12_14 osm_id * 10 AS osm_id, geometry, name, COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, tags, 'island' AS class, island_rank(area) AS "rank", NULL::int AS capital, NULL::text AS iso_a2 FROM osm_island_polygon WHERE geometry && bbox AND ((zoom_level = 8 AND island_rank(area) <= 3) OR (zoom_level = 9 AND island_rank(area) <= 4) OR (zoom_level >= 10)) UNION ALL SELECT -- etldoc: layer_city -> layer_place:z0_3 -- etldoc: layer_city -> layer_place:z4_7 -- etldoc: layer_city -> layer_place:z8_11 -- etldoc: layer_city -> layer_place:z12_14 osm_id * 10 AS osm_id, geometry, name, name_en, name_de, tags, place::text AS class, "rank", capital, NULL::text AS iso_a2 FROM layer_city(bbox, zoom_level, pixel_width) ORDER BY "rank" ASC ) AS place_all $$ LANGUAGE SQL STABLE PARALLEL SAFE; -- TODO: Check if the above can be made STRICT -- i.e. if pixel_width could be NULL