diff --git a/Makefile b/Makefile index ca51ae4..8ff02da 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,5 @@ all: build/openmaptiles.tm2source/data.yml build/mapping.yaml build/tileset.sql -.PHONY: docs -docs: layers/railway/README.md layers/boundary/README.md layers/water/README.md layers/building/README.md layers/highway/README.md layers/highway_name/README.md layers/poi/README.md layers/place/README.md layers/waterway/README.md layers/water_name/README.md layers/landcover/README.md layers/landuse/README.md layers/housenumber/README.md - build/openmaptiles.tm2source/data.yml: mkdir -p build/openmaptiles.tm2source && generate-tm2source openmaptiles.yaml --host="postgres" --port=5432 --database="openmaptiles" --user="openmaptiles" --password="openmaptiles" > build/openmaptiles.tm2source/data.yml @@ -12,44 +9,5 @@ build/mapping.yaml: build/tileset.sql: mkdir -p build && generate-sql openmaptiles.yaml > build/tileset.sql -layers/poi/README.md: - generate-doc layers/poi/poi.yaml --diagram layers/poi/mapping > layers/poi/README.md - -layers/highway/README.md: - generate-doc layers/highway/highway.yaml --diagram layers/highway/mapping > layers/highway/README.md - -layers/highway_name/README.md: - generate-doc layers/highway_name/highway_name.yaml > layers/highway_name/README.md - -layers/railway/README.md: - generate-doc layers/railway/railway.yaml --diagram layers/railway/mapping > layers/railway/README.md - -layers/boundary/README.md: - generate-doc layers/boundary/boundary.yaml --diagram layers/boundary/mapping > layers/boundary/README.md - -layers/water_name/README.md: - generate-doc layers/water_name/water_name.yaml > layers/water_name/README.md - -layers/water/README.md: - generate-doc layers/water/water.yaml --diagram layers/water/mapping > layers/water/README.md - -layers/waterway/README.md: - generate-doc layers/waterway/waterway.yaml --diagram layers/waterway/mapping > layers/waterway/README.md - -layers/building/README.md: - generate-doc layers/building/building.yaml > layers/building/README.md - -layers/place/README.md: - generate-doc layers/place/place.yaml --diagram layers/place/mapping > layers/place/README.md - -layers/landuse/README.md: - generate-doc layers/landuse/landuse.yaml --diagram layers/landuse/mapping > layers/landuse/README.md - -layers/landcover/README.md: - generate-doc layers/landcover/landcover.yaml --diagram layers/landcover/mapping > layers/landcover/README.md - -layers/housenumber/README.md: - generate-doc layers/housenumber/housenumber.yaml > layers/housenumber/README.md - clean: - rm -f build/openmaptiles.tm2source/data.yml && rm -f build/mapping.yaml && rm -f build/tileset.sql && rm -f layers/**/README.md&& rm -f layers/**/*.png + rm -f build/openmaptiles.tm2source/data.yml && rm -f build/mapping.yaml && rm -f build/tileset.sql diff --git a/README.md b/README.md index 6fcdc06..a6d0cd3 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,18 @@ ## OpenMapTiles -OpenMapTiles is a collection of vector tile layers you can mix and match to create your own vector tile sets -It is used by [OSM2VectorTiles](http://osm2vectortiles.org/) and we encourage you to collaborate, reuse and adapt existing layers -and add your own layers. +OpenMapTiles is an extensible vector tile schema you can use or mix and match to create your own vector tile sets. +It is used by [OSM2VectorTiles](http://osm2vectortiles.org/) and we encourage you to collaborate, reuse and adapt existing layers and add your own layers. -You define a self contained **Layer** together with SQL files and layer and data source definitions (like a imposm3 mapping file) -that you can then reference in a **Tileset** where you mix and match with other layers. +You define a self contained **Layer** together with SQL files and layer and data source definitions (like an imposm3 mapping file) that you can then reference in a **Tileset** where you mix and match with other layers. + +## Styles + +You can start from several styles supporting the OpenMapTiles vector schema. + +- [OSM Bright](https://github.com/openmaptiles/osm-bright-gl-style) +- [Positron](https://github.com/openmaptiles/positron-gl-style) +- [Dark Matter](https://github.com/openmaptiles/dark-matter-gl-style) +- [Klokantech Basic](https://github.com/openmaptiles/klokantech-basic-gl-style) ## Layers @@ -17,19 +24,19 @@ We welcome new standard layers from other data sources or import tools (like osm Each layer is documented and self contained. Click on the link for each layer to get more information. Layers can be chosen to create a **Tileset** like the `openmaptiles.yaml` tileset. -- [boundary](layers/boundary/README.md) -- [building](layers/building/README.md) -- [highway](layers/highway/README.md) -- [highway_name](layers/highway_name/README.md) -- [housenumber](layers/housenumber/README.md) -- [landcover](layers/landcover/README.md) -- [landuse](layers/landuse/README.md) -- [place](layers/place/README.md) -- [poi](layers/poi/README.md) -- [railway](layers/railway/README.md) -- [water](layers/water/README.md) -- [water_name](layers/water_name/README.md) -- [waterway](layers/waterway/README.md) +- [boundary](https://github.com/openmaptiles/openmaptiles/wiki/boundary) +- [building](https://github.com/openmaptiles/openmaptiles/wiki/building) +- [transportation](https://github.com/openmaptiles/openmaptiles/wiki/transportation) +- [transportation_name](https://github.com/openmaptiles/openmaptiles/wiki/transportation_name) +- [housenumber](https://github.com/openmaptiles/openmaptiles/wiki/housenumber) +- [landcover](https://github.com/openmaptiles/openmaptiles/wiki/landcover) +- [landuse](https://github.com/openmaptiles/openmaptiles/wiki/landuse) +- [place](https://github.com/openmaptiles/openmaptiles/wiki/place) +- [poi](https://github.com/openmaptiles/openmaptiles/wiki/poi) +- [park](https://github.com/openmaptiles/openmaptiles/wiki/park) +- [water](https://github.com/openmaptiles/openmaptiles/wiki/water) +- [water_name](https://github.com/openmaptiles/openmaptiles/wiki/water_name) +- [waterway](https://github.com/openmaptiles/openmaptiles/wiki/waterway) ### Define your own Layer diff --git a/docker-compose.yml b/docker-compose.yml index 8e3e8ed..2720009 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,24 +1,26 @@ version: "2" +volumes: + pgdata: services: postgres: image: "openmaptiles/postgis:2.2" volumes: - - ./pgdata:/var/lib/postgresql/data + - pgdata:/var/lib/postgresql/data ports: - "5432" env_file: .env import-natural-earth: - image: "openmaptiles/import-natural-earth" + image: "openmaptiles/import-natural-earth:1.0" env_file: .env links: - postgres import-water: - image: "openmaptiles/import-water" + image: "openmaptiles/import-water:0.2" env_file: .env links: - postgres import-lakelines: - image: "openmaptiles/import-lakelines" + image: "openmaptiles/import-lakelines:0.9" env_file: .env links: - postgres diff --git a/layers/boundary/README.md b/layers/boundary/README.md deleted file mode 100644 index 98e6827..0000000 --- a/layers/boundary/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# boundary - -Contains administrative boundaries as linestrings (no maritime boundaries yet) as linestrings. -Until z7 [Natural Earth data](http://www.naturalearthdata.com/downloads/10m-cultural-vectors/10m-admin-0-countries/) -is used after which OSM boundaries ([`boundary=administrative`](http://wiki.openstreetmap.org/wiki/Tag:boundary%3Dadministrative)) are present from z8 to z14. -OSM data contains all [`admin_level`](http://wiki.openstreetmap.org/wiki/Tag:boundary%3Dadministrative#admin_level) -but for most styles it makes sense to just style `admin_level=2` and `admin_level=4`. - -## Fields - -- **admin_level**: OSM [admin_level](http://wiki.openstreetmap.org/wiki/Tag:boundary%3Dadministrative#admin_level) -indicating the level of importance of this boundary. -At low zoom levels the Natural Earth boundaries are mapped to the equivalent admin levels. - -## Mapping - -![](mapping.png) - - diff --git a/layers/boundary/boundary.sql b/layers/boundary/boundary.sql index f7cd745..5045e15 100644 --- a/layers/boundary/boundary.sql +++ b/layers/boundary/boundary.sql @@ -56,6 +56,18 @@ CREATE OR REPLACE VIEW boundary_z5 AS ( WHERE scalerank <= 7 AND featurecla = 'Adm-1 boundary' ); +-- etldoc: ne_10m_admin_0_boundary_lines_land -> boundary_z6 +-- etldoc: ne_10m_admin_1_states_provinces_lines_shp -> boundary_z6 + +CREATE OR REPLACE VIEW boundary_z6 AS ( + SELECT geom, 2 AS admin_level + FROM ne_10m_admin_0_boundary_lines_land + UNION ALL + SELECT geom, 4 AS admin_level + FROM ne_10m_admin_1_states_provinces_lines_shp + WHERE scalerank <= 9 AND featurecla = 'Adm-1 boundary' +); + -- etldoc: ne_10m_admin_0_boundary_lines_land -> boundary_z7 -- etldoc: ne_10m_admin_1_states_provinces_lines_shp -> boundary_z7 CREATE OR REPLACE VIEW boundary_z7 AS ( @@ -102,8 +114,8 @@ CREATE OR REPLACE VIEW boundary_z12 AS ( FROM osm_boundary_linestring_gen1 ); --- etldoc: layer_boundary[shape=record fillcolor=lightpink, style="rounded,filled", --- etldoc: label=" layer_boundary | z0 | z1_2 | z3 | z4 | z5_6 | z7 | z8 | z9 | z10 | z11 | z12| z13_ " ] +-- etldoc: layer_boundary[shape=record fillcolor=lightpink, style="rounded,filled", +-- etldoc: label=" layer_boundary | z0 | z1_2 | z3 | z4 | z5 || z6 || z7 | z8 | z9 | z10 | z11 | z12| z13+"] CREATE OR REPLACE FUNCTION layer_boundary (bbox geometry, zoom_level int) RETURNS TABLE(geometry geometry, admin_level int) AS $$ @@ -120,8 +132,11 @@ RETURNS TABLE(geometry geometry, admin_level int) AS $$ -- etldoc: boundary_z4 -> layer_boundary:z4 SELECT * FROM boundary_z4 WHERE geom && bbox AND zoom_level = 4 UNION ALL - -- etldoc: boundary_z5 -> layer_boundary:z5_6 - SELECT * FROM boundary_z5 WHERE geom && bbox AND zoom_level BETWEEN 5 AND 6 + -- etldoc: boundary_z5 -> layer_boundary:z5 + SELECT * FROM boundary_z5 WHERE geom && bbox AND zoom_level = 5 + UNION ALL + -- etldoc: boundary_z6 -> layer_boundary:z6 + SELECT * FROM boundary_z6 WHERE geom && bbox AND zoom_level = 6 UNION ALL -- etldoc: boundary_z7 -> layer_boundary:z7 SELECT * FROM boundary_z7 WHERE geom && bbox AND zoom_level = 7 @@ -141,7 +156,7 @@ RETURNS TABLE(geometry geometry, admin_level int) AS $$ -- etldoc: boundary_z12 -> layer_boundary:z12 SELECT * FROM boundary_z12 WHERE geom && bbox AND zoom_level = 12 UNION ALL - -- etldoc: boundary_z12 -> layer_boundary:z13_ + -- etldoc: boundary_z12 -> layer_boundary:z13 SELECT * FROM boundary_z12 WHERE geom && bbox AND zoom_level >= 13 ) AS zoom_levels; $$ LANGUAGE SQL IMMUTABLE; diff --git a/layers/boundary/mapping.png b/layers/boundary/mapping.png deleted file mode 100644 index 72032cd..0000000 Binary files a/layers/boundary/mapping.png and /dev/null differ diff --git a/layers/boundary/mapping.yaml b/layers/boundary/mapping.yaml index 6223c54..5eee06e 100644 --- a/layers/boundary/mapping.yaml +++ b/layers/boundary/mapping.yaml @@ -3,27 +3,27 @@ generalized_tables: # etldoc: imposm3 -> osm_boundary_linestring_gen5 boundary_linestring_gen5: source: boundary_linestring - tolerance: 420.0 + tolerance: 480.0 # etldoc: imposm3 -> osm_boundary_linestring_gen4 boundary_linestring_gen4: source: boundary_linestring - tolerance: 320.0 + tolerance: 240.0 # etldoc: imposm3 -> osm_boundary_linestring_gen3 boundary_linestring_gen3: source: boundary_linestring - tolerance: 150.0 + tolerance: 120.0 # etldoc: imposm3 -> osm_boundary_linestring_gen2 boundary_linestring_gen2: source: boundary_linestring - tolerance: 100.0 + tolerance: 60.0 # etldoc: imposm3 -> osm_boundary_linestring_gen1 boundary_linestring_gen1: source: boundary_linestring - tolerance: 50.0 + tolerance: 30.0 tables: # etldoc: imposm3 -> osm_boundary_linestring diff --git a/layers/building/README.md b/layers/building/README.md deleted file mode 100644 index 9762193..0000000 --- a/layers/building/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# building - -All [OSM Buildings](http://wiki.openstreetmap.org/wiki/Buildings). All building tags are imported ([`building=*`](http://wiki.openstreetmap.org/wiki/Key:building)). The buildings are not yet ready for 3D rendering support and any help to improve -this is welcomed. - -## Fields - -- **render_height**: An approximated height from levels and height of building after the method of Paul Norman in [OSM Clear](https://github.com/ClearTables/osm-clear). For future 3D rendering of buildings. - - - diff --git a/layers/building/building.sql b/layers/building/building.sql index f75ea61..1db198a 100644 --- a/layers/building/building.sql +++ b/layers/building/building.sql @@ -1,22 +1,23 @@ - - - --- etldoc: layer_building[shape=record fillcolor=lightpink, style="rounded,filled", +-- etldoc: layer_building[shape=record fillcolor=lightpink, style="rounded,filled", -- etldoc: label="layer_building | z13 | z14_ " ] ; CREATE OR REPLACE FUNCTION layer_building(bbox geometry, zoom_level int) RETURNS TABLE(geom geometry, osm_id bigint, render_height int, render_min_height int) AS $$ - SELECT geometry, osm_id, - greatest(5, COALESCE(height, levels*3.66,5))::int AS render_height, - greatest(0, COALESCE(min_height, min_level*3.66,0))::int AS render_min_height + SELECT geometry, osm_id, render_height, render_min_height FROM ( - -- etldoc: osm_building_polygon_gen1 -> layer_building:z13 - SELECT osm_id, geometry, height, levels, min_height, min_level FROM osm_building_polygon_gen1 + SELECT + osm_id, geometry, + NULL::int AS render_height, NULL::int AS render_min_height + FROM osm_building_polygon_gen1 WHERE zoom_level = 13 AND geometry && bbox AND area > 1400 UNION ALL -- etldoc: osm_building_polygon -> layer_building:z14_ - SELECT osm_id, geometry, height, levels, min_height, min_level FROM osm_building_polygon + SELECT + osm_id, geometry, + greatest(5, COALESCE(height, levels*3.66,5))::int AS render_height, + greatest(0, COALESCE(min_height, min_level*3.66,0))::int AS render_min_height + FROM osm_building_polygon WHERE zoom_level >= 14 AND geometry && bbox ) AS zoom_levels ORDER BY render_height ASC, ST_YMin(geometry) DESC; diff --git a/layers/building/mapping.yaml b/layers/building/mapping.yaml index 31d1bd4..9270359 100644 --- a/layers/building/mapping.yaml +++ b/layers/building/mapping.yaml @@ -17,6 +17,9 @@ tables: type: validated_geometry - name: area type: pseudoarea + - name: building + key: building + type: string - name: height key: height type: integer @@ -34,4 +37,9 @@ tables: - __any__ building: - __any__ + filters: + exclude_tags: + - [ "building", "no" ] + - [ "building", "none" ] + - [ "building", "No" ] type: polygon diff --git a/layers/highway/README.md b/layers/highway/README.md deleted file mode 100644 index ee88c25..0000000 --- a/layers/highway/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# highway - -Roads or [`highway`](http://wiki.openstreetmap.org/wiki/Key:highway) in OpenStreetMap lingo. -This layer is directly derived from the OSM road hierarchy which is why it is called `highway`. Only -at zoom level 4 to 7 some major highways from Natural Earth are used otherwise it is only OSM data. -It contains all roads from motorways to primary, secondary and tertiary roads to residential roads and -foot paths. Styling the roads is the most essential part of the map. If you can put enough effort into it -makes sense to carefully style each `subclass`. For more comfortable styling you can also just style the roads -by `class`. Roads can have different properties, a road can have `oneway=yes` and `bridge=yes` at the same time. -These properties are reflected in the field `properties`. -This layer is not meant for labelling the roads (the purpose of the layer `highway_name`). - -The `highway` layer also contains polygons for things like plazas. - -## Fields - -- **class**: Either `motorway`, `major_road` (containing `trunk`, `primary`, `secondary` and `tertiary` roads) and `minor_road` (less important roads in the hierarchy like `residential` or `service`) or `path` for -non vehicle paths (such as `cycleway` or `footpath`). -- **subclass**: Original value of the [`highway`](http://wiki.openstreetmap.org/wiki/Key:highway) tag. Use this to do more -precise styling. -- **properties**: Additional properties describing the nature of road. -The properties `bridge` and `tunnel` can be combined with `oneway` as well. So to style all bridges the same you -should style both the properties `bridge` and `bridge:oneway`. -Properties can be one of `bridge:oneway`, `tunnel:oneway`, `ramp`, `ford`, `bridge`, `tunnel` or`oneway`. - -## Mapping - -![](mapping.png) - - diff --git a/layers/highway/mapping.png b/layers/highway/mapping.png deleted file mode 100644 index 363342b..0000000 Binary files a/layers/highway/mapping.png and /dev/null differ diff --git a/layers/highway_name/README.md b/layers/highway_name/README.md deleted file mode 100644 index e0c998c..0000000 --- a/layers/highway_name/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# highway_name - -This is the layer for labelling the highways. Only highways that are named `name=*` and are long enough -to place text upon appear. The OSM roads are stitched together if they contain the same name -to have better label placement than having many small linestrings. -For motorways you should use the `ref` field to label them while for other roads you should use `name`. - -## Fields - -- **ref**: The OSM [`ref`](http://wiki.openstreetmap.org/wiki/Key:ref) tag of the motorway or road. -- **ref_length**: Length of the `ref` field. Useful for having a shield icon as background for labeling motorways. -- **name**: The OSM [`name`](http://wiki.openstreetmap.org/wiki/Highways#Names_and_references) value of the highway. -- **subclass**: Original value of the [`highway`](http://wiki.openstreetmap.org/wiki/Key:highway) tag. Use this to do more -precise styling. -- **class**: Either `motorway`, `major_road` (containing `trunk`, `primary`, `secondary` and `tertiary` roads) and `minor_road` (less important roads in the hierarchy like `residential` or `service`) or `path` for -non vehicle paths (such as `cycleway` or `footpath`). - - - diff --git a/layers/housenumber/README.md b/layers/housenumber/README.md deleted file mode 100644 index 637bd3a..0000000 --- a/layers/housenumber/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# housenumber - -Everything in OpenStreetMap which contains a `addr:housenumber` tag useful for labelling housenumbers on a map. -This adds significant size to *z14*. For buildings the centroid of the building is used as housenumber. - -## Fields - -- **housenumber**: Value of the [`addr:housenumber`](http://wiki.openstreetmap.org/wiki/Key:addr) tag. - - - diff --git a/layers/landcover/README.md b/layers/landcover/README.md deleted file mode 100644 index a6e78f2..0000000 --- a/layers/landcover/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# landcover - -Landcover is used to describe the physical material at the surface of the earth. At lower zoom levels this is -from Natural Earth data for glaciers and ice shelves and at higher zoom levels the landcover is implied -by OSM tags (like `landuse` or `natural`). - -## Fields - -- **class**: More generalized groups of either `farmland`, `ice`, `wood`, `grass` or `wetland`. -Use this to assign general colors to the landcover. -- **subclass**: Original value of either the `landuse`, `natural` or `wetland` tag. -Use this to do more precise styling. - -## Mapping - -![](mapping.png) - - diff --git a/layers/landcover/landcover.sql b/layers/landcover/landcover.sql index 3123fc5..7cdfc35 100644 --- a/layers/landcover/landcover.sql +++ b/layers/landcover/landcover.sql @@ -9,12 +9,12 @@ --); --CREATE INDEX IF NOT EXISTS landcover_grouped_gen2_geometry_idx ON landcover_grouped_gen2 USING gist(geometry); -CREATE OR REPLACE FUNCTION landcover_class(landuse VARCHAR, "natural" VARCHAR, wetland VARCHAR) RETURNS TEXT AS $$ +CREATE OR REPLACE FUNCTION landcover_class(landuse VARCHAR, "natural" VARCHAR, leisure VARCHAR, wetland VARCHAR) RETURNS TEXT AS $$ SELECT CASE WHEN landuse IN ('farmland', 'farm', 'orchard', 'vineyard', 'plant_nursery') THEN 'farmland' WHEN "natural" IN ('glacier', 'ice_shelf') THEN 'ice' WHEN "natural"='wood' OR landuse IN ('forest', 'wood') THEN 'wood' - WHEN "natural"='grassland' OR landuse IN ('grass', 'meadow', 'village_green', 'allotments', 'park', 'recreation_ground', 'grassland') THEN 'grass' + WHEN "natural"='grassland' OR landuse IN ('grass', 'meadow', 'allotments', 'grassland', 'park', 'village_green', 'recreation_ground') OR leisure='park' THEN 'grass' WHEN "natural"='wetland' OR wetland IN ('bog', 'swamp', 'wet_meadow', 'marsh', 'reedbed', 'saltern', 'tidalflat', 'saltmarsh', 'mangrove') THEN 'wetland' ELSE NULL END; @@ -22,70 +22,73 @@ $$ LANGUAGE SQL IMMUTABLE; -- etldoc: ne_110m_glaciated_areas -> landcover_z0 CREATE OR REPLACE VIEW landcover_z0 AS ( - SELECT NULL::bigint AS osm_id, geom AS geometry, NULL::text AS landuse, 'glacier'::text AS "natural", NULL::text AS wetland FROM ne_110m_glaciated_areas + SELECT NULL::bigint AS osm_id, geom AS geometry, NULL::text AS landuse, 'glacier'::text AS "natural", NULL::text AS leisure, NULL::text AS wetland FROM ne_110m_glaciated_areas ); CREATE OR REPLACE VIEW landcover_z2 AS ( -- etldoc: ne_50m_glaciated_areas -> landcover_z2 - SELECT NULL::bigint AS osm_id, geom AS geometry, NULL::text AS landuse, 'glacier'::text AS "natural", NULL::text AS wetland FROM ne_50m_glaciated_areas + SELECT NULL::bigint AS osm_id, geom AS geometry, NULL::text AS landuse, 'glacier'::text AS "natural", NULL::text AS leisure, NULL::text AS wetland FROM ne_50m_glaciated_areas UNION ALL -- etldoc: ne_50m_antarctic_ice_shelves_polys -> landcover_z2 - SELECT NULL::bigint AS osm_id, geom AS geometry, NULL::text AS landuse, 'ice_shelf'::text AS "natural", NULL::text AS wetland FROM ne_50m_antarctic_ice_shelves_polys + SELECT NULL::bigint AS osm_id, geom AS geometry, NULL::text AS landuse, 'ice_shelf'::text AS "natural", NULL::text AS leisure, NULL::text AS wetland FROM ne_50m_antarctic_ice_shelves_polys ); CREATE OR REPLACE VIEW landcover_z5 AS ( -- etldoc: ne_10m_glaciated_areas -> landcover_z5 - SELECT NULL::bigint AS osm_id, geom AS geometry, NULL::text AS landuse, 'glacier'::text AS "natural", NULL::text AS wetland FROM ne_10m_glaciated_areas + SELECT NULL::bigint AS osm_id, geom AS geometry, NULL::text AS landuse, 'glacier'::text AS "natural", NULL::text AS leisure, NULL::text AS wetland FROM ne_10m_glaciated_areas UNION ALL -- etldoc: ne_10m_antarctic_ice_shelves_polys -> landcover_z5 - SELECT NULL::bigint AS osm_id, geom AS geometry, NULL::text AS landuse, 'ice_shelf'::text AS "natural", NULL::text AS wetland FROM ne_10m_antarctic_ice_shelves_polys + SELECT NULL::bigint AS osm_id, geom AS geometry, NULL::text AS landuse, 'ice_shelf'::text AS "natural", NULL::text AS leisure, NULL::text AS wetland FROM ne_10m_antarctic_ice_shelves_polys ); CREATE OR REPLACE VIEW landcover_z8 AS ( - -- etldoc: osm_landcover_polygon_gen5 -> landcover_z8 - SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon_gen5 + -- etldoc: osm_landcover_polygon_gen6 -> landcover_z8 + SELECT osm_id, geometry, landuse, "natural", leisure, wetland FROM osm_landcover_polygon_gen6 ); CREATE OR REPLACE VIEW landcover_z9 AS ( - -- etldoc: osm_landcover_polygon_gen4 -> landcover_z9 - SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon_gen4 + -- etldoc: osm_landcover_polygon_gen5 -> landcover_z9 + SELECT osm_id, geometry, landuse, "natural", leisure, wetland FROM osm_landcover_polygon_gen5 ); CREATE OR REPLACE VIEW landcover_z10 AS ( - -- etldoc: osm_landcover_polygon_gen3 -> landcover_z10 - SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon_gen3 + -- etldoc: osm_landcover_polygon_gen4 -> landcover_z10 + SELECT osm_id, geometry, landuse, "natural", leisure, wetland FROM osm_landcover_polygon_gen4 ); CREATE OR REPLACE VIEW landcover_z11 AS ( - -- etldoc: osm_landcover_polygon_gen2 -> landcover_z11 - SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon_gen2 + -- etldoc: osm_landcover_polygon_gen3 -> landcover_z11 + SELECT osm_id, geometry, landuse, "natural", leisure, wetland FROM osm_landcover_polygon_gen3 ); CREATE OR REPLACE VIEW landcover_z12 AS ( - -- etldoc: osm_landcover_polygon_gen1 -> landcover_z12 - SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon_gen1 + -- etldoc: osm_landcover_polygon_gen2 -> landcover_z12 + SELECT osm_id, geometry, landuse, "natural", leisure, wetland FROM osm_landcover_polygon_gen2 ); CREATE OR REPLACE VIEW landcover_z13 AS ( - -- etldoc: osm_landcover_polygon -> landcover_z13 - SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon WHERE ST_Area(geometry) > 60000 + -- etldoc: osm_landcover_polygon_gen1 -> landcover_z13 + SELECT osm_id, geometry, landuse, "natural", leisure, wetland FROM osm_landcover_polygon_gen1 ); CREATE OR REPLACE VIEW landcover_z14 AS ( -- etldoc: osm_landcover_polygon -> landcover_z14 - SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon + SELECT osm_id, geometry, landuse, "natural", leisure, wetland FROM osm_landcover_polygon ); -- etldoc: layer_landcover[shape=record fillcolor=lightpink, style="rounded,filled", --- etldoc: label="layer_landcover | z0 | z2_4 | z5_7 | z8 | z9 | z10 | z11 | z12| z13| z14_" ] ; +-- etldoc: label="layer_landcover | z0-z1 | z2-z4 | z5-z7 | z8 | z9 | z10 | z11 | z12| z13| z14+" ] ; CREATE OR REPLACE FUNCTION layer_landcover(bbox geometry, zoom_level int) RETURNS TABLE(osm_id bigint, geometry geometry, class text, subclass text) AS $$ SELECT osm_id, geometry, - landcover_class(landuse, "natural", wetland) AS class, - COALESCE(NULLIF("natural", ''), NULLIF(landuse, ''), NULLIF('wetland', '')) AS subclass + landcover_class(landuse, "natural", leisure, wetland) AS class, + COALESCE( + NULLIF("natural", ''), NULLIF(landuse, ''), + NULLIF(leisure, ''), NULLIF(wetland, '') + ) AS subclass FROM ( - -- etldoc: landcover_z0 -> layer_landcover:z0 + -- etldoc: landcover_z0 -> layer_landcover:z0_1 SELECT * FROM landcover_z0 WHERE zoom_level BETWEEN 0 AND 1 AND geometry && bbox UNION ALL @@ -98,31 +101,31 @@ RETURNS TABLE(osm_id bigint, geometry geometry, class text, subclass text) AS $$ WHERE zoom_level BETWEEN 5 AND 7 AND geometry && bbox UNION ALL -- etldoc: landcover_z8 -> layer_landcover:z8 - SELECT osm_id, geometry, landuse, "natural", wetland + SELECT * FROM landcover_z8 WHERE zoom_level = 8 AND geometry && bbox UNION ALL -- etldoc: landcover_z9 -> layer_landcover:z9 - SELECT osm_id, geometry, landuse, "natural", wetland + SELECT * FROM landcover_z9 WHERE zoom_level = 9 AND geometry && bbox UNION ALL -- etldoc: landcover_z10 -> layer_landcover:z10 - SELECT osm_id, geometry, landuse, "natural", wetland + SELECT * FROM landcover_z10 WHERE zoom_level = 10 AND geometry && bbox UNION ALL -- etldoc: landcover_z11 -> layer_landcover:z11 - SELECT osm_id, geometry, landuse, "natural", wetland + SELECT * FROM landcover_z11 WHERE zoom_level = 11 AND geometry && bbox UNION ALL -- etldoc: landcover_z12 -> layer_landcover:z12 - SELECT osm_id, geometry, landuse, "natural", wetland + SELECT * FROM landcover_z12 WHERE zoom_level = 12 AND geometry && bbox UNION ALL -- etldoc: landcover_z13 -> layer_landcover:z13 - SELECT osm_id, ST_Simplify(geometry, 10) AS geometry, landuse, "natural", wetland + SELECT * FROM landcover_z13 WHERE zoom_level = 13 AND geometry && bbox UNION ALL -- etldoc: landcover_z14 -> layer_landcover:z14_ - SELECT osm_id, geometry, landuse, "natural", wetland + SELECT * FROM landcover_z14 WHERE zoom_level >= 14 AND geometry && bbox ) AS zoom_levels; $$ LANGUAGE SQL IMMUTABLE; diff --git a/layers/landcover/landcover.yaml b/layers/landcover/landcover.yaml index dc3f6a5..95f86ac 100644 --- a/layers/landcover/landcover.yaml +++ b/layers/landcover/landcover.yaml @@ -2,16 +2,52 @@ layer: id: "landcover" description: | Landcover is used to describe the physical material at the surface of the earth. At lower zoom levels this is - from Natural Earth data for glaciers and ice shelves and at higher zoom levels the landcover is implied - by OSM tags (like `landuse` or `natural`). + from Natural Earth data for glaciers and ice shelves and at higher zoom levels the [landcover is [implied by OSM tags](http://wiki.openstreetmap.org/wiki/Landcover). The most common use case for this layer + is to style wood (`class=wood`) and grass (`class=`grass`) areas. buffer_size: 4 fields: - class: | - More generalized groups of either `farmland`, `ice`, `wood`, `grass` or `wetland`. - Use this to assign general colors to the landcover. - subclass: | - Original value of either the `landuse`, `natural` or `wetland` tag. - Use this to do more precise styling. + class: + description: | + Use the **class** to assign natural colors for **landcover**. + values: + - farmland + - ice + - wood + - grass + - wetland + subclass: + description: | + Use **subclass** to do more precise styling. + Original value of either the + [`natural`](http://wiki.openstreetmap.org/wiki/Key:natural), + [`landuse`](http://wiki.openstreetmap.org/wiki/Key:landuse), + ,[`leisure`](http://wiki.openstreetmap.org/wiki/Key:leisure), + or [`wetland`](http://wiki.openstreetmap.org/wiki/Key:wetland) tag. + values: + - allotments + - farm + - farmland + - orchard + - plant_nursery + - vineyard + - grass + - grassland + - meadow + - forest + - village_green + - recreation_ground + - park + - wetland + - grassland + - bog + - swamp + - wet_meadow + - marsh + - reedbed + - saltern + - tidalflat + - saltmarsh + - mangrove datasource: geometry_field: geometry query: (SELECT geometry, class, subclass FROM layer_landcover(!bbox!, z(!scale_denominator!))) AS t diff --git a/layers/landcover/mapping.png b/layers/landcover/mapping.png deleted file mode 100644 index 1662cf5..0000000 Binary files a/layers/landcover/mapping.png and /dev/null differ diff --git a/layers/landcover/mapping.yaml b/layers/landcover/mapping.yaml index 2ac8741..ffa6d7d 100644 --- a/layers/landcover/mapping.yaml +++ b/layers/landcover/mapping.yaml @@ -1,38 +1,44 @@ + generalized_tables: - + + # etldoc: imposm3 -> osm_landcover_polygon_gen6 + landcover_polygon_gen6: + source: landcover_polygon_gen5 + sql_filter: area>15000000 + tolerance: 300.0 + # etldoc: imposm3 -> osm_landcover_polygon_gen5 landcover_polygon_gen5: source: landcover_polygon_gen4 - sql_filter: area>15000000 - tolerance: 300.0 + sql_filter: area>4200000 + tolerance: 200.0 # etldoc: imposm3 -> osm_landcover_polygon_gen4 landcover_polygon_gen4: source: landcover_polygon_gen3 - sql_filter: area>4200000 - tolerance: 200.0 - - # etldoc: imposm3 -> osm_landcover_polygon_gen3 - landcover_polygon_gen3: - source: landcover_polygon_gen2 sql_filter: area>1200000 tolerance: 120.0 - # etldoc: imposm3 -> osm_landcover_polygon_gen2 - landcover_polygon_gen2: - source: landcover_polygon_gen1 + # etldoc: imposm3 -> osm_landcover_polygon_gen3 + landcover_polygon_gen3: + source: landcover_polygon_gen2 sql_filter: area>480000 tolerance: 80.0 - # etldoc: imposm3 -> osm_landcover_polygon_gen1 - landcover_polygon_gen1: - source: landcover_polygon + # etldoc: imposm3 -> osm_landcover_polygon_gen2 + landcover_polygon_gen2: + source: landcover_polygon_gen1 sql_filter: area>240000 tolerance: 50.0 + # etldoc: imposm3 -> osm_landcover_polygon_gen1 + landcover_polygon_gen1: + source: landcover_polygon + sql_filter: area>60000 + tolerance: 20.0 + tables: - - # etldoc: imposm3 -> osm_landcover_polygon + # etldoc: imposm3 -> osm_landcover_polygon landcover_polygon: fields: - name: osm_id @@ -42,6 +48,9 @@ tables: - name: landuse key: landuse type: string + - name: leisure + key: leisure + type: string - name: natural key: natural type: string @@ -61,13 +70,16 @@ tables: - grass - grassland - meadow - - park + - forest - village_green - recreation_ground - - forest + # There are 600 parks tagged with landuse=park instead of leisure=park + - park natural: - wetland - grassland + leisure: + - park wetland: - bog - swamp diff --git a/layers/landuse/README.md b/layers/landuse/README.md deleted file mode 100644 index 9b024be..0000000 --- a/layers/landuse/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# landuse - -Landuse is used to describe use of land by humans.At lower zoom levels this is -from Natural Earth data for residential (urban) areas and at higher zoom levels mostly OSM `landuse` tags. - -## Fields - -- **class**: More generalized groups of either `park`, `school`, `hospital`, `railway`, -`cemetery`, `military`, `residential`. Use this to assign general for landuse. -- **subclass**: Original value of either the `amenity`, `landuse`, `leisure` or `boundary` tag. -Use this to do more precise styling. - -## Mapping - -![](mapping.png) - - diff --git a/layers/landuse/landuse.sql b/layers/landuse/landuse.sql index 25361be..933aafd 100644 --- a/layers/landuse/landuse.sql +++ b/layers/landuse/landuse.sql @@ -1,112 +1,101 @@ - -CREATE OR REPLACE FUNCTION landuse_class(landuse TEXT, amenity TEXT, leisure TEXT, boundary TEXT) RETURNS TEXT AS $$ - SELECT CASE - WHEN leisure IN ('nature_reserve', 'park') OR boundary='national_park' THEN 'park' - WHEN amenity IN ('school', 'university', 'kindergarten', 'college', 'library') THEN 'school' - WHEN landuse IN('hospital', 'railway', 'cemetery', 'military', 'residential') THEN landuse - ELSE NULL - END; -$$ LANGUAGE SQL IMMUTABLE; - -- etldoc: ne_50m_urban_areas -> landuse_z4 CREATE OR REPLACE VIEW landuse_z4 AS ( - SELECT NULL::bigint AS osm_id, geom AS geometry, 'residential'::text AS landuse, NULL::text AS amenity, NULL::text AS leisure, NULL::text AS boundary, scalerank + SELECT NULL::bigint AS osm_id, geom AS geometry, 'residential'::text AS landuse, NULL::text AS amenity, NULL::text AS leisure, scalerank FROM ne_50m_urban_areas WHERE scalerank <= 2 ); -- etldoc: ne_50m_urban_areas -> landuse_z5 CREATE OR REPLACE VIEW landuse_z5 AS ( - SELECT NULL::bigint AS osm_id, geom AS geometry, 'residential'::text AS landuse, NULL::text AS amenity, NULL::text AS leisure, NULL::text AS boundary, scalerank + SELECT NULL::bigint AS osm_id, geom AS geometry, 'residential'::text AS landuse, NULL::text AS amenity, NULL::text AS leisure, scalerank FROM ne_50m_urban_areas ); -- etldoc: ne_10m_urban_areas -> landuse_z6 CREATE OR REPLACE VIEW landuse_z6 AS ( - SELECT NULL::bigint AS osm_id, geom AS geometry, 'residential'::text AS landuse, NULL::text AS amenity, NULL::text AS leisure, NULL::text AS boundary, scalerank + SELECT NULL::bigint AS osm_id, geom AS geometry, 'residential'::text AS landuse, NULL::text AS amenity, NULL::text AS leisure, scalerank FROM ne_10m_urban_areas ); --- etldoc: osm_landuse_polygon_gen5 -> landuse_z8 -CREATE OR REPLACE VIEW landuse_z8 AS ( - SELECT osm_id, geometry, landuse, amenity, leisure, boundary, NULL::int as scalerank FROM osm_landuse_polygon_gen5 -); - --- etldoc: osm_landuse_polygon_gen4 -> landuse_z9 +-- etldoc: osm_landuse_polygon_gen4 -> landuse_z10 CREATE OR REPLACE VIEW landuse_z9 AS ( - SELECT osm_id, geometry, landuse, amenity, leisure, boundary, NULL::int as scalerank FROM osm_landuse_polygon_gen4 + SELECT osm_id, geometry, landuse, amenity, leisure, NULL::int as scalerank + FROM osm_landuse_polygon_gen4 ); -- etldoc: osm_landuse_polygon_gen3 -> landuse_z10 CREATE OR REPLACE VIEW landuse_z10 AS ( - SELECT osm_id, geometry, landuse, amenity, leisure, boundary, NULL::int as scalerank FROM osm_landuse_polygon_gen3 + SELECT osm_id, geometry, landuse, amenity, leisure, NULL::int as scalerank + FROM osm_landuse_polygon_gen3 ); -- etldoc: osm_landuse_polygon_gen2 -> landuse_z11 CREATE OR REPLACE VIEW landuse_z11 AS ( - SELECT osm_id, geometry, landuse, amenity, leisure, boundary, NULL::int as scalerank FROM osm_landuse_polygon_gen2 + SELECT osm_id, geometry, landuse, amenity, leisure, NULL::int as scalerank + FROM osm_landuse_polygon_gen2 ); -- etldoc: osm_landuse_polygon_gen1 -> landuse_z12 CREATE OR REPLACE VIEW landuse_z12 AS ( - SELECT osm_id, geometry, landuse, amenity, leisure, boundary, NULL::int as scalerank FROM osm_landuse_polygon_gen1 + SELECT osm_id, geometry, landuse, amenity, leisure, NULL::int as scalerank + FROM osm_landuse_polygon_gen1 ); -- etldoc: osm_landuse_polygon -> landuse_z13 CREATE OR REPLACE VIEW landuse_z13 AS ( - SELECT osm_id, geometry, landuse, amenity, leisure, boundary, NULL::int as scalerank FROM osm_landuse_polygon - WHERE ST_Area(geometry) > 60000 + SELECT osm_id, geometry, landuse, amenity, leisure, NULL::int as scalerank + FROM osm_landuse_polygon + WHERE ST_Area(geometry) > 20000 ); -- etldoc: osm_landuse_polygon -> landuse_z14 CREATE OR REPLACE VIEW landuse_z14 AS ( - SELECT osm_id, geometry, landuse, amenity, leisure, boundary, NULL::int as scalerank FROM osm_landuse_polygon + SELECT osm_id, geometry, landuse, amenity, leisure, NULL::int as scalerank + FROM osm_landuse_polygon ); --- etldoc: layer_landuse[shape=record fillcolor=lightpink, style="rounded,filled", --- etldoc: label="layer_landuse | z4|z5|z6|z7| z8 | z9 | z10 | z11 | z12| z13| z14_" ] ; +-- etldoc: layer_landuse[shape=record fillcolor=lightpink, style="rounded,filled", +-- etldoc: label="layer_landuse | z4|z5|z6|z7| z8 | z9 | z10 | z11| z12| z13| z14+" ] ; CREATE OR REPLACE FUNCTION layer_landuse(bbox geometry, zoom_level int) -RETURNS TABLE(osm_id bigint, geometry geometry, class text, subclass text) AS $$ +RETURNS TABLE(osm_id bigint, geometry geometry, class text) AS $$ SELECT osm_id, geometry, - landuse_class(landuse, amenity, leisure, boundary) AS class, - COALESCE(NULLIF(landuse, ''), NULLIF(amenity, ''), NULLIF(leisure, ''), NULLIF(boundary, '')) AS subclass + COALESCE( + NULLIF(landuse, ''), + NULLIF(amenity, ''), + NULLIF(leisure, '') + ) AS class FROM ( -- etldoc: landuse_z4 -> layer_landuse:z4 SELECT * FROM landuse_z4 WHERE zoom_level = 4 UNION ALL - -- etldoc: landuse_z5 -> layer_landuse:z5 + -- etldoc: landuse_z5 -> layer_landuse:z5 SELECT * FROM landuse_z5 WHERE zoom_level = 5 UNION ALL -- etldoc: landuse_z6 -> layer_landuse:z6 -- etldoc: landuse_z6 -> layer_landuse:z7 -- etldoc: landuse_z6 -> layer_landuse:z8 - -- etldoc: landuse_z6 -> layer_landuse:z9 - -- etldoc: landuse_z6 -> layer_landuse:z10 SELECT * FROM landuse_z6 - WHERE zoom_level BETWEEN 6 AND 10 AND scalerank-1 <= zoom_level + WHERE zoom_level BETWEEN 6 AND 8 AND scalerank-1 <= zoom_level UNION ALL - -- etldoc: landuse_z8 -> layer_landuse:z8 - SELECT * FROM landuse_z8 WHERE zoom_level = 8 - UNION ALL - -- etldoc: landuse_z9 -> layer_landuse:z9 + -- etldoc: landuse_z9 -> layer_landuse:z9 SELECT * FROM landuse_z9 WHERE zoom_level = 9 UNION ALL - -- etldoc: landuse_z10 -> layer_landuse:z10 + -- etldoc: landuse_z10 -> layer_landuse:z10 SELECT * FROM landuse_z10 WHERE zoom_level = 10 UNION ALL - -- etldoc: landuse_z11 -> layer_landuse:z11 + -- etldoc: landuse_z11 -> layer_landuse:z11 SELECT * FROM landuse_z11 WHERE zoom_level = 11 UNION ALL - -- etldoc: landuse_z12 -> layer_landuse:z12 + -- etldoc: landuse_z12 -> layer_landuse:z12 SELECT * FROM landuse_z12 WHERE zoom_level = 12 UNION ALL - -- etldoc: landuse_z13 -> layer_landuse:z13 + -- etldoc: landuse_z13 -> layer_landuse:z13 SELECT * FROM landuse_z13 WHERE zoom_level = 13 UNION ALL - -- etldoc: landuse_z14 -> layer_landuse:z14_ + -- etldoc: landuse_z14 -> layer_landuse:z14 SELECT * FROM landuse_z14 WHERE zoom_level >= 14 ) AS zoom_levels WHERE geometry && bbox; diff --git a/layers/landuse/landuse.yaml b/layers/landuse/landuse.yaml index 8abc929..32f851b 100644 --- a/layers/landuse/landuse.yaml +++ b/layers/landuse/landuse.yaml @@ -5,15 +5,31 @@ layer: from Natural Earth data for residential (urban) areas and at higher zoom levels mostly OSM `landuse` tags. buffer_size: 4 fields: - class: | - More generalized groups of either `park`, `school`, `hospital`, `railway`, - `cemetery`, `military`, `residential`. Use this to assign general for landuse. - subclass: | - Original value of either the `amenity`, `landuse`, `leisure` or `boundary` tag. - Use this to do more precise styling. + class: + description: | + Use the **class** to assign special colors to areas. + Original value of either the + [`amenity`](http://wiki.openstreetmap.org/wiki/Key:amenity), + [`landuse`](http://wiki.openstreetmap.org/wiki/Key:landuse), + or [`leisure`](http://wiki.openstreetmap.org/wiki/Key:leisure) tag. + values: + - school + - university + - kindergarten + - college + - library + - hospital + - railway + - cemetery + - military + - residential + - commercial + - industrial + - retail + - stadium datasource: geometry_field: geometry - query: (SELECT geometry, class, subclass FROM layer_landuse(!bbox!, z(!scale_denominator!))) AS t + query: (SELECT geometry, class FROM layer_landuse(!bbox!, z(!scale_denominator!))) AS t schema: - ./landuse.sql datasources: diff --git a/layers/landuse/mapping.png b/layers/landuse/mapping.png deleted file mode 100644 index 0a4647c..0000000 Binary files a/layers/landuse/mapping.png and /dev/null differ diff --git a/layers/landuse/mapping.yaml b/layers/landuse/mapping.yaml index 76bffe8..3773a38 100644 --- a/layers/landuse/mapping.yaml +++ b/layers/landuse/mapping.yaml @@ -1,37 +1,26 @@ generalized_tables: - - # etldoc: imposm3 -> osm_landuse_polygon_gen5 - landuse_polygon_gen5: - source: landuse_polygon_gen4 - sql_filter: area>15000000 - tolerance: 300.0 - - # etldoc: imposm3 -> osm_landuse_polygon_gen4 + # etldoc: imposm3 -> osm_landuse_polygon_gen4 landuse_polygon_gen4: source: landuse_polygon_gen3 - sql_filter: area>4200000 - tolerance: 200.0 - - # etldoc: imposm3 -> osm_landuse_polygon_gen3 + sql_filter: area>2000000 + tolerance: 160.0 + # etldoc: imposm3 -> osm_landuse_polygon_gen3 landuse_polygon_gen3: source: landuse_polygon_gen2 - sql_filter: area>1200000 - tolerance: 120.0 - - # etldoc: imposm3 -> osm_landuse_polygon_gen2 + sql_filter: area>960000 + tolerance: 80.0 + # etldoc: imposm3 -> osm_landuse_polygon_gen2 landuse_polygon_gen2: source: landuse_polygon_gen1 - sql_filter: area>480000 - tolerance: 80.0 - - # etldoc: imposm3 -> osm_landuse_polygon_gen1 + sql_filter: area>240000 + tolerance: 40.0 + # etldoc: imposm3 -> osm_landuse_polygon_gen1 landuse_polygon_gen1: source: landuse_polygon - sql_filter: area>240000 - tolerance: 50.0 + sql_filter: area>60000 + tolerance: 20.0 tables: - # etldoc: imposm3 -> osm_landuse_polygon landuse_polygon: type: polygon @@ -49,9 +38,6 @@ tables: - name: leisure key: leisure type: string - - name: boundary - key: boundary - type: string - name: area type: pseudoarea mapping: @@ -66,8 +52,10 @@ tables: - railway - cemetery - military + # zoning + - residential + - commercial + - industrial + - retail leisure: - - nature_reserve - - park - boundary: - - national_park + - stadium diff --git a/layers/park/layer.sql b/layers/park/layer.sql new file mode 100644 index 0000000..8d0bad3 --- /dev/null +++ b/layers/park/layer.sql @@ -0,0 +1,55 @@ +-- etldoc: layer_park[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(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 + FROM ( + -- etldoc: osm_park_polygon_gen8 -> layer_park:z6 + SELECT osm_id, geometry, leisure, boundary, NULL::int as scalerank + FROM osm_park_polygon_gen8 + WHERE zoom_level = 6 + UNION ALL + -- etldoc: osm_park_polygon_gen7 -> layer_park:z7 + SELECT osm_id, geometry, leisure, boundary, NULL::int as scalerank + FROM osm_park_polygon_gen7 + WHERE zoom_level = 7 + UNION ALL + -- etldoc: osm_park_polygon_gen6 -> layer_park:z8 + SELECT osm_id, geometry, leisure, boundary, NULL::int as scalerank + FROM osm_park_polygon_gen6 + WHERE zoom_level = 8 + UNION ALL + -- etldoc: osm_park_polygon_gen5 -> layer_park:z9 + SELECT osm_id, geometry, leisure, boundary, NULL::int as scalerank + FROM osm_park_polygon_gen5 + WHERE zoom_level = 9 + UNION ALL + -- etldoc: osm_park_polygon_gen4 -> layer_park:z10 + SELECT osm_id, geometry, leisure, boundary, NULL::int as scalerank + FROM osm_park_polygon_gen4 + WHERE zoom_level = 10 + UNION ALL + -- etldoc: osm_park_polygon_gen3 -> layer_park:z11 + SELECT osm_id, geometry, leisure, boundary, NULL::int as scalerank + FROM osm_park_polygon_gen3 + WHERE zoom_level = 11 + UNION ALL + -- etldoc: osm_park_polygon_gen2 -> layer_park:z12 + SELECT osm_id, geometry, leisure, boundary, NULL::int as scalerank + FROM osm_park_polygon_gen2 + WHERE zoom_level = 12 + UNION ALL + -- etldoc: osm_park_polygon_gen1 -> layer_park:z13 + SELECT osm_id, geometry, leisure, boundary, NULL::int as scalerank + FROM osm_park_polygon_gen1 + WHERE zoom_level = 13 + UNION ALL + -- etldoc: osm_park_polygon -> layer_park:z14 + SELECT osm_id, geometry, leisure, boundary, NULL::int as scalerank + FROM osm_park_polygon + WHERE zoom_level >= 14 + ) AS zoom_levels + WHERE geometry && bbox; +$$ LANGUAGE SQL IMMUTABLE; diff --git a/layers/park/mapping.yaml b/layers/park/mapping.yaml new file mode 100644 index 0000000..29fb1f0 --- /dev/null +++ b/layers/park/mapping.yaml @@ -0,0 +1,75 @@ +generalized_tables: + # etldoc: imposm3 -> osm_park_polygon_gen8 + park_polygon_gen8: + source: park_polygon_gen6 + sql_filter: area>240000000 + tolerance: 600.0 + + # etldoc: imposm3 -> osm_park_polygon_gen7 + park_polygon_gen7: + source: park_polygon_gen6 + sql_filter: area>60000000 + tolerance: 400.0 + + # etldoc: imposm3 -> osm_park_polygon_gen6 + park_polygon_gen6: + source: park_polygon_gen5 + sql_filter: area>15000000 + tolerance: 300.0 + + # etldoc: imposm3 -> osm_park_polygon_gen5 + park_polygon_gen5: + source: park_polygon_gen4 + sql_filter: area>4200000 + tolerance: 200.0 + + # etldoc: imposm3 -> osm_park_polygon_gen4 + park_polygon_gen4: + source: park_polygon_gen3 + sql_filter: area>1200000 + tolerance: 120.0 + + # etldoc: imposm3 -> osm_park_polygon_gen3 + park_polygon_gen3: + source: park_polygon_gen2 + sql_filter: area>480000 + tolerance: 80.0 + + # etldoc: imposm3 -> osm_park_polygon_gen2 + park_polygon_gen2: + source: park_polygon_gen1 + sql_filter: area>240000 + tolerance: 50.0 + + # etldoc: imposm3 -> osm_park_polygon_gen1 + park_polygon_gen1: + source: park_polygon + sql_filter: area>60000 + tolerance: 20.0 + +tables: + + # etldoc: imposm3 -> osm_park_polygon + park_polygon: + type: polygon + fields: + - name: osm_id + type: id + - name: geometry + type: validated_geometry + - name: landuse + key: landuse + type: string + - name: leisure + key: leisure + type: string + - name: boundary + key: boundary + type: string + - name: area + type: pseudoarea + mapping: + leisure: + - nature_reserve + boundary: + - national_park diff --git a/layers/park/park.yaml b/layers/park/park.yaml new file mode 100644 index 0000000..9fa2ebf --- /dev/null +++ b/layers/park/park.yaml @@ -0,0 +1,20 @@ +layer: + id: "park" + description: | + The park layer contains parks from OpenStreetMap tagged with either [`boundary=national_park`](http://wiki.openstreetmap.org/wiki/Tag:boundary%3Dnational_park) or [`leisure=nature_reserve`](http://wiki.openstreetmap.org/wiki/Tag:leisure%3Dnature_reserve). + buffer_size: 4 + fields: + class: + description: | + Use the **class** to differentiate between different parks. + values: + - national_park + - nature_reserve + datasource: + geometry_field: geometry + query: (SELECT geometry, class FROM layer_park(!bbox!, z(!scale_denominator!))) AS t +schema: + - ./layer.sql +datasources: + - type: imposm3 + mapping_file: ./mapping.yaml diff --git a/layers/place/README.md b/layers/place/README.md deleted file mode 100644 index bd928b4..0000000 --- a/layers/place/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# place - -The place layer consists out of [countries](http://wiki.openstreetmap.org/wiki/Tag:place%3Dcountry), -[states](http://wiki.openstreetmap.org/wiki/Tag:place%3Dstate) and [cities](http://wiki.openstreetmap.org/wiki/Key:place). -Apart from the roads this is also one of the more important layers to create a beautiful map. -We suggest you use different font styles and sizes to create a text hierarchy. - -## Fields - -- **name_en**: The english `name:en` value if available. -- **name**: The OSM [`name`](http://wiki.openstreetmap.org/wiki/Key:name) value of the POI. -- **rank**: Countries, states and the most important cities all have a `rank` to boost their importance on the map. -The `rank` field for counries and states ranges from `1` to `6` while the `rank` field for -cities ranges from `1` to `10` for the most important cities and continues from `10` serially based -on the local importance of the city (derived from population and city class). -Use the `rank` field to build a text hierarchy. -The rank value is a combination of the Natural Earth `scalerank`, `labelrank` and `datarank` values for countries -and states and for cities consists out of a shifted Natural Earth `scalerank` combined with a local rank -within a grid for cities that do not have a Natural Earth `scalerank`. -- **class**: Distinguish between `country`, `state` and other city classes like -`city`, `town`, `village`, `hamlet`, `suburb`, `neighbourhood` or `isolated_dwelling`. -Use this to separately style the different places according to their importance (usually country and state different -than cities). - -## Mapping - -![](mapping.png) - - diff --git a/layers/place/city.sql b/layers/place/city.sql index 5e21bca..d20cdae 100644 --- a/layers/place/city.sql +++ b/layers/place/city.sql @@ -9,7 +9,7 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, place c FROM osm_city_point WHERE geometry && bbox AND ((zoom_level = 2 AND "rank" = 1) - OR (zoom_level BETWEEN 3 AND 7 AND "rank" <= zoom_level) + OR (zoom_level BETWEEN 3 AND 7 AND "rank" <= zoom_level + 1) ) UNION ALL SELECT osm_id, geometry, name, diff --git a/layers/place/mapping.png b/layers/place/mapping.png deleted file mode 100644 index ed7581c..0000000 Binary files a/layers/place/mapping.png and /dev/null differ diff --git a/layers/place/mapping.yaml b/layers/place/mapping.yaml index 1cd4333..3e1becd 100644 --- a/layers/place/mapping.yaml +++ b/layers/place/mapping.yaml @@ -6,10 +6,43 @@ 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 type: integer + tables: # etldoc: imposm3 -> osm_continent_point @@ -39,6 +72,14 @@ tables: type: geometry - *name - *name_en + - *name_de + - *name_fr + - *name_es + - *name_pt + - *name_ru + - *name_zh + - *name_ar + - *name_ja - *rank filters: exclude_tags: @@ -47,6 +88,32 @@ tables: place: - country + # etldoc: imposm3 -> osm_island_point + island_point: + type: point + fields: + - name: osm_id + type: id + - name: geometry + type: geometry + - *name + - *name_en + - *name_de + - *name_fr + - *name_es + - *name_pt + - *name_ru + - *name_zh + - *name_ar + - *name_ja + - *rank + filters: + exclude_tags: + - [ "name", "__nil__" ] + mapping: + place: + - island + # etldoc: imposm3 -> osm_state_point state_point: type: point @@ -57,6 +124,14 @@ tables: type: geometry - *name - *name_en + - *name_de + - *name_fr + - *name_es + - *name_pt + - *name_ru + - *name_zh + - *name_ar + - *name_ja - name: is_in_country key: is_in:country type: string @@ -84,6 +159,14 @@ tables: type: geometry - *name - *name_en + - *name_de + - *name_fr + - *name_es + - *name_pt + - *name_ru + - *name_zh + - *name_ar + - *name_ja - name: place key: place type: string diff --git a/layers/poi/README.md b/layers/poi/README.md deleted file mode 100644 index de80baf..0000000 --- a/layers/poi/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# poi - -[Points of interests](http://wiki.openstreetmap.org/wiki/Points_of_interest) containing -a of a variety of OpenStreetMap tags. Mostly contains amenities, sport, shop and tourist POIs. - -## Fields - -- **class**: More general classes of POIs. If there is no more general `class` for the `subclass` -this field will contain the same value as `subclass`. -But for example for schools you only need to style the class `school` to filter the subclasses `school` -and `kindergarten`. Or use the class `shop` to style all shops. -- **name_en**: The english `name:en` value if available. -- **name**: The OSM [`name`](http://wiki.openstreetmap.org/wiki/Key:name) value of the POI. -- **rank**: The POIs are ranked ascending according to their importance within a grid. The `rank` value shows the -local relative importance of a POI within it's cell in the grid. This can be used to reduce label density at z14. -Since all POIs already need to be contained at `z14` you can use `less than rank=10` epxression to limit -POIs. At some point like z17 you can show all POIs. -- **subclass**: Original value of either the -[`amenity`](http://wiki.openstreetmap.org/wiki/Key:amenity), -[`leisure`](http://wiki.openstreetmap.org/wiki/Key:leisure), -[`landuse`](http://wiki.openstreetmap.org/wiki/Key:landuse), -[`sport`](http://wiki.openstreetmap.org/wiki/Key:sport), -[`tourism`](http://wiki.openstreetmap.org/wiki/Key:tourism) -or [`shop`](http://wiki.openstreetmap.org/wiki/Key:shop) -tag. Use this to do more precise styling. - -## Mapping - -![](mapping.png) - - diff --git a/layers/poi/layer.sql b/layers/poi/layer.sql index 78e61b3..68dcec1 100644 --- a/layers/poi/layer.sql +++ b/layers/poi/layer.sql @@ -4,11 +4,10 @@ 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, class text, subclass text, "rank" int) AS $$ - SELECT osm_id, geometry, name, NULLIF(name_en, ''), poi_class(subclass) AS class, subclass, + SELECT osm_id, geometry, NULLIF(name, '') AS name, NULLIF(name_en, '') AS name_en, poi_class(subclass) AS class, subclass, row_number() OVER ( PARTITION BY LabelGrid(geometry, 100 * pixel_width) - ORDER BY poi_class_rank(poi_class(subclass)) ASC, - length(name) DESC NULLS LAST + ORDER BY CASE WHEN name = '' THEN 2000 ELSE poi_class_rank(poi_class(subclass)) END ASC )::int AS "rank" FROM ( -- etldoc: osm_poi_point -> layer_poi:z14 diff --git a/layers/poi/mapping.png b/layers/poi/mapping.png deleted file mode 100644 index 7b85381..0000000 Binary files a/layers/poi/mapping.png and /dev/null differ diff --git a/layers/railway/README.md b/layers/railway/README.md deleted file mode 100644 index 8a1bc51..0000000 --- a/layers/railway/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# railway - -The `railway` layer contains linestrings marking tracks from [OSM Railways](http://wiki.openstreetmap.org/wiki/Railways). -It contains tracks for [passenger and freight trains]() and smaller tracks for [Trams](http://wiki.openstreetmap.org/wiki/Tag:railway%3Dtram) or [similar](http://wiki.openstreetmap.org/wiki/Tag:railway%3Dlight_rail) vehicles. But also tracks for [subways](http://wiki.openstreetmap.org/wiki/Tag:railway%3Dsubway), [narrow-gauge trains](http://wiki.openstreetmap.org/wiki/Tag:railway%3Dnarrow_gauge) or [historic trains](http://wiki.openstreetmap.org/wiki/Tag:railway%3Dpreserved). -Non mainline tracks (marked with class `minor_rail`) used for [storage of trains](http://wiki.openstreetmap.org/wiki/Tag:service%3Dyard) and [maintenance](http://wiki.openstreetmap.org/wiki/Tag:service%3Dsiding) are contained in the highest zoom levels and should be styled more subtle than the mainline tracks with class `rail`. - -## Fields - -- **class**: Divides the track into mainline tracks (class `rail`) and less important tracks -used for maintenance (class `minor_rail`). -- **subclass**: Original value of the [`railway`](http://wiki.openstreetmap.org/wiki/Key:railway) can be one of -`rail`, `light_rail`, `subway`, `narrow_gauge`, `preserved`, `tram`. -- **properties**: Additional properties describing the nature of tracks. Can be either `bridge` or `tunnel`. - -## Mapping - -![](mapping.png) - - diff --git a/layers/railway/mapping b/layers/railway/mapping deleted file mode 100644 index d068987..0000000 --- a/layers/railway/mapping +++ /dev/null @@ -1,14 +0,0 @@ -digraph "Imposm Mapping" { - graph [rankdir=LR ranksep=3] - subgraph railway_linestring { - node [fixed_size=shape "width:"=20] - railway_linestring [shape=box] - key_railway [label=railway shape=box] - key_railway -> railway_linestring [label="rail -light_rail -subway -narrow_gauge -preserved -tram"] - } -} \ No newline at end of file diff --git a/layers/railway/mapping.png b/layers/railway/mapping.png deleted file mode 100644 index 52a4723..0000000 Binary files a/layers/railway/mapping.png and /dev/null differ diff --git a/layers/water/README.md b/layers/water/README.md deleted file mode 100644 index 1152e62..0000000 --- a/layers/water/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# water - -Water polygons representing oceans and lakes. Covered watered areas are excluded (`covered=yes`). -Until z6 all water originates from Natural Earth. To get a more correct display of the south pole you should also -style the covering ice shelves over the water. -Water from OpenStreetMap after z7 is split into many smaller polygons to improve rendering performance. -This however can lead to less rendering options in clients since these boundaries show up. So you might not be -able to use border styling for ocean water features. - -## Fields - -- **class**: Either `ocean`, `lake` or `river`. - -## Mapping - -![](mapping.png) - - diff --git a/layers/water/mapping.png b/layers/water/mapping.png deleted file mode 100644 index f0f09e3..0000000 Binary files a/layers/water/mapping.png and /dev/null differ diff --git a/layers/water/mapping.yaml b/layers/water/mapping.yaml index feee49b..a19fb35 100644 --- a/layers/water/mapping.yaml +++ b/layers/water/mapping.yaml @@ -1,22 +1,34 @@ generalized_tables: + # etldoc: imposm3 -> osm_water_polygon_gen5 + water_polygon_gen5: + source: water_polygon_gen4 + sql_filter: area>10000000.0 + tolerance: 320.0 + + # etldoc: imposm3 -> osm_water_polygon_gen4 + water_polygon_gen4: + source: water_polygon_gen3 + sql_filter: area>5000000.0 + tolerance: 160.0 + # etldoc: imposm3 -> osm_water_polygon_gen3 water_polygon_gen3: - source: water_polygon - sql_filter: area>15000000.0 AND waterway = '' - tolerance: 350.0 + source: water_polygon_gen2 + sql_filter: area>2500000.0 + tolerance: 80.0 - # etldoc: imposm3 -> osm_water_polygon_gen2 + # etldoc: imposm3 -> osm_water_polygon_gen2 water_polygon_gen2: - source: water_polygon - sql_filter: area>2000000 AND waterway = '' - tolerance: 200.0 + source: water_polygon_gen1 + sql_filter: area>1000000 + tolerance: 40.0 - # etldoc: imposm3 -> osm_water_polygon_gen1 + # etldoc: imposm3 -> osm_water_polygon_gen1 water_polygon_gen1: source: water_polygon sql_filter: area>500000 AND waterway = '' - tolerance: 100.0 + tolerance: 20.0 tables: diff --git a/layers/water/water.sql b/layers/water/water.sql index a6cc0df..1823ac0 100644 --- a/layers/water/water.sql +++ b/layers/water/water.sql @@ -56,8 +56,8 @@ CREATE OR REPLACE VIEW water_z7 AS ( -- etldoc: ne_10m_ocean -> water_z7 SELECT geom, 'ocean'::text AS class FROM ne_10m_ocean UNION ALL - -- etldoc: osm_water_polygon_gen3 -> water_z7 - SELECT geometry AS geom, 'lake' AS class FROM osm_water_polygon_gen3 + -- etldoc: osm_water_polygon_gen3 -> water_z7 + SELECT geometry AS geom, 'lake' AS class FROM osm_water_polygon_gen5 ); CREATE OR REPLACE VIEW water_z8 AS ( @@ -65,30 +65,53 @@ CREATE OR REPLACE VIEW water_z8 AS ( SELECT geom, 'ocean'::text AS class FROM ne_10m_ocean UNION ALL -- etldoc: osm_water_polygon_gen2 -> water_z8 - SELECT geometry AS geom, 'lake' AS class FROM osm_water_polygon_gen2 + SELECT geometry AS geom, 'lake' AS class FROM osm_water_polygon_gen4 ); CREATE OR REPLACE VIEW water_z9 AS ( + -- etldoc: osm_ocean_polygon_gen3 -> water_z9 + SELECT geometry AS geom, 'ocean'::text AS class FROM osm_ocean_polygon_gen3 + UNION ALL -- etldoc: osm_water_polygon_gen1 -> water_z9 - SELECT geometry AS geom, 'lake'::text AS class FROM osm_water_polygon_gen1 + SELECT geometry AS geom, 'lake'::text AS class FROM osm_water_polygon_gen3 +); + +CREATE OR REPLACE VIEW water_z10 AS ( + -- etldoc: osm_ocean_polygon_gen2 -> water_z10 + SELECT geometry AS geom, 'ocean'::text AS class FROM osm_ocean_polygon_gen2 + UNION ALL + -- etldoc: osm_water_polygon_gen2 -> water_z10 + SELECT geometry AS geom, 'lake'::text AS class FROM osm_water_polygon_gen2 ); CREATE OR REPLACE VIEW water_z11 AS ( - -- etldoc: osm_water_polygon -> water_z11 - SELECT geometry AS geom, water_class(waterway) AS class FROM osm_water_polygon WHERE area > 40000 + -- etldoc: osm_ocean_polygon_gen1 -> water_z11 + SELECT geometry AS geom, 'ocean'::text AS class FROM osm_ocean_polygon_gen1 + UNION ALL + -- etldoc: osm_water_polygon -> water_z11 + SELECT geometry AS geom, water_class(waterway) AS class FROM osm_water_polygon_gen1 WHERE area > 40000 ); CREATE OR REPLACE VIEW water_z12 AS ( + -- etldoc: osm_ocean_polygon_gen1 -> water_z12 + SELECT geometry AS geom, 'ocean'::text AS class FROM osm_ocean_polygon + UNION ALL -- etldoc: osm_water_polygon -> water_z12 SELECT geometry AS geom, water_class(waterway) AS class FROM osm_water_polygon WHERE area > 10000 ); CREATE OR REPLACE VIEW water_z13 AS ( + -- etldoc: osm_ocean_polygon -> water_z13 + SELECT geometry AS geom, 'ocean'::text AS class FROM osm_ocean_polygon + UNION ALL -- etldoc: osm_water_polygon -> water_z13 SELECT geometry AS geom, water_class(waterway) AS class FROM osm_water_polygon WHERE area > 5000 ); CREATE OR REPLACE VIEW water_z14 AS ( + -- etldoc: osm_ocean_polygon -> water_z14 + SELECT geometry AS geom, 'ocean'::text AS class FROM osm_ocean_polygon + UNION ALL -- etldoc: osm_water_polygon -> water_z14 SELECT geometry AS geom, water_class(waterway) AS class FROM osm_water_polygon ); @@ -124,9 +147,11 @@ RETURNS TABLE(geom geometry, class text) AS $$ -- etldoc: water_z8 -> layer_water:z8 SELECT * FROM water_z8 WHERE zoom_level = 8 UNION ALL - -- etldoc: water_z9 -> layer_water:z9 + -- etldoc: water_z9 -> layer_water:z9 + SELECT * FROM water_z9 WHERE zoom_level = 9 + UNION ALL -- etldoc: water_z9 -> layer_water:z10 - SELECT * FROM water_z9 WHERE zoom_level BETWEEN 9 AND 10 + SELECT * FROM water_z9 WHERE zoom_level = 10 UNION ALL -- etldoc: water_z11 -> layer_water:z11 SELECT * FROM water_z11 WHERE zoom_level = 11 diff --git a/layers/water_name/README.md b/layers/water_name/README.md deleted file mode 100644 index a87f4eb..0000000 --- a/layers/water_name/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# water_name - -Lake center lines for labelling lake bodies. -This is based of the [osm-lakelines](https://github.com/lukasmartinelli/osm-lakelines) project -which derives nice centerlines from OSM water bodies. Only the most important lakes contain labels. - -## Fields - -- **name_en**: The english `name:en` value if available. -- **name**: The OSM [`name`](http://wiki.openstreetmap.org/wiki/Key:name) value of the water body. -- **class**: At the moment only `lake` since no ocean parts are labelled. *Reserved for future use*. - - - diff --git a/layers/water_name/layer.sql b/layers/water_name/layer.sql index 8c9e866..b8935da 100644 --- a/layers/water_name/layer.sql +++ b/layers/water_name/layer.sql @@ -1,16 +1,22 @@ --- etldoc: layer_water_name[shape=record fillcolor=lightpink, style="rounded,filled", +-- etldoc: layer_water_name[shape=record fillcolor=lightpink, style="rounded,filled", -- etldoc: label="layer_water_name | 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, class text) AS $$ -- etldoc: osm_water_lakeline -> layer_water_name:z9_13 - -- etldoc: osm_water_lakeline -> layer_water_name:z14_ + -- etldoc: osm_water_lakeline -> layer_water_name:z14 SELECT osm_id, geometry, name, name_en, 'lake'::text AS class FROM osm_water_lakeline WHERE geometry && bbox - AND name <> '' AND ((zoom_level BETWEEN 9 AND 13 AND LineLabel(zoom_level, NULLIF(name, ''), geometry)) OR (zoom_level >= 14)) - ORDER BY ST_Length(geometry) DESC; + -- etldoc: osm_water_point -> layer_water_name:z9_13 + UNION ALL + SELECT osm_id, geometry, name, name_en, 'lake'::text AS class + FROM osm_water_point + WHERE geometry && bbox AND ( + (zoom_level BETWEEN 9 AND 13 AND area > 70000*2^(20-zoom_level)) + OR (zoom_level >= 14) + ); $$ LANGUAGE SQL IMMUTABLE; diff --git a/layers/water_name/merge_lakelines.sql b/layers/water_name/water_lakeline.sql similarity index 74% rename from layers/water_name/merge_lakelines.sql rename to layers/water_name/water_lakeline.sql index b74b709..da96587 100644 --- a/layers/water_name/merge_lakelines.sql +++ b/layers/water_name/water_lakeline.sql @@ -1,11 +1,12 @@ - -- etldoc: osm_water_polygon -> osm_water_lakeline +-- etldoc: custom_lakeline -> osm_water_lakeline CREATE TABLE IF NOT EXISTS osm_water_lakeline AS ( SELECT wp.osm_id, ll.wkb_geometry AS geometry, - name, name_en + name, name_en, 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 <> '' ); CREATE INDEX IF NOT EXISTS osm_water_lakeline_geometry_idx ON osm_water_lakeline USING gist(geometry); diff --git a/layers/water_name/water_name.yaml b/layers/water_name/water_name.yaml index 33d6b00..e8dfab8 100644 --- a/layers/water_name/water_name.yaml +++ b/layers/water_name/water_name.yaml @@ -16,7 +16,8 @@ layer: srid: 900913 query: (SELECT geometry, name, name_en, class FROM layer_water_name(!bbox!, z(!scale_denominator!))) AS t schema: - - ./merge_lakelines.sql + - ./water_lakeline.sql + - ./water_point.sql - ./layer.sql datasources: - type: imposm3 diff --git a/layers/water_name/water_point.sql b/layers/water_name/water_point.sql new file mode 100644 index 0000000..281957b --- /dev/null +++ b/layers/water_name/water_point.sql @@ -0,0 +1,11 @@ +-- etldoc: osm_water_polygon -> osm_water_lakeline +CREATE TABLE IF NOT EXISTS osm_water_point AS ( + SELECT + wp.osm_id, topoint(wp.geometry) AS geometry, + wp.name, wp.name_en, 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 <> '' +); + +CREATE INDEX IF NOT EXISTS osm_water_point_geometry_idx ON osm_water_point USING gist (geometry); diff --git a/layers/waterway/README.md b/layers/waterway/README.md deleted file mode 100644 index 4898394..0000000 --- a/layers/waterway/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# waterway - -Rivers based of OpenStreetMap [waterways](http://wiki.openstreetmap.org/wiki/Waterways) for *z8* to *z14* -and Natural Earth rivers and lake centerlines from *z3* to *z7*. -Too short linestrings are filtered out for some zoom levels. Waterways do no not have a `subclass`. - -## Fields - -- **class**: The original value of the [`waterway`](http://wiki.openstreetmap.org/wiki/Key:waterway) tag. -Can be one of [`stream`](http://wiki.openstreetmap.org/wiki/Tag:waterway%3Dstream), -[`river`](http://wiki.openstreetmap.org/wiki/Tag:waterway%3Driver), -[`canal`](http://wiki.openstreetmap.org/wiki/Tag:waterway%3Dcanal), -[`drain`](http://wiki.openstreetmap.org/wiki/Tag:waterway%3Ddrain), -[`ditch`](http://wiki.openstreetmap.org/wiki/Tag:waterway%3Dditch)`. - -## Mapping - -![](mapping.png) - - diff --git a/layers/waterway/mapping.png b/layers/waterway/mapping.png deleted file mode 100644 index 51a4f6e..0000000 Binary files a/layers/waterway/mapping.png and /dev/null differ diff --git a/layers/waterway/mapping.yaml b/layers/waterway/mapping.yaml index 5238b98..a69a9e8 100644 --- a/layers/waterway/mapping.yaml +++ b/layers/waterway/mapping.yaml @@ -1,14 +1,19 @@ generalized_tables: - # etldoc: imposm3 -> osm_waterway_linestring_gen0 - waterway_linestring_gen0: - source: waterway_linestring_gen1 - sql_filter: waterway IN ('river') AND ST_Length(geometry) > 10000 + # etldoc: imposm3 -> osm_waterway_linestring_gen3 + waterway_linestring_gen3: + source: waterway_linestring_gen2 + sql_filter: waterway IN ('river') tolerance: 200.0 - # etldoc: imposm3 -> osm_waterway_linestring_gen1 + # etldoc: imposm3 -> osm_waterway_linestring_gen2 + waterway_linestring_gen2: + source: waterway_linestring_gen1 + sql_filter: waterway IN ('river') + tolerance: 100.0 + # etldoc: imposm3 -> osm_waterway_linestring_gen1 waterway_linestring_gen1: source: waterway_linestring - sql_filter: waterway IN ('river') AND ST_Length(geometry) > 5000 - tolerance: 100.0 + sql_filter: waterway IN ('river') + tolerance: 50.0 tables: # etldoc: imposm3 -> osm_waterway_linestring waterway_linestring: diff --git a/layers/waterway/merge_waterway.sql b/layers/waterway/merge_waterway.sql new file mode 100644 index 0000000..c58b21a --- /dev/null +++ b/layers/waterway/merge_waterway.sql @@ -0,0 +1,44 @@ +-- We merge the waterways by name like the highways +-- This helps to drop not important rivers (since they do not have a name) +-- and also makes it possible to filter out too short rivers + +-- etldoc: osm_waterway_linestring -> osm_important_waterway_linestring +CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring AS ( + SELECT + (ST_Dump(geometry)).geom AS geometry, + name + FROM ( + SELECT + ST_LineMerge(ST_Union(geometry)) AS geometry, + name + FROM osm_waterway_linestring + WHERE name <> '' AND waterway = 'river' + GROUP BY name + ) 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 TABLE IF NOT EXISTS osm_important_waterway_linestring_gen1 AS ( + SELECT ST_Simplify(geometry, 60) AS geometry, name + FROM osm_important_waterway_linestring + WHERE ST_Length(geometry) > 1000 +); +CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen1_geometry_idx ON osm_important_waterway_linestring_gen1 USING gist(geometry); + +-- etldoc: osm_important_waterway_linestring_gen1 -> osm_important_waterway_linestring_gen2 +CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen2 AS ( + SELECT ST_Simplify(geometry, 100) AS geometry, name + FROM osm_important_waterway_linestring_gen1 + WHERE ST_Length(geometry) > 4000 +); +CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen2_geometry_idx ON osm_important_waterway_linestring_gen2 USING gist(geometry); + +-- etldoc: osm_important_waterway_linestring_gen2 -> osm_important_waterway_linestring_gen3 +CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen3 AS ( + SELECT ST_Simplify(geometry, 200) AS geometry, name + FROM osm_important_waterway_linestring_gen2 + WHERE ST_Length(geometry) > 8000 +); +CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen3_geometry_idx ON osm_important_waterway_linestring_gen3 USING gist(geometry); diff --git a/layers/waterway/waterway.sql b/layers/waterway/waterway.sql index f8c3fa1..5945595 100644 --- a/layers/waterway/waterway.sql +++ b/layers/waterway/waterway.sql @@ -1,89 +1,85 @@ -- etldoc: ne_110m_rivers_lake_centerlines -> waterway_z3 CREATE OR REPLACE VIEW waterway_z3 AS ( - SELECT geom AS geometry, 'river'::text AS class FROM ne_110m_rivers_lake_centerlines + SELECT geom AS geometry, 'river'::text AS class, NULL AS name 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 geom AS geometry, 'river'::text AS class FROM ne_50m_rivers_lake_centerlines + SELECT geom AS geometry, 'river'::text AS class, NULL AS name 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 geom AS geometry, 'river'::text AS class FROM ne_10m_rivers_lake_centerlines + SELECT geom AS geometry, 'river'::text AS class, NULL AS name FROM ne_10m_rivers_lake_centerlines WHERE featurecla = 'River' ); --- etldoc: osm_waterway_linestring -> waterway_z8 -CREATE OR REPLACE VIEW waterway_z8 AS ( - SELECT geometry, waterway AS class FROM osm_waterway_linestring - WHERE waterway IN ('river') AND ST_Length(geometry) > 10000 -); - --- etldoc: osm_waterway_linestring -> waterway_z9 +-- etldoc: osm_waterway_linestring_gen3 -> waterway_z9 CREATE OR REPLACE VIEW waterway_z9 AS ( - SELECT geometry, waterway AS class FROM osm_waterway_linestring - WHERE waterway IN ('river') AND ST_Length(geometry) > 5000 + SELECT geometry, 'river'::text AS class, name FROM osm_important_waterway_linestring_gen3 ); --- etldoc: osm_waterway_linestring -> waterway_z11 +-- etldoc: osm_waterway_linestring_gen2 -> waterway_z10 +CREATE OR REPLACE VIEW waterway_z10 AS ( + SELECT geometry, 'river'::text AS class, name FROM osm_important_waterway_linestring_gen2 +); + +-- etldoc: osm_waterway_linestring_gen1 -> waterway_z11 CREATE OR REPLACE VIEW waterway_z11 AS ( - SELECT geometry, waterway AS class FROM osm_waterway_linestring - WHERE waterway IN ('river') AND ST_Length(geometry) > 5000 + SELECT geometry, 'river'::text AS class, name FROM osm_important_waterway_linestring_gen1 ); -- etldoc: osm_waterway_linestring -> waterway_z12 CREATE OR REPLACE VIEW waterway_z12 AS ( - SELECT geometry, waterway AS class FROM osm_waterway_linestring - WHERE waterway IN ('river', 'canal') OR (waterway = 'stream' AND ST_Length(geometry) > 1000) + SELECT geometry, waterway AS class, name 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 AS class FROM osm_waterway_linestring - WHERE waterway IN ('river', 'canal', 'stream', 'drain', 'ditch') AND ST_Length(geometry) > 300 + SELECT geometry, waterway::text AS class, name 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 AS class FROM osm_waterway_linestring + SELECT geometry, waterway::text AS class, name FROM osm_waterway_linestring ); - --- etldoc: layer_waterway[shape=record fillcolor=lightpink, style="rounded,filled", --- etldoc: label="layer_waterway | z3 | z4_5 | z6_7 | z8 | z9_10 | z11 | z12| z13| z14_" ] ; +-- 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) AS $$ - SELECT geometry, class FROM ( - -- etldoc: waterway_z3 -> layer_waterway:z3 +RETURNS TABLE(geometry geometry, class text, name text) AS $$ + SELECT geometry, class, NULLIF(name, '') AS name FROM ( + -- etldoc: waterway_z3 -> layer_waterway:z3 SELECT * FROM waterway_z3 WHERE zoom_level = 3 UNION ALL - -- etldoc: waterway_z4 -> layer_waterway:z4_5 + -- etldoc: waterway_z4 -> layer_waterway:z4_5 SELECT * FROM waterway_z4 WHERE zoom_level BETWEEN 4 AND 5 UNION ALL - -- etldoc: waterway_z6 -> layer_waterway:z6_7 - SELECT * FROM waterway_z6 WHERE zoom_level BETWEEN 6 AND 7 + -- etldoc: waterway_z6 -> layer_waterway:z6_8 + SELECT * FROM waterway_z6 WHERE zoom_level BETWEEN 6 AND 8 UNION ALL - -- etldoc: waterway_z8 -> layer_waterway:z8 - SELECT * FROM waterway_z8 WHERE zoom_level = 8 + -- etldoc: waterway_z9 -> layer_waterway:z9 + SELECT * FROM waterway_z9 WHERE zoom_level = 9 UNION ALL - -- etldoc: waterway_z9 -> layer_waterway:z9_10 - SELECT * FROM waterway_z9 WHERE zoom_level BETWEEN 9 AND 10 + -- etldoc: waterway_z10 -> layer_waterway:z10 + SELECT * FROM waterway_z10 WHERE zoom_level = 10 UNION ALL - -- etldoc: waterway_z11 -> layer_waterway:z11 + -- etldoc: waterway_z11 -> layer_waterway:z11 SELECT * FROM waterway_z11 WHERE zoom_level = 11 UNION ALL - -- etldoc: waterway_z12 -> layer_waterway:z12 + -- etldoc: waterway_z12 -> layer_waterway:z12 SELECT * FROM waterway_z12 WHERE zoom_level = 12 UNION ALL - -- etldoc: waterway_z13 -> layer_waterway:z13 + -- etldoc: waterway_z13 -> layer_waterway:z13 SELECT * FROM waterway_z13 WHERE zoom_level = 13 UNION ALL - -- etldoc: waterway_z14 -> layer_waterway:z14_ + -- etldoc: waterway_z14 -> layer_waterway:z14 SELECT * FROM waterway_z14 WHERE zoom_level >= 14 ) AS zoom_levels WHERE geometry && bbox; diff --git a/layers/waterway/waterway.yaml b/layers/waterway/waterway.yaml index e822331..187a329 100644 --- a/layers/waterway/waterway.yaml +++ b/layers/waterway/waterway.yaml @@ -1,11 +1,15 @@ layer: id: "waterway" description: | - Rivers based of OpenStreetMap [waterways](http://wiki.openstreetmap.org/wiki/Waterways) for *z8* to *z14* - and Natural Earth rivers and lake centerlines from *z3* to *z7*. - Too short linestrings are filtered out for some zoom levels. Waterways do no not have a `subclass`. + Rivers based of OpenStreetMap [waterways](http://wiki.openstreetmap.org/wiki/Waterways) for *z9* to *z14* + and Natural Earth rivers and lake centerlines from *z3* to *z8*. + Linestrings without a name or which are too short are filtered + out at low zoom levels. Waterways do no not have a `subclass` field. buffer_size: 4 fields: + name: | + The OSM [`name`](http://wiki.openstreetmap.org/wiki/Key:name) value of the waterway. + The `name` field is empty for NaturalEarth data until **z9** when OSM data is used. class: | The original value of the [`waterway`](http://wiki.openstreetmap.org/wiki/Key:waterway) tag. Can be one of [`stream`](http://wiki.openstreetmap.org/wiki/Tag:waterway%3Dstream), @@ -15,8 +19,9 @@ layer: [`ditch`](http://wiki.openstreetmap.org/wiki/Tag:waterway%3Dditch)`. datasource: geometry_field: geometry - query: (SELECT geometry, class FROM layer_waterway(!bbox!, z(!scale_denominator!))) AS t + query: (SELECT geometry, name, class FROM layer_waterway(!bbox!, z(!scale_denominator!))) AS t schema: + - ./merge_waterway.sql - ./waterway.sql datasources: - type: imposm3 diff --git a/openmaptiles.yaml b/openmaptiles.yaml index 0ab0126..5944289 100644 --- a/openmaptiles.yaml +++ b/openmaptiles.yaml @@ -12,6 +12,7 @@ tileset: - layers/water/water.yaml - layers/waterway/waterway.yaml - layers/landcover/landcover.yaml + - layers/park/park.yaml - layers/landuse/landuse.yaml name: OpenMapTiles v1.0 description: "A tileset showcasing all layers in OpenMapTiles. http://openmaptiles.org"