diff --git a/layers/park/etl_diagram.png b/layers/park/etl_diagram.png index c46c00b..0823df8 100644 Binary files a/layers/park/etl_diagram.png and b/layers/park/etl_diagram.png differ diff --git a/layers/park/layer.sql b/layers/park/layer.sql index 8d0bad3..3c2c8b3 100644 --- a/layers/park/layer.sql +++ b/layers/park/layer.sql @@ -4,7 +4,7 @@ CREATE OR REPLACE FUNCTION layer_park(bbox geometry, zoom_level int) RETURNS TABLE(osm_id bigint, geometry geometry, class text) AS $$ SELECT osm_id, geometry, - COALESCE(NULLIF(leisure, ''), NULLIF(boundary, '')) AS class + COALESCE(NULLIF(boundary, ''), NULLIF(leisure, '')) AS class FROM ( -- etldoc: osm_park_polygon_gen8 -> layer_park:z6 SELECT osm_id, geometry, leisure, boundary, NULL::int as scalerank diff --git a/layers/park/mapping.yaml b/layers/park/mapping.yaml index a2639a5..bae6f16 100644 --- a/layers/park/mapping.yaml +++ b/layers/park/mapping.yaml @@ -57,6 +57,17 @@ tables: type: id - name: geometry type: validated_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: landuse key: landuse type: string diff --git a/layers/park/park.yaml b/layers/park/park.yaml index 9fa2ebf..1f27e14 100644 --- a/layers/park/park.yaml +++ b/layers/park/park.yaml @@ -14,6 +14,7 @@ layer: geometry_field: geometry query: (SELECT geometry, class FROM layer_park(!bbox!, z(!scale_denominator!))) AS t schema: + - ./update_park_polygon.sql - ./layer.sql datasources: - type: imposm3 diff --git a/layers/park/update_park_polygon.sql b/layers/park/update_park_polygon.sql new file mode 100644 index 0000000..d0a2201 --- /dev/null +++ b/layers/park/update_park_polygon.sql @@ -0,0 +1,131 @@ +ALTER TABLE osm_park_polygon ADD COLUMN IF NOT EXISTS geometry_point geometry; +ALTER TABLE osm_park_polygon_gen1 ADD COLUMN IF NOT EXISTS geometry_point geometry; +ALTER TABLE osm_park_polygon_gen2 ADD COLUMN IF NOT EXISTS geometry_point geometry; +ALTER TABLE osm_park_polygon_gen3 ADD COLUMN IF NOT EXISTS geometry_point geometry; +ALTER TABLE osm_park_polygon_gen4 ADD COLUMN IF NOT EXISTS geometry_point geometry; +ALTER TABLE osm_park_polygon_gen5 ADD COLUMN IF NOT EXISTS geometry_point geometry; +ALTER TABLE osm_park_polygon_gen6 ADD COLUMN IF NOT EXISTS geometry_point geometry; +ALTER TABLE osm_park_polygon_gen7 ADD COLUMN IF NOT EXISTS geometry_point geometry; +ALTER TABLE osm_park_polygon_gen8 ADD COLUMN IF NOT EXISTS geometry_point geometry; +DROP TRIGGER IF EXISTS update_row ON osm_park_polygon; +DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen1; +DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen2; +DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen3; +DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen4; +DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen5; +DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen6; +DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen7; +DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen8; + +-- etldoc: osm_park_polygon -> osm_park_polygon +-- etldoc: osm_park_polygon_gen1 -> osm_park_polygon_gen1 +-- etldoc: osm_park_polygon_gen2 -> osm_park_polygon_gen2 +-- etldoc: osm_park_polygon_gen3 -> osm_park_polygon_gen3 +-- etldoc: osm_park_polygon_gen4 -> osm_park_polygon_gen4 +-- etldoc: osm_park_polygon_gen5 -> osm_park_polygon_gen5 +-- etldoc: osm_park_polygon_gen6 -> osm_park_polygon_gen6 +-- etldoc: osm_park_polygon_gen7 -> osm_park_polygon_gen7 +-- etldoc: osm_park_polygon_gen8 -> osm_park_polygon_gen8 +CREATE OR REPLACE FUNCTION update_osm_park_polygon() RETURNS VOID AS $$ +BEGIN + UPDATE osm_park_polygon + SET tags = update_tags(tags, geometry), + geometry_point = st_centroid(geometry); + + UPDATE osm_park_polygon_gen1 + SET tags = update_tags(tags, geometry), + geometry_point = st_centroid(geometry); + + UPDATE osm_park_polygon_gen2 + SET tags = update_tags(tags, geometry), + geometry_point = st_centroid(geometry); + + UPDATE osm_park_polygon_gen3 + SET tags = update_tags(tags, geometry), + geometry_point = st_centroid(geometry); + + UPDATE osm_park_polygon_gen4 + SET tags = update_tags(tags, geometry), + geometry_point = st_centroid(geometry); + + UPDATE osm_park_polygon_gen5 + SET tags = update_tags(tags, geometry), + geometry_point = st_centroid(geometry); + + UPDATE osm_park_polygon_gen6 + SET tags = update_tags(tags, geometry), + geometry_point = st_centroid(geometry); + + UPDATE osm_park_polygon_gen7 + SET tags = update_tags(tags, geometry), + geometry_point = st_centroid(geometry); + + UPDATE osm_park_polygon_gen8 + SET tags = update_tags(tags, geometry), + geometry_point = st_centroid(geometry); + +END; +$$ LANGUAGE plpgsql; + +SELECT update_osm_park_polygon(); + + +CREATE OR REPLACE FUNCTION update_osm_park_polygon_row() + RETURNS TRIGGER +AS +$BODY$ +BEGIN + NEW.tags = update_tags(NEW.tags, NEW.geometry); + NEW.geometry_point = NEW.st_centroid(geometry); + RETURN NEW; +END; +$BODY$ +LANGUAGE plpgsql; + +CREATE TRIGGER update_row +BEFORE INSERT OR UPDATE ON osm_park_polygon +FOR EACH ROW +EXECUTE PROCEDURE update_osm_park_polygon_row(); + +CREATE TRIGGER update_row +BEFORE INSERT OR UPDATE ON osm_park_polygon_gen1 +FOR EACH ROW +EXECUTE PROCEDURE update_osm_park_polygon_row(); + +CREATE TRIGGER update_row +BEFORE INSERT OR UPDATE ON osm_park_polygon_gen2 +FOR EACH ROW +EXECUTE PROCEDURE update_osm_park_polygon_row(); + +CREATE TRIGGER update_row +BEFORE INSERT OR UPDATE ON osm_park_polygon_gen3 +FOR EACH ROW +EXECUTE PROCEDURE update_osm_park_polygon_row(); + +CREATE TRIGGER update_row +BEFORE INSERT OR UPDATE ON osm_park_polygon_gen4 +FOR EACH ROW +EXECUTE PROCEDURE update_osm_park_polygon_row(); + +CREATE TRIGGER update_row +BEFORE INSERT OR UPDATE ON osm_park_polygon_gen5 +FOR EACH ROW +EXECUTE PROCEDURE update_osm_park_polygon_row(); + +CREATE TRIGGER update_row +BEFORE INSERT OR UPDATE ON osm_park_polygon_gen6 +FOR EACH ROW +EXECUTE PROCEDURE update_osm_park_polygon_row(); + +CREATE TRIGGER update_row +BEFORE INSERT OR UPDATE ON osm_park_polygon_gen7 +FOR EACH ROW +EXECUTE PROCEDURE update_osm_park_polygon_row(); + +CREATE TRIGGER update_row +BEFORE INSERT OR UPDATE ON osm_park_polygon_gen8 +FOR EACH ROW +EXECUTE PROCEDURE update_osm_park_polygon_row(); + + + diff --git a/layers/park_label/README.md b/layers/park_label/README.md new file mode 100644 index 0000000..734586d --- /dev/null +++ b/layers/park_label/README.md @@ -0,0 +1,10 @@ +## park_label + +### Docs +Read the layer documentation at **http://openmaptiles.org/schema#park_label** + +### Mapping Diagram +![Mapping diagram for park](mapping_diagram.png?raw=true) + +### ETL diagram +![ETL diagram for park](etl_diagram.png?raw=true) diff --git a/layers/park_label/etl_diagram.png b/layers/park_label/etl_diagram.png new file mode 100644 index 0000000..c46c00b Binary files /dev/null and b/layers/park_label/etl_diagram.png differ diff --git a/layers/park_label/layer.sql b/layers/park_label/layer.sql new file mode 100644 index 0000000..5565337 --- /dev/null +++ b/layers/park_label/layer.sql @@ -0,0 +1,70 @@ +-- etldoc: layer_park_label[shape=record fillcolor=lightpink, style="rounded,filled", +-- etldoc: label="layer_park | z6 | z7 | z8 | z9 | z10 | z11 | z12| z13| z14+" ] ; + +CREATE OR REPLACE FUNCTION layer_park_label(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) AS $$ + SELECT osm_id, geometry_point, name, name_en, name_de, tags, + COALESCE(NULLIF(boundary, ''), NULLIF(leisure, '')) AS class, + row_number() OVER ( + PARTITION BY LabelGrid(geometry_point, 100 * pixel_width) + ORDER BY + (CASE WHEN boundary = 'national_park' THEN true ELSE false END) DESC, + (COALESCE(NULLIF(tags->'wikipedia', ''), NULLIF(tags->'wikidata', '')) IS NOT NULL) DESC, + area DESC + )::int AS "rank" + FROM ( + -- etldoc: osm_park_polygon_gen8 -> layer_park_label:z6 + SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, area + FROM osm_park_polygon_gen8 + WHERE zoom_level = 6 + UNION ALL + + -- etldoc: osm_park_polygon_gen7 -> layer_park_label:z7 + SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, area + FROM osm_park_polygon_gen7 + WHERE zoom_level = 7 + UNION ALL + + -- etldoc: osm_park_polygon_gen6 -> layer_park_label:z8 + SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, area + FROM osm_park_polygon_gen6 + WHERE zoom_level = 8 + UNION ALL + + -- etldoc: osm_park_polygon_gen5 -> layer_park_label:z9 + SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, area + FROM osm_park_polygon_gen5 + WHERE zoom_level = 9 + UNION ALL + + -- etldoc: osm_park_polygon_gen4 -> layer_park_label:z10 + SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, area + FROM osm_park_polygon_gen4 + WHERE zoom_level = 10 + UNION ALL + + -- etldoc: osm_park_polygon_gen3 -> layer_park_label:z11 + SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, area + FROM osm_park_polygon_gen3 + WHERE zoom_level = 11 + UNION ALL + + -- etldoc: osm_park_polygon_gen2 -> layer_park_label:z12 + SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, area + FROM osm_park_polygon_gen2 + WHERE zoom_level = 12 + UNION ALL + + -- etldoc: osm_park_polygon_gen1 -> layer_park_label:z13 + SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, area + FROM osm_park_polygon_gen1 + WHERE zoom_level = 13 + UNION ALL + + -- etldoc: osm_park_polygon -> layer_park_label:z14 + SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, area + FROM osm_park_polygon + WHERE zoom_level >= 14 + ) AS zoom_levels + WHERE geometry_point && bbox; +$$ LANGUAGE SQL IMMUTABLE; diff --git a/layers/park_label/mapping_diagram.png b/layers/park_label/mapping_diagram.png new file mode 100644 index 0000000..0c59a6d Binary files /dev/null and b/layers/park_label/mapping_diagram.png differ diff --git a/layers/park_label/park_label.yaml b/layers/park_label/park_label.yaml new file mode 100644 index 0000000..bfd60a7 --- /dev/null +++ b/layers/park_label/park_label.yaml @@ -0,0 +1,24 @@ +layer: + id: "park_label" + description: | + Labels for `park` layer. + buffer_size: 64 + fields: + name: The OSM [`name`](http://wiki.openstreetmap.org/wiki/Key:name) value of the peak. + name_en: English name `name:en` if available, otherwise `name`. + name_de: German name `name:de` if available, otherwise `name` or `name:en`. + class: + description: | + Use the **class** to differentiate between different parks. + values: + - national_park + - nature_reserve + rank: Rank of the park within one tile (starting at 1 that is the most important park). + datasource: + geometry_field: geometry + query: (SELECT geometry, class, name, name_en, name_de, {name_languages}, rank FROM layer_park_label(!bbox!, z(!scale_denominator!), !pixel_width!)) AS t +schema: + - ./layer.sql +datasources: + - type: imposm3 + mapping_file: ../park/mapping.yaml diff --git a/openmaptiles.yaml b/openmaptiles.yaml index 67067e8..5617608 100644 --- a/openmaptiles.yaml +++ b/openmaptiles.yaml @@ -6,6 +6,7 @@ tileset: - layers/landuse/landuse.yaml - layers/mountain_peak/mountain_peak.yaml - layers/park/park.yaml + - layers/park_label/park_label.yaml - layers/boundary/boundary.yaml - layers/aeroway/aeroway.yaml - layers/transportation/transportation.yaml