From b77cc7a43ae8157b956067bde7a7081a63728fa7 Mon Sep 17 00:00:00 2001 From: lukasmartinelli Date: Tue, 15 Nov 2016 19:37:19 +0100 Subject: [PATCH 1/5] More nuanced waterway --- layers/waterway/README.md | 1 + layers/waterway/mapping.yaml | 19 +++++--- layers/waterway/merge_waterway.sql | 44 +++++++++++++++++++ layers/waterway/waterway.sql | 69 ++++++++++++++---------------- layers/waterway/waterway.yaml | 4 +- 5 files changed, 93 insertions(+), 44 deletions(-) create mode 100644 layers/waterway/merge_waterway.sql diff --git a/layers/waterway/README.md b/layers/waterway/README.md index 48983945..3b2016f3 100644 --- a/layers/waterway/README.md +++ b/layers/waterway/README.md @@ -6,6 +6,7 @@ Too short linestrings are filtered out for some zoom levels. Waterways do no not ## Fields +- **name**: The OSM [`name`](http://wiki.openstreetmap.org/wiki/Key:name) value of the waterway or the name from Natural Earth for lower zoom levels. - **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), diff --git a/layers/waterway/mapping.yaml b/layers/waterway/mapping.yaml index 5238b982..a69a9e88 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 00000000..c58b21a5 --- /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 29cb62c4..44444132 100644 --- a/layers/waterway/waterway.sql +++ b/layers/waterway/waterway.sql @@ -1,89 +1,86 @@ -- etldoc: ne_110m_rivers_lake_centerlines -> waterway_z3 CREATE OR REPLACE VIEW waterway_z3 AS ( - SELECT geom AS geometry, 'river' AS class FROM ne_110m_rivers_lake_centerlines + SELECT geom AS geometry, 'river' AS class, 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' AS class FROM ne_50m_rivers_lake_centerlines + SELECT geom AS geometry, 'river' AS class, 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' AS class FROM ne_10m_rivers_lake_centerlines + SELECT geom AS geometry, 'river' AS class, 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, waterway AS class FROM osm_waterway_linestring_gen3 + 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_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: 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_" ] ; 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, 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 e8223311..f03dde45 100644 --- a/layers/waterway/waterway.yaml +++ b/layers/waterway/waterway.yaml @@ -6,6 +6,7 @@ layer: Too short linestrings are filtered out for some zoom levels. Waterways do no not have a `subclass`. buffer_size: 4 fields: + name: The OSM [`name`](http://wiki.openstreetmap.org/wiki/Key:name) value of the waterway or the name from Natural Earth for lower zoom levels. 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 +16,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 From 98d77b0638b5e7a09110e2e2c7c46ed369160519 Mon Sep 17 00:00:00 2001 From: lukasmartinelli Date: Tue, 15 Nov 2016 21:23:54 +0100 Subject: [PATCH 2/5] Show only linestrings with name on z11 --- layers/waterway/waterway.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/waterway/waterway.sql b/layers/waterway/waterway.sql index 44444132..93e0acbe 100644 --- a/layers/waterway/waterway.sql +++ b/layers/waterway/waterway.sql @@ -30,7 +30,7 @@ CREATE OR REPLACE VIEW waterway_z10 AS ( -- etldoc: osm_waterway_linestring_gen1 -> waterway_z11 CREATE OR REPLACE VIEW waterway_z11 AS ( - SELECT geometry, 'river'::text AS class, name FROM osm_waterway_linestring_gen1 + SELECT geometry, 'river'::text AS class, name FROM osm_important_waterway_linestring_gen1 ); -- etldoc: osm_waterway_linestring -> waterway_z12 From 6f68ab999dd9efde57eccbb34f687bb543bda252 Mon Sep 17 00:00:00 2001 From: Lukas Martinelli Date: Tue, 29 Nov 2016 13:33:33 +0000 Subject: [PATCH 3/5] Ensure empty name is NULL in waterway --- layers/waterway/waterway.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/waterway/waterway.sql b/layers/waterway/waterway.sql index 293b0de0..a5439dbf 100644 --- a/layers/waterway/waterway.sql +++ b/layers/waterway/waterway.sql @@ -55,7 +55,7 @@ CREATE OR REPLACE VIEW waterway_z14 AS ( CREATE OR REPLACE FUNCTION layer_waterway(bbox geometry, zoom_level int) RETURNS TABLE(geometry geometry, class text, name text) AS $$ - SELECT geometry, class, name FROM ( + SELECT geometry, class, NULLIF(name, '') AS name FROM ( -- etldoc: waterway_z3 -> layer_waterway:z3 SELECT * FROM waterway_z3 WHERE zoom_level = 3 UNION ALL From f9def56e0b98f2dc00bc5ff31b5fc89478f849e7 Mon Sep 17 00:00:00 2001 From: Lukas Martinelli Date: Tue, 29 Nov 2016 15:08:23 +0000 Subject: [PATCH 4/5] Leave names empty for NE data due to different names --- layers/waterway/waterway.sql | 6 +++--- layers/waterway/waterway.yaml | 11 +++++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/layers/waterway/waterway.sql b/layers/waterway/waterway.sql index a5439dbf..5713fb49 100644 --- a/layers/waterway/waterway.sql +++ b/layers/waterway/waterway.sql @@ -1,19 +1,19 @@ -- etldoc: ne_110m_rivers_lake_centerlines -> waterway_z3 CREATE OR REPLACE VIEW waterway_z3 AS ( - SELECT geom AS geometry, 'river'::text AS class, name 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, name 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, name 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' ); diff --git a/layers/waterway/waterway.yaml b/layers/waterway/waterway.yaml index f03dde45..187a3293 100644 --- a/layers/waterway/waterway.yaml +++ b/layers/waterway/waterway.yaml @@ -1,12 +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 or the name from Natural Earth for lower zoom levels. + 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), From a93c066fece02cb1793c8a265bf2681c647c96e7 Mon Sep 17 00:00:00 2001 From: Lukas Martinelli Date: Wed, 30 Nov 2016 16:25:12 +0000 Subject: [PATCH 5/5] Add missing etldocs slots to waterway layer --- layers/waterway/waterway.sql | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/layers/waterway/waterway.sql b/layers/waterway/waterway.sql index 5713fb49..59455953 100644 --- a/layers/waterway/waterway.sql +++ b/layers/waterway/waterway.sql @@ -19,7 +19,6 @@ CREATE OR REPLACE VIEW waterway_z6 AS ( -- etldoc: osm_waterway_linestring_gen3 -> waterway_z9 CREATE OR REPLACE VIEW waterway_z9 AS ( - --SELECT geometry, waterway AS class FROM osm_waterway_linestring_gen3 SELECT geometry, 'river'::text AS class, name FROM osm_important_waterway_linestring_gen3 ); @@ -51,7 +50,7 @@ CREATE OR REPLACE VIEW waterway_z14 AS ( ); -- 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: 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) AS $$