diff --git a/Makefile b/Makefile index fd9794e7..4e400dab 100644 --- a/Makefile +++ b/Makefile @@ -83,7 +83,7 @@ psql-pg-stat-reset: forced-clean-sql: docker-compose run --rm import-osm /usr/src/app/psql.sh -c "DROP SCHEMA IF EXISTS public CASCADE ; CREATE SCHEMA IF NOT EXISTS public; " - docker-compose run --rm import-osm /usr/src/app/psql.sh -c "CREATE EXTENSION hstore; CREATE EXTENSION postgis; CREATE EXTENSION pg_stat_statements;" + docker-compose run --rm import-osm /usr/src/app/psql.sh -c "CREATE EXTENSION hstore; CREATE EXTENSION postgis; CREATE EXTENSION unaccent; CREATE EXTENSION fuzzystrmatch; CREATE EXTENSION osml10n; CREATE EXTENSION pg_stat_statements;" docker-compose run --rm import-osm /usr/src/app/psql.sh -c "GRANT ALL ON SCHEMA public TO public;COMMENT ON SCHEMA public IS 'standard public schema';" pgclimb-list-views: diff --git a/README.md b/README.md index 68c1613c..0e9f7c71 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ docker-compose run generate-vectortiles ## License -All code in this repository is under the [BSD license](./LICENSE.md) and the cartography decisions encoded in the schema and SQL are licensed under [CC-BY](./LICENSE.md). +All code in this repository is under the [BSD license](./LICENSE.md) and the cartography decisions encoded in the schema and SQL are licensed under [CC-BY](./LICENSE.md). Products or services using maps derived from OpenMapTiles schema need to visibly credit "OpenMapTiles.org" or reference "OpenMapTiles" with a link to http://openmaptiles.org/. Exceptions to attribution requirement can be granted on request. diff --git a/docker-compose.yml b/docker-compose.yml index 36a4ae8a..7d11345c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,7 +4,7 @@ volumes: cache: services: postgres: - image: "openmaptiles/postgis:2.5" + image: "openmaptiles/postgis:2.8" volumes: - pgdata:/var/lib/postgresql/data networks: @@ -68,14 +68,14 @@ services: - ./build:/mapping - cache:/cache import-sql: - image: "openmaptiles/import-sql:0.1" + image: "openmaptiles/import-sql:0.5" env_file: .env networks: - postgres_conn volumes: - ./build:/sql openmaptiles-tools: - image: "openmaptiles/openmaptiles-tools:0.5" + image: "openmaptiles/openmaptiles-tools:0.6" env_file: .env networks: - postgres_conn diff --git a/layers/mountain_peak/layer.sql b/layers/mountain_peak/layer.sql index 303af77a..1fc292c3 100644 --- a/layers/mountain_peak/layer.sql +++ b/layers/mountain_peak/layer.sql @@ -3,13 +3,14 @@ -- etldoc: style="rounded,filled", label="layer_mountain_peak | z7+" ] ; CREATE OR REPLACE FUNCTION layer_mountain_peak(bbox geometry, zoom_level integer, pixel_width numeric) -RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de text, ele int, ele_ft int, "rank" int) AS $$ +RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de text, tags hstore, ele int, ele_ft int, "rank" int) AS $$ -- etldoc: osm_peak_point -> layer_mountain_peak:z7_ - SELECT osm_id, geometry, name, name_en, name_de, ele::int, ele_ft::int, rank::int + SELECT osm_id, geometry, name, name_en, name_de, tags, ele::int, ele_ft::int, 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, substring(ele from E'^(-?\\d+)(\\D|$)')::int AS ele, round(substring(ele from E'^(-?\\d+)(\\D|$)')::int*3.2808399)::int AS ele_ft, row_number() OVER ( diff --git a/layers/mountain_peak/mapping.yaml b/layers/mountain_peak/mapping.yaml index d73dc3d5..890fd583 100644 --- a/layers/mountain_peak/mapping.yaml +++ b/layers/mountain_peak/mapping.yaml @@ -17,6 +17,8 @@ tables: - name: name_de key: name:de type: string + - name: tags + type: hstore_tags - name: ele key: ele type: string diff --git a/layers/mountain_peak/mountain_peak.yaml b/layers/mountain_peak/mountain_peak.yaml index 1fa53a3e..ff78b87c 100644 --- a/layers/mountain_peak/mountain_peak.yaml +++ b/layers/mountain_peak/mountain_peak.yaml @@ -14,8 +14,9 @@ layer: datasource: geometry_field: geometry srid: 900913 - query: (SELECT osm_id, geometry, name, name_en, name_de, ele, ele_ft, rank FROM layer_mountain_peak(!bbox!, z(!scale_denominator!), !pixel_width!)) AS t + query: (SELECT osm_id, geometry, name, name_en, name_de, {name_languages}, ele, ele_ft, rank FROM layer_mountain_peak(!bbox!, z(!scale_denominator!), !pixel_width!)) AS t schema: + - ./name.sql - ./layer.sql datasources: - type: imposm3 diff --git a/layers/mountain_peak/name.sql b/layers/mountain_peak/name.sql new file mode 100644 index 00000000..7d527a86 --- /dev/null +++ b/layers/mountain_peak/name.sql @@ -0,0 +1,4 @@ +DO $$ +BEGIN + update osm_peak_point SET tags = slice_language_tags(tags) || get_basic_names(tags, geometry); +END $$; diff --git a/layers/place/city.sql b/layers/place/city.sql index eb19a609..879a1b99 100644 --- a/layers/place/city.sql +++ b/layers/place/city.sql @@ -4,10 +4,11 @@ -- etldoc: osm_city_point -> layer_city:z2_14 CREATE OR REPLACE FUNCTION layer_city(bbox geometry, zoom_level int, pixel_width numeric) -RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de text, place city_place, "rank" int, capital int) AS $$ +RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de text, tags hstore, place city_place, "rank" int, capital int) AS $$ SELECT osm_id, geometry, name, COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, + tags, place, "rank", normalize_capital_level(capital) AS capital FROM osm_city_point WHERE geometry && bbox @@ -18,6 +19,7 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de SELECT osm_id, geometry, name, COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, + tags, place, COALESCE("rank", gridrank + 10), normalize_capital_level(capital) AS capital @@ -25,6 +27,7 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de SELECT osm_id, geometry, name, COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, + tags, place, "rank", capital, row_number() OVER ( PARTITION BY LabelGrid(geometry, 128 * pixel_width) diff --git a/layers/place/layer.sql b/layers/place/layer.sql index 22fc3d47..9aba9b57 100644 --- a/layers/place/layer.sql +++ b/layers/place/layer.sql @@ -3,13 +3,14 @@ -- 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, class text, "rank" int, capital INT) AS $$ +RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de text, tags hstore, class text, "rank" int, capital INT) AS $$ -- etldoc: osm_continent_point -> layer_place:z0_3 SELECT 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 FROM osm_continent_point WHERE geometry && bbox AND zoom_level < 4 @@ -23,6 +24,7 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de 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 FROM osm_country_point WHERE geometry && bbox AND "rank" <= zoom_level + 1 AND name <> '' @@ -36,6 +38,7 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de 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 FROM osm_state_point WHERE geometry && bbox AND @@ -51,6 +54,7 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de 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 FROM osm_island_point WHERE zoom_level >= 12 @@ -63,6 +67,7 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de 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 FROM osm_island_polygon WHERE geometry && bbox AND @@ -77,6 +82,7 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de -- etldoc: layer_city -> layer_place:z12_14 SELECT osm_id, geometry, name, name_en, name_de, + tags, place::text AS class, "rank", capital FROM layer_city(bbox, zoom_level, pixel_width) ORDER BY "rank" ASC diff --git a/layers/place/mapping.yaml b/layers/place/mapping.yaml index 431132fc..d1c9099e 100644 --- a/layers/place/mapping.yaml +++ b/layers/place/mapping.yaml @@ -6,38 +6,10 @@ name_en_field: &name_en name: name_en key: name:en type: string -name_fr_field: &name_fr - name: name_fr - key: name:fr - type: string name_de_field: &name_de name: name_de key: name:de type: string -name_es_field: &name_es - name: name_es - key: name:es - type: string -name_pt_field: &name_pt - name: name_pt - key: name:pt - type: string -name_ru_field: &name_ru - name: name_ru - key: name:ru - type: string -name_zh_field: &name_zh - name: name_zh - key: name:zh - type: string -name_ar_field: &name_ar - name: name_ar - key: name:ar - type: string -name_ja_field: &name_ja - name: name_ja - key: name:ja - type: string rank_field: &rank name: rank key: rank @@ -56,6 +28,8 @@ tables: - *name - *name_en - *name_de + - name: tags + type: hstore_tags filters: require: name: ["__any__"] @@ -74,14 +48,9 @@ tables: - *name - *name_en - *name_de - - *name_fr - - *name_es - - *name_pt - - *name_ru - - *name_zh - - *name_ar - - *name_ja - *rank + - name: tags + type: hstore_tags filters: require: name: ["__any__"] @@ -104,13 +73,8 @@ tables: - *name - *name_en - *name_de - - *name_fr - - *name_es - - *name_pt - - *name_ru - - *name_zh - - *name_ar - - *name_ja + - name: tags + type: hstore_tags - *rank filters: require: @@ -130,13 +94,8 @@ tables: - *name - *name_en - *name_de - - *name_fr - - *name_es - - *name_pt - - *name_ru - - *name_zh - - *name_ar - - *name_ja + - name: tags + type: hstore_tags - *rank filters: require: @@ -156,13 +115,8 @@ tables: - *name - *name_en - *name_de - - *name_fr - - *name_es - - *name_pt - - *name_ru - - *name_zh - - *name_ar - - *name_ja + - name: tags + type: hstore_tags - name: is_in_country key: is_in:country type: string @@ -191,13 +145,8 @@ tables: - *name - *name_en - *name_de - - *name_fr - - *name_es - - *name_pt - - *name_ru - - *name_zh - - *name_ar - - *name_ja + - name: tags + type: hstore_tags - name: place key: place type: string diff --git a/layers/place/name.sql b/layers/place/name.sql new file mode 100644 index 00000000..878114dc --- /dev/null +++ b/layers/place/name.sql @@ -0,0 +1,9 @@ +DO $$ +BEGIN + update osm_continent_point SET tags = slice_language_tags(tags) || get_basic_names(tags, geometry); + update osm_country_point SET tags = slice_language_tags(tags) || get_basic_names(tags, geometry); + update osm_island_polygon SET tags = slice_language_tags(tags) || get_basic_names(tags, geometry); + update osm_island_point SET tags = slice_language_tags(tags) || get_basic_names(tags, geometry); + update osm_state_point SET tags = slice_language_tags(tags) || get_basic_names(tags, geometry); + update osm_city_point SET tags = slice_language_tags(tags) || get_basic_names(tags, geometry); +END $$; diff --git a/layers/place/place.yaml b/layers/place/place.yaml index 9507a9a1..7d19507f 100644 --- a/layers/place/place.yaml +++ b/layers/place/place.yaml @@ -53,8 +53,9 @@ layer: buffer_size: 256 datasource: geometry_field: geometry - query: (SELECT geometry, name, name_en, name_de, class, rank, capital FROM layer_place(!bbox!, z(!scale_denominator!), !pixel_width!)) AS t + query: (SELECT geometry, name, name_en, name_de, {name_languages}, class, rank, capital FROM layer_place(!bbox!, z(!scale_denominator!), !pixel_width!)) AS t schema: + - ./name.sql - ./types.sql - ./capital.sql - ./city.sql diff --git a/layers/poi/layer.sql b/layers/poi/layer.sql index 18bb6381..776fd06f 100644 --- a/layers/poi/layer.sql +++ b/layers/poi/layer.sql @@ -3,10 +3,11 @@ -- etldoc: label="layer_poi | z14+" ] ; CREATE OR REPLACE FUNCTION layer_poi(bbox geometry, zoom_level integer, pixel_width numeric) -RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de text, class text, subclass text, "rank" int) AS $$ +RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de text, tags hstore, class text, subclass text, "rank" int) AS $$ SELECT osm_id, geometry, NULLIF(name, '') AS name, COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, + tags, poi_class(subclass, mapping_key) AS class, subclass, row_number() OVER ( PARTITION BY LabelGrid(geometry, 100 * pixel_width) diff --git a/layers/poi/mapping.yaml b/layers/poi/mapping.yaml index 94675525..a0a03f65 100644 --- a/layers/poi/mapping.yaml +++ b/layers/poi/mapping.yaml @@ -315,6 +315,8 @@ tables: - name: name_de key: name:de type: string + - name: tags + type: hstore_tags - name: subclass type: mapping_value - name: mapping_key @@ -354,6 +356,8 @@ tables: - name: name_de key: name:de type: string + - name: tags + type: hstore_tags - name: subclass type: mapping_value - name: mapping_key diff --git a/layers/poi/name.sql b/layers/poi/name.sql new file mode 100644 index 00000000..06d23f89 --- /dev/null +++ b/layers/poi/name.sql @@ -0,0 +1,5 @@ +DO $$ +BEGIN + update osm_poi_point SET tags = slice_language_tags(tags) || get_basic_names(tags, geometry); + update osm_poi_polygon SET tags = slice_language_tags(tags) || get_basic_names(tags, geometry); +END $$; diff --git a/layers/poi/poi.yaml b/layers/poi/poi.yaml index 6be43695..d149d71a 100644 --- a/layers/poi/poi.yaml +++ b/layers/poi/poi.yaml @@ -34,9 +34,10 @@ layer: datasource: geometry_field: geometry srid: 900913 - query: (SELECT geometry, name, name_en, name_de, class, subclass, rank FROM layer_poi(!bbox!, z(!scale_denominator!), !pixel_width!)) AS t + query: (SELECT geometry, name, name_en, name_de, {name_languages}, class, subclass, rank FROM layer_poi(!bbox!, z(!scale_denominator!), !pixel_width!)) AS t schema: - ./poi_update.sql + - ./name.sql - ./poi_polygon_update.sql - ./class.sql - ./layer.sql diff --git a/layers/transportation_name/layer.sql b/layers/transportation_name/layer.sql index 79da0623..089e93ac 100644 --- a/layers/transportation_name/layer.sql +++ b/layers/transportation_name/layer.sql @@ -3,11 +3,12 @@ -- etldoc: label="layer_transportation_name | z6 | z7 | z8 | z9 | z10 | z11 | z12| z13| z14+" ] ; CREATE OR REPLACE FUNCTION layer_transportation_name(bbox geometry, zoom_level integer) -RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de text, ref text, ref_length int, network text, class text) AS $$ +RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de text, tags hstore, ref text, ref_length int, network text, class text) AS $$ SELECT osm_id, geometry, NULLIF(name, '') AS name, COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, + tags, NULLIF(ref, ''), NULLIF(LENGTH(ref), 0) AS ref_length, --TODO: The road network of the road is not yet implemented case diff --git a/layers/transportation_name/merge_highways.sql b/layers/transportation_name/merge_highways.sql index 09b9ed11..9b9c1269 100644 --- a/layers/transportation_name/merge_highways.sql +++ b/layers/transportation_name/merge_highways.sql @@ -13,9 +13,9 @@ CREATE MATERIALIZED VIEW osm_transportation_name_network AS ( SELECT hl.geometry, hl.osm_id, - hl.name, - hl.name_en, - hl.name_de, + CASE WHEN length(hl.name)>15 THEN osml10n_street_abbrev_all(hl.name) ELSE hl.name END AS "name", + CASE WHEN length(hl.name_en)>15 THEN osml10n_street_abbrev_en(hl.name_en) ELSE hl.name_en END AS "name_en", + CASE WHEN length(hl.name_de)>15 THEN osml10n_street_abbrev_de(hl.name_de) ELSE hl.name_de END AS "name_de", rm.network_type, CASE WHEN (rm.network_type is not null AND nullif(rm.ref::text, '') is not null) @@ -40,6 +40,9 @@ CREATE MATERIALIZED VIEW osm_transportation_name_linestring AS ( name, name_en, name_de, + get_basic_names(delete_empty_keys(hstore(ARRAY['name',name,'name:en',name_en,'name:de',name_de])), geometry) + || delete_empty_keys(hstore(ARRAY['name',name,'name:en',name_en,'name:de',name_de])) + AS "tags", ref, highway, network_type AS network, @@ -69,7 +72,7 @@ CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_highway_partial_id -- etldoc: osm_transportation_name_linestring -> osm_transportation_name_linestring_gen1 CREATE MATERIALIZED VIEW osm_transportation_name_linestring_gen1 AS ( - SELECT ST_Simplify(geometry, 50) AS geometry, osm_id, name, name_en, name_de, ref, highway, network, z_order + SELECT ST_Simplify(geometry, 50) AS geometry, osm_id, name, name_en, name_de, tags, ref, highway, network, z_order FROM osm_transportation_name_linestring WHERE highway IN ('motorway','trunk') AND ST_Length(geometry) > 8000 ); @@ -81,7 +84,7 @@ CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen1_highway_parti -- etldoc: osm_transportation_name_linestring_gen1 -> osm_transportation_name_linestring_gen2 CREATE MATERIALIZED VIEW osm_transportation_name_linestring_gen2 AS ( - SELECT ST_Simplify(geometry, 120) AS geometry, osm_id, name, name_en, name_de, ref, highway, network, z_order + SELECT ST_Simplify(geometry, 120) AS geometry, osm_id, name, name_en, name_de, tags, ref, highway, network, z_order FROM osm_transportation_name_linestring_gen1 WHERE highway IN ('motorway','trunk') AND ST_Length(geometry) > 14000 ); @@ -93,7 +96,7 @@ CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen2_highway_parti -- etldoc: osm_transportation_name_linestring_gen2 -> osm_transportation_name_linestring_gen3 CREATE MATERIALIZED VIEW osm_transportation_name_linestring_gen3 AS ( - SELECT ST_Simplify(geometry, 200) AS geometry, osm_id, name, name_en, name_de, ref, highway, network, z_order + SELECT ST_Simplify(geometry, 200) AS geometry, osm_id, name, name_en, name_de, tags, ref, highway, network, z_order FROM osm_transportation_name_linestring_gen2 WHERE highway = 'motorway' AND ST_Length(geometry) > 20000 ); @@ -105,7 +108,7 @@ CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen3_highway_parti -- etldoc: osm_transportation_name_linestring_gen3 -> osm_transportation_name_linestring_gen4 CREATE MATERIALIZED VIEW osm_transportation_name_linestring_gen4 AS ( - SELECT ST_Simplify(geometry, 500) AS geometry, osm_id, name, name_en, name_de, ref, highway, network, z_order + SELECT ST_Simplify(geometry, 500) AS geometry, osm_id, name, name_en, name_de, tags, ref, highway, network, z_order FROM osm_transportation_name_linestring_gen3 WHERE highway = 'motorway' AND ST_Length(geometry) > 20000 ); diff --git a/layers/transportation_name/transportation_name.yaml b/layers/transportation_name/transportation_name.yaml index 51682470..c1c608f8 100644 --- a/layers/transportation_name/transportation_name.yaml +++ b/layers/transportation_name/transportation_name.yaml @@ -46,7 +46,7 @@ layer: datasource: geometry_field: geometry srid: 900913 - query: (SELECT geometry, name, name_en, name_de, ref, ref_length, network::text, class::text FROM layer_transportation_name(!bbox!, z(!scale_denominator!))) AS t + query: (SELECT geometry, name, name_en, name_de, {name_languages}, ref, ref_length, network::text, class::text FROM layer_transportation_name(!bbox!, z(!scale_denominator!))) AS t schema: - ./network_type.sql - ./merge_highways.sql diff --git a/layers/water/mapping.yaml b/layers/water/mapping.yaml index f426b399..24f5dcfa 100644 --- a/layers/water/mapping.yaml +++ b/layers/water/mapping.yaml @@ -58,6 +58,8 @@ tables: - name: name_de key: name:de type: string + - name: tags + type: hstore_tags - name: natural key: natural type: string diff --git a/layers/water_name/layer.sql b/layers/water_name/layer.sql index f84b107b..38c377b2 100644 --- a/layers/water_name/layer.sql +++ b/layers/water_name/layer.sql @@ -3,12 +3,13 @@ -- etldoc: label="layer_water_name | z0_8 | z9_13 | z14+" ] ; CREATE OR REPLACE FUNCTION layer_water_name(bbox geometry, zoom_level integer) -RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de text, class text) AS $$ +RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de text, tags hstore, class text) AS $$ -- etldoc: osm_water_lakeline -> layer_water_name:z9_13 -- etldoc: osm_water_lakeline -> layer_water_name:z14_ SELECT osm_id, geometry, name, COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, + tags, 'lake'::text AS class FROM osm_water_lakeline WHERE geometry && bbox @@ -20,6 +21,7 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de SELECT osm_id, geometry, name, COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, + tags, 'lake'::text AS class FROM osm_water_point WHERE geometry && bbox AND ( @@ -33,6 +35,7 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de SELECT osm_id, geometry, name, COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, + tags, place::text AS class FROM osm_marine_point WHERE geometry && bbox AND ( diff --git a/layers/water_name/mapping.yaml b/layers/water_name/mapping.yaml index 75532dde..64f06d43 100644 --- a/layers/water_name/mapping.yaml +++ b/layers/water_name/mapping.yaml @@ -16,6 +16,8 @@ tables: - name: name_de key: name:de type: string + - name: tags + type: hstore_tags - name: place key: place type: string diff --git a/layers/water_name/name.sql b/layers/water_name/name.sql new file mode 100644 index 00000000..09ae1c6b --- /dev/null +++ b/layers/water_name/name.sql @@ -0,0 +1,5 @@ +DO $$ +BEGIN + update osm_marine_point SET tags = slice_language_tags(tags) || get_basic_names(tags, geometry); + update osm_water_polygon SET tags = slice_language_tags(tags) || get_basic_names(tags, geometry); +END $$; diff --git a/layers/water_name/water_lakeline.sql b/layers/water_name/water_lakeline.sql index 7a81fc65..94a10cea 100644 --- a/layers/water_name/water_lakeline.sql +++ b/layers/water_name/water_lakeline.sql @@ -8,7 +8,7 @@ DROP MATERIALIZED VIEW IF EXISTS osm_water_lakeline CASCADE; CREATE MATERIALIZED VIEW osm_water_lakeline AS ( SELECT wp.osm_id, ll.wkb_geometry AS geometry, - name, name_en, name_de, ST_Area(wp.geometry) AS area + name, name_en, name_de, tags, ST_Area(wp.geometry) AS area FROM osm_water_polygon AS wp INNER JOIN lake_centerline ll ON wp.osm_id = ll.osm_id WHERE wp.name <> '' diff --git a/layers/water_name/water_name.yaml b/layers/water_name/water_name.yaml index 28c94792..72e6a274 100644 --- a/layers/water_name/water_name.yaml +++ b/layers/water_name/water_name.yaml @@ -18,8 +18,9 @@ layer: datasource: geometry_field: geometry srid: 900913 - query: (SELECT geometry, name, name_en, name_de, class FROM layer_water_name(!bbox!, z(!scale_denominator!))) AS t + query: (SELECT geometry, name, name_en, name_de, {name_languages}, class FROM layer_water_name(!bbox!, z(!scale_denominator!))) AS t schema: + - ./name.sql - ./merge_marine_rank.sql - ./water_lakeline.sql - ./water_point.sql diff --git a/layers/water_name/water_point.sql b/layers/water_name/water_point.sql index 895bf4dc..490ce03e 100644 --- a/layers/water_name/water_point.sql +++ b/layers/water_name/water_point.sql @@ -8,7 +8,7 @@ DROP MATERIALIZED VIEW IF EXISTS osm_water_point CASCADE; CREATE MATERIALIZED VIEW osm_water_point AS ( SELECT wp.osm_id, ST_PointOnSurface(wp.geometry) AS geometry, - wp.name, wp.name_en, wp.name_de, ST_Area(wp.geometry) AS area + wp.name, wp.name_en, wp.name_de, wp.tags, ST_Area(wp.geometry) AS area FROM osm_water_polygon AS wp LEFT JOIN lake_centerline ll ON wp.osm_id = ll.osm_id WHERE ll.osm_id IS NULL AND wp.name <> '' diff --git a/layers/waterway/mapping.yaml b/layers/waterway/mapping.yaml index 68b8e899..479461e9 100644 --- a/layers/waterway/mapping.yaml +++ b/layers/waterway/mapping.yaml @@ -35,6 +35,8 @@ tables: - name: name_de key: name:de type: string + - name: tags + type: hstore_tags mapping: waterway: - stream diff --git a/layers/waterway/merge_waterway.sql b/layers/waterway/merge_waterway.sql index 3b734cbe..beb66374 100644 --- a/layers/waterway/merge_waterway.sql +++ b/layers/waterway/merge_waterway.sql @@ -22,21 +22,21 @@ CREATE INDEX IF NOT EXISTS osm_waterway_linestring_name_partial_idx CREATE MATERIALIZED VIEW osm_important_waterway_linestring AS ( SELECT (ST_Dump(geometry)).geom AS geometry, - name, name_en, name_de + name, name_en, name_de, tags FROM ( SELECT ST_LineMerge(ST_Union(geometry)) AS geometry, - name, name_en, name_de + name, name_en, name_de, tags FROM osm_waterway_linestring WHERE name <> '' AND waterway = 'river' - GROUP BY name, name_en, name_de + GROUP BY name, name_en, name_de, tags ) AS waterway_union ); CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_geometry_idx ON osm_important_waterway_linestring USING gist(geometry); -- etldoc: osm_important_waterway_linestring -> osm_important_waterway_linestring_gen1 CREATE MATERIALIZED VIEW osm_important_waterway_linestring_gen1 AS ( - SELECT ST_Simplify(geometry, 60) AS geometry, name, name_en, name_de + SELECT ST_Simplify(geometry, 60) AS geometry, name, name_en, name_de, tags FROM osm_important_waterway_linestring WHERE ST_Length(geometry) > 1000 ); @@ -44,7 +44,7 @@ CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen1_geometry_idx O -- etldoc: osm_important_waterway_linestring_gen1 -> osm_important_waterway_linestring_gen2 CREATE MATERIALIZED VIEW osm_important_waterway_linestring_gen2 AS ( - SELECT ST_Simplify(geometry, 100) AS geometry, name, name_en, name_de + SELECT ST_Simplify(geometry, 100) AS geometry, name, name_en, name_de, tags FROM osm_important_waterway_linestring_gen1 WHERE ST_Length(geometry) > 4000 ); @@ -52,7 +52,7 @@ CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen2_geometry_idx O -- etldoc: osm_important_waterway_linestring_gen2 -> osm_important_waterway_linestring_gen3 CREATE MATERIALIZED VIEW osm_important_waterway_linestring_gen3 AS ( - SELECT ST_Simplify(geometry, 200) AS geometry, name, name_en, name_de + SELECT ST_Simplify(geometry, 200) AS geometry, name, name_en, name_de, tags FROM osm_important_waterway_linestring_gen2 WHERE ST_Length(geometry) > 8000 ); diff --git a/layers/waterway/name.sql b/layers/waterway/name.sql new file mode 100644 index 00000000..93fe793c --- /dev/null +++ b/layers/waterway/name.sql @@ -0,0 +1,4 @@ +DO $$ +BEGIN + update osm_waterway_linestring SET tags = slice_language_tags(tags) || get_basic_names(tags, geometry); +END $$; diff --git a/layers/waterway/waterway.sql b/layers/waterway/waterway.sql index 919340ea..1a906dfd 100644 --- a/layers/waterway/waterway.sql +++ b/layers/waterway/waterway.sql @@ -1,66 +1,67 @@ -- etldoc: ne_110m_rivers_lake_centerlines -> waterway_z3 CREATE OR REPLACE VIEW waterway_z3 AS ( - SELECT geometry, 'river'::text AS class, NULL::text AS name, NULL::text AS name_en, NULL::text AS name_de + SELECT geometry, 'river'::text AS class, NULL::text AS name, NULL::text AS name_en, NULL::text AS name_de, NULL::hstore AS tags FROM ne_110m_rivers_lake_centerlines WHERE featurecla = 'River' ); -- etldoc: ne_50m_rivers_lake_centerlines -> waterway_z4 CREATE OR REPLACE VIEW waterway_z4 AS ( - SELECT geometry, 'river'::text AS class, NULL::text AS name, NULL::text AS name_en, NULL::text AS name_de + SELECT geometry, 'river'::text AS class, NULL::text AS name, NULL::text AS name_en, NULL::text AS name_de, NULL::hstore AS tags FROM ne_50m_rivers_lake_centerlines WHERE featurecla = 'River' ); -- etldoc: ne_10m_rivers_lake_centerlines -> waterway_z6 CREATE OR REPLACE VIEW waterway_z6 AS ( - SELECT geometry, 'river'::text AS class, NULL::text AS name, NULL::text AS name_en, NULL::text AS name_de + SELECT geometry, 'river'::text AS class, NULL::text AS name, NULL::text AS name_en, NULL::text AS name_de, NULL::hstore AS tags FROM ne_10m_rivers_lake_centerlines WHERE featurecla = 'River' ); -- etldoc: osm_important_waterway_linestring_gen3 -> waterway_z9 CREATE OR REPLACE VIEW waterway_z9 AS ( - SELECT geometry, 'river'::text AS class, name, name_en, name_de FROM osm_important_waterway_linestring_gen3 + SELECT geometry, 'river'::text AS class, name, name_en, name_de, tags FROM osm_important_waterway_linestring_gen3 ); -- etldoc: osm_important_waterway_linestring_gen2 -> waterway_z10 CREATE OR REPLACE VIEW waterway_z10 AS ( - SELECT geometry, 'river'::text AS class, name, name_en, name_de FROM osm_important_waterway_linestring_gen2 + SELECT geometry, 'river'::text AS class, name, name_en, name_de, tags FROM osm_important_waterway_linestring_gen2 ); -- etldoc:osm_important_waterway_linestring_gen1 -> waterway_z11 CREATE OR REPLACE VIEW waterway_z11 AS ( - SELECT geometry, 'river'::text AS class, name, name_en, name_de FROM osm_important_waterway_linestring_gen1 + SELECT geometry, 'river'::text AS class, name, name_en, name_de, tags FROM osm_important_waterway_linestring_gen1 ); -- etldoc: osm_waterway_linestring -> waterway_z12 CREATE OR REPLACE VIEW waterway_z12 AS ( - SELECT geometry, waterway AS class, name, name_en, name_de FROM osm_waterway_linestring + SELECT geometry, waterway AS class, name, name_en, name_de, tags FROM osm_waterway_linestring WHERE waterway IN ('river', 'canal') ); -- etldoc: osm_waterway_linestring -> waterway_z13 CREATE OR REPLACE VIEW waterway_z13 AS ( - SELECT geometry, waterway::text AS class, name, name_en, name_de FROM osm_waterway_linestring + SELECT geometry, waterway::text AS class, name, name_en, name_de, tags FROM osm_waterway_linestring WHERE waterway IN ('river', 'canal', 'stream', 'drain', 'ditch') ); -- etldoc: osm_waterway_linestring -> waterway_z14 CREATE OR REPLACE VIEW waterway_z14 AS ( - SELECT geometry, waterway::text AS class, name, name_en, name_de FROM osm_waterway_linestring + SELECT geometry, waterway::text AS class, name, name_en, name_de, tags FROM osm_waterway_linestring ); -- etldoc: layer_waterway[shape=record fillcolor=lightpink, style="rounded,filled", -- etldoc: label="layer_waterway | z3 | z4-z5 | z6-8 | z9 | z10 | z11 | z12| z13| z14+" ]; CREATE OR REPLACE FUNCTION layer_waterway(bbox geometry, zoom_level int) -RETURNS TABLE(geometry geometry, class text, name text, name_en text, name_de text) AS $$ +RETURNS TABLE(geometry geometry, class text, name text, name_en text, name_de text, tags hstore) AS $$ SELECT geometry, class, NULLIF(name, '') AS name, COALESCE(NULLIF(name_en, ''), name) AS name_en, - COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de + COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, + tags FROM ( -- etldoc: waterway_z3 -> layer_waterway:z3 SELECT * FROM waterway_z3 WHERE zoom_level = 3 diff --git a/layers/waterway/waterway.yaml b/layers/waterway/waterway.yaml index fe5d03a0..263485a9 100644 --- a/layers/waterway/waterway.yaml +++ b/layers/waterway/waterway.yaml @@ -23,8 +23,9 @@ layer: - ditch datasource: geometry_field: geometry - query: (SELECT geometry, name, name_en, name_de, class FROM layer_waterway(!bbox!, z(!scale_denominator!))) AS t + query: (SELECT geometry, name, name_en, name_de, {name_languages}, class FROM layer_waterway(!bbox!, z(!scale_denominator!))) AS t schema: + - ./name.sql - ./merge_waterway.sql - ./waterway.sql datasources: diff --git a/openmaptiles.yaml b/openmaptiles.yaml index b3d320da..757eecb8 100644 --- a/openmaptiles.yaml +++ b/openmaptiles.yaml @@ -24,6 +24,64 @@ tileset: maxzoom: 14 minzoom: 0 pixel_scale: 256 + languages: + - ar # Arabic + - az # Azerbaijani + - be # Belarusian + - bg # Bulgarian + - br # Breton + - bs # Bosnian + - ca # Catalan + - cs # Czech + - cy # Welsh + - da # Danish + - de # German + - el # Greek + - en # English + - es # Spanish + - et # Estonian + - fi # Finnish + - fr # French + - fy # Western Frisian + - ga # Irish + - gd # Scottish Gaelic + - he # Hebrew + - hr # Croatian + - hu # Hungarian + - hy # Armenian + - is # Icelandic + - it # Italian + - ja # Japanese + - ja_kana # Japanese Kana form + - ja_rm # romanization of Japanese (written with Latin) + - ka # Georgian + - kk # Kazakh + - kn # Kannada + - ko # Korean + - ko_rm # romanization of Korean (written with Latin) + - la # Latin + - lb # Luxembourgish + - lt # Lithuanian + - lv # Latvian + - mk # Macedonian + - mt # Maltese + - nl # Dutch + - "no" # Norwegian + - pl # Polish + - pt # Portuguese + - rm # Romansh + - ro # Romania + - ru # Russian + - sk # Slovak + - sl # Slovene + - sq # Albanian + - sr # Serbian written with Cyrillic + - sr-Latn # Serbian written with Latin + - sv # Swedish + - th # Thai + - tr # Turkish + - uk # Ukrainian + - zh # Chinese defaults: 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: diff --git a/qa/osm_gen_sizes.py b/qa/table_sizes.py similarity index 93% rename from qa/osm_gen_sizes.py rename to qa/table_sizes.py index a210d9be..f3ed9a1b 100755 --- a/qa/osm_gen_sizes.py +++ b/qa/table_sizes.py @@ -15,7 +15,6 @@ FROM ( pg_total_relation_size(relid) as "size" FROM pg_catalog.pg_statio_user_tables WHERE schemaname='public' - AND relname::text ~ '^osm_.*_gen[0-9]{1,2}$' ) a ;""".replace('\"', '\\\"') @@ -27,8 +26,7 @@ TABLE_SIZES_SQL="""SELECT FROM pg_catalog.pg_statio_user_tables a LEFT JOIN pg_stat_user_tables b ON (a.relid = b.relid) WHERE - a.schemaname='public' AND - a.relname::text ~ '^osm_.*_gen[0-9]{1,2}$' + a.schemaname='public' ORDER BY a.relname; """.replace('\"', '\\\"') @@ -37,8 +35,7 @@ TABLES_SQL = """SELECT a.relname FROM pg_catalog.pg_statio_user_tables a WHERE - a.schemaname='public' AND - a.relname::text ~ '^osm_.*_gen[0-9]{1,2}$' + a.schemaname='public' ORDER BY a.relname; """ @@ -51,7 +48,8 @@ WHERE c.relkind IN('r', 'v', 'm') AND a.attnum > 0 AND n.nspname = 'public' AND - c.relname = '{0}' + c.relname = '{0}' AND + a.attisdropped = FALSE ORDER BY a.attname; """ @@ -101,7 +99,7 @@ if __name__ == "__main__": subprocess.check_output("make psql-analyze", shell=True) - print "Total size of osm_.*_gen[0-9]+ tables" + print "Total size of tables" cmds = [ 'docker-compose run --rm import-osm', '/usr/src/app/psql.sh -F\",\" --no-align -P pager=off',