diff --git a/layers/mountain_peak/etl_diagram.png b/layers/mountain_peak/etl_diagram.png index e9a5bd7..2d74753 100644 Binary files a/layers/mountain_peak/etl_diagram.png and b/layers/mountain_peak/etl_diagram.png differ diff --git a/layers/mountain_peak/mapping.yaml b/layers/mountain_peak/mapping.yaml index 84a0146..21952d1 100644 --- a/layers/mountain_peak/mapping.yaml +++ b/layers/mountain_peak/mapping.yaml @@ -29,3 +29,32 @@ tables: natural: - peak - volcano + - saddle + + # etldoc: imposm3 -> osm_mountain_linestring + mountain_linestring: + type: linestring + columns: + - name: osm_id + type: id + - name: geometry + type: geometry + - name: name + key: name + type: string + - name: name_en + key: name:en + type: string + - name: name_de + key: name:de + type: string + - name: tags + type: hstore_tags + - name: wikipedia + key: wikipedia + type: string + mapping: + natural: + - ridge + - cliff + - arete diff --git a/layers/mountain_peak/mapping_diagram.png b/layers/mountain_peak/mapping_diagram.png index e0c5ceb..d038aa2 100644 Binary files a/layers/mountain_peak/mapping_diagram.png and b/layers/mountain_peak/mapping_diagram.png differ diff --git a/layers/mountain_peak/mountain_peak.sql b/layers/mountain_peak/mountain_peak.sql index b6f6752..5c0d496 100644 --- a/layers/mountain_peak/mountain_peak.sql +++ b/layers/mountain_peak/mountain_peak.sql @@ -55,6 +55,39 @@ FROM ( ) AS ranked_peaks WHERE zoom_level >= 7 AND (rank <= 5 OR zoom_level >= 14) + +UNION ALL + +SELECT + -- etldoc: osm_mountain_linestring -> layer_mountain_peak:z13_ + osm_id, + geometry, + name, + name_en, + name_de, + tags->'natural' AS class, + tags, + NULL AS ele, + NULL AS ele_ft, + rank::int +FROM ( + SELECT osm_id, + geometry, + name, + COALESCE(NULLIF(name_en, ''), name) AS name_en, + COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, + tags, + row_number() OVER ( + PARTITION BY LabelGrid(geometry, 100 * pixel_width) + ORDER BY ( + (CASE WHEN NULLIF(wikipedia, '') IS NOT NULL THEN 10000 ELSE 0 END) + + (CASE WHEN NULLIF(name, '') IS NOT NULL THEN 10000 ELSE 0 END) + ) DESC + )::int AS "rank" + FROM osm_mountain_linestring + WHERE geometry && bbox + ) AS ranked_mountain_linestring +WHERE zoom_level >= 13 ORDER BY "rank" ASC; $$ LANGUAGE SQL STABLE diff --git a/layers/mountain_peak/mountain_peak.yaml b/layers/mountain_peak/mountain_peak.yaml index f88d73e..8f1a7fe 100644 --- a/layers/mountain_peak/mountain_peak.yaml +++ b/layers/mountain_peak/mountain_peak.yaml @@ -14,6 +14,9 @@ layer: values: - peak - volcano + - ridge + - cliff + - arete ele: Elevation (`ele`) in meters. ele_ft: Elevation (`ele`) in feet. rank: Rank of the peak within one tile (starting at 1 that is the most important peak). @@ -25,6 +28,7 @@ layer: query: (SELECT osm_id, geometry, name, name_en, name_de, {name_languages}, class, ele, ele_ft, rank FROM layer_mountain_peak(!bbox!, z(!scale_denominator!), !pixel_width!)) AS t schema: - ./update_peak_point.sql + - ./update_mountain_linestring.sql - ./mountain_peak.sql datasources: - type: imposm3 diff --git a/layers/mountain_peak/update_mountain_linestring.sql b/layers/mountain_peak/update_mountain_linestring.sql new file mode 100644 index 0000000..760c274 --- /dev/null +++ b/layers/mountain_peak/update_mountain_linestring.sql @@ -0,0 +1,86 @@ +DROP TRIGGER IF EXISTS trigger_flag ON osm_mountain_linestring; +DROP TRIGGER IF EXISTS trigger_store ON osm_mountain_linestring; +DROP TRIGGER IF EXISTS trigger_refresh ON mountain_linestring.updates; + +CREATE SCHEMA IF NOT EXISTS mountain_linestring; + +CREATE TABLE IF NOT EXISTS mountain_linestring.osm_ids +( + osm_id bigint +); + +-- etldoc: osm_mountain_linestring -> osm_mountain_linestring +CREATE OR REPLACE FUNCTION update_osm_mountain_linestring(full_update boolean) RETURNS void AS +$$ + UPDATE osm_mountain_linestring + SET tags = update_tags(tags, geometry) + WHERE (full_update OR osm_id IN (SELECT osm_id FROM mountain_linestring.osm_ids)) + AND COALESCE(tags -> 'name:latin', tags -> 'name:nonlatin', tags -> 'name_int') IS NULL + AND tags != update_tags(tags, geometry) +$$ LANGUAGE SQL; + +SELECT update_osm_mountain_linestring(true); + +-- Handle updates + +CREATE OR REPLACE FUNCTION mountain_linestring.store() RETURNS trigger AS +$$ +BEGIN + IF (tg_op = 'DELETE') THEN + INSERT INTO mountain_linestring.osm_ids VALUES (OLD.osm_id); + ELSE + INSERT INTO mountain_linestring.osm_ids VALUES (NEW.osm_id); + END IF; + RETURN NULL; +END; +$$ LANGUAGE plpgsql; + +CREATE TABLE IF NOT EXISTS mountain_linestring.updates +( + id serial PRIMARY KEY, + t text, + UNIQUE (t) +); +CREATE OR REPLACE FUNCTION mountain_linestring.flag() RETURNS trigger AS +$$ +BEGIN + INSERT INTO mountain_linestring.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; + RETURN NULL; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION mountain_linestring.refresh() RETURNS trigger AS +$$ +DECLARE + t TIMESTAMP WITH TIME ZONE := clock_timestamp(); +BEGIN + RAISE LOG 'Refresh mountain_linestring'; + PERFORM update_osm_mountain_linestring(false); + -- noinspection SqlWithoutWhere + DELETE FROM mountain_linestring.osm_ids; + -- noinspection SqlWithoutWhere + DELETE FROM mountain_linestring.updates; + + RAISE LOG 'Refresh mountain_linestring done in %', age(clock_timestamp(), t); + RETURN NULL; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER trigger_store + AFTER INSERT OR UPDATE OR DELETE + ON osm_mountain_linestring + FOR EACH ROW +EXECUTE PROCEDURE mountain_linestring.store(); + +CREATE TRIGGER trigger_flag + AFTER INSERT OR UPDATE OR DELETE + ON osm_mountain_linestring + FOR EACH STATEMENT +EXECUTE PROCEDURE mountain_linestring.flag(); + +CREATE CONSTRAINT TRIGGER trigger_refresh + AFTER INSERT + ON mountain_linestring.updates + INITIALLY DEFERRED + FOR EACH ROW +EXECUTE PROCEDURE mountain_linestring.refresh();