From 7400b552c2f1cf0fd8e051d5e5b59b12f5615f07 Mon Sep 17 00:00:00 2001 From: Lukas Martinelli Date: Mon, 16 Jan 2017 16:00:45 +0100 Subject: [PATCH 1/3] Add seas and oceans to water_name --- layers/water_name/layer.sql | 8 ++++++++ layers/water_name/water_name.yaml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/layers/water_name/layer.sql b/layers/water_name/layer.sql index 0bfac8b..143a00d 100644 --- a/layers/water_name/layer.sql +++ b/layers/water_name/layer.sql @@ -19,5 +19,13 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, class t WHERE geometry && bbox AND ( (zoom_level BETWEEN 9 AND 13 AND area > 70000*2^(20-zoom_level)) OR (zoom_level >= 14) + ) + -- etldoc: osm_marine_point -> layer_water_name:z14 + UNION ALL + SELECT osm_id, geometry, name, name_en, place::text AS class + FROM osm_marine_point + WHERE geometry && bbox AND ( + (zoom_level <= 4 AND place = 'ocean') + OR (zoom_level >= 5) ); $$ LANGUAGE SQL IMMUTABLE; diff --git a/layers/water_name/water_name.yaml b/layers/water_name/water_name.yaml index a1bd76b..33bff0b 100644 --- a/layers/water_name/water_name.yaml +++ b/layers/water_name/water_name.yaml @@ -12,7 +12,7 @@ layer: At the moment only `lake` since no ocean parts are labelled. *Reserved for future use*. values: - lake - buffer_size: 8 + buffer_size: 64 srs: +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over datasource: geometry_field: geometry From 1df806ba44f85df74aa1361f91dfac120d2f2d21 Mon Sep 17 00:00:00 2001 From: Lukas Martinelli Date: Mon, 16 Jan 2017 16:23:22 +0100 Subject: [PATCH 2/3] Merge NE marine rank --- layers/water_name/mapping.yaml | 3 ++ layers/water_name/merge_marine_rank.sql | 61 +++++++++++++++++++++++++ layers/water_name/water_name.yaml | 1 + 3 files changed, 65 insertions(+) create mode 100644 layers/water_name/merge_marine_rank.sql diff --git a/layers/water_name/mapping.yaml b/layers/water_name/mapping.yaml index c1d35cc..15476d8 100644 --- a/layers/water_name/mapping.yaml +++ b/layers/water_name/mapping.yaml @@ -16,6 +16,9 @@ tables: - name: place key: place type: string + - name: rank + key: rank + type: integer filters: exclude_tags: - [ "name", "__nil__" ] diff --git a/layers/water_name/merge_marine_rank.sql b/layers/water_name/merge_marine_rank.sql new file mode 100644 index 0000000..45566cf --- /dev/null +++ b/layers/water_name/merge_marine_rank.sql @@ -0,0 +1,61 @@ +DROP TRIGGER IF EXISTS trigger_flag ON osm_marine_point; +DROP TRIGGER IF EXISTS trigger_refresh ON water_name_marine.updates; + +CREATE EXTENSION IF NOT EXISTS unaccent; + +CREATE OR REPLACE FUNCTION update_osm_marine_point() RETURNS VOID AS $$ +BEGIN + -- etldoc: osm_marine_point -> osm_marine_point + UPDATE osm_marine_point AS osm SET "rank" = NULL WHERE "rank" IS NOT NULL; + + -- etldoc: ne_10m_geography_marine_polys -> osm_marine_point + -- etldoc: osm_marine_point -> osm_marine_point + + WITH important_marine_point AS ( + SELECT osm.geometry, osm.osm_id, osm.name, osm.name_en, ne.scalerank + FROM ne_10m_geography_marine_polys AS ne, osm_marine_point AS osm + WHERE ne.name ILIKE osm.name + ) + UPDATE osm_marine_point AS osm + SET "rank" = scalerank + FROM important_marine_point AS ne + WHERE osm.osm_id = ne.osm_id; +END; +$$ LANGUAGE plpgsql; + +SELECT update_osm_marine_point(); + +CREATE INDEX IF NOT EXISTS osm_marine_point_rank_idx ON osm_marine_point("rank"); + +-- Handle updates +CREATE SCHEMA IF NOT EXISTS water_name_marine; + +CREATE TABLE IF NOT EXISTS water_name_marine.updates(id serial primary key, t text, unique (t)); +CREATE OR REPLACE FUNCTION water_name_marine.flag() RETURNS trigger AS $$ +BEGIN + INSERT INTO water_name_marine.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; + RETURN null; +END; +$$ language plpgsql; + +CREATE OR REPLACE FUNCTION water_name_marine.refresh() RETURNS trigger AS + $BODY$ + BEGIN + RAISE LOG 'Refresh water_name_marine rank'; + PERFORM update_osm_marine_point(); + DELETE FROM water_name_marine.updates; + RETURN null; + END; + $BODY$ +language plpgsql; + +CREATE TRIGGER trigger_flag + AFTER INSERT OR UPDATE OR DELETE ON osm_marine_point + FOR EACH STATEMENT + EXECUTE PROCEDURE water_name_marine.flag(); + +CREATE CONSTRAINT TRIGGER trigger_refresh + AFTER INSERT ON water_name_marine.updates + INITIALLY DEFERRED + FOR EACH ROW + EXECUTE PROCEDURE water_name_marine.refresh(); diff --git a/layers/water_name/water_name.yaml b/layers/water_name/water_name.yaml index 33bff0b..ab9da59 100644 --- a/layers/water_name/water_name.yaml +++ b/layers/water_name/water_name.yaml @@ -19,6 +19,7 @@ layer: srid: 900913 query: (SELECT geometry, name, name_en, class FROM layer_water_name(!bbox!, z(!scale_denominator!))) AS t schema: + - ./merge_marine_rank.sql - ./water_lakeline.sql - ./water_point.sql - ./layer.sql From 14dc0f0926b68c6b7dfc3bb0a1e3f1daea380b66 Mon Sep 17 00:00:00 2001 From: Lukas Martinelli Date: Mon, 16 Jan 2017 16:40:39 +0100 Subject: [PATCH 3/3] Limit sea/ocean labels by rank --- layers/water_name/layer.sql | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/layers/water_name/layer.sql b/layers/water_name/layer.sql index 143a00d..b71b8cb 100644 --- a/layers/water_name/layer.sql +++ b/layers/water_name/layer.sql @@ -12,7 +12,7 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, class t AND ((zoom_level BETWEEN 9 AND 13 AND LineLabel(zoom_level, NULLIF(name, ''), geometry)) OR (zoom_level >= 14)) -- etldoc: osm_water_point -> layer_water_name:z9_13 - -- etldoc: osm_water_point -> layer_water_name:z14_ + -- etldoc: osm_water_point -> layer_water_name:z14_ UNION ALL SELECT osm_id, geometry, name, name_en, 'lake'::text AS class FROM osm_water_point @@ -20,12 +20,13 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, class t (zoom_level BETWEEN 9 AND 13 AND area > 70000*2^(20-zoom_level)) OR (zoom_level >= 14) ) - -- etldoc: osm_marine_point -> layer_water_name:z14 + -- etldoc: osm_marine_point -> layer_water_name:z0_14_ UNION ALL SELECT osm_id, geometry, name, name_en, place::text AS class FROM osm_marine_point WHERE geometry && bbox AND ( - (zoom_level <= 4 AND place = 'ocean') - OR (zoom_level >= 5) + place = 'ocean' + OR (zoom_level <= "rank" AND "rank" IS NOT NULL) + OR (zoom_level >= 8) ); $$ LANGUAGE SQL IMMUTABLE;