From c3aa9ae0a8fcbee9c5bde808b731e1e5cbf77c58 Mon Sep 17 00:00:00 2001 From: lukasmartinelli Date: Sat, 8 Oct 2016 16:34:46 +0200 Subject: [PATCH] Refactor water into table function --- data.yml | 47 ++---------------------- schema/layers/water.sql | 80 ++++++++++++++++++++++++++++++++--------- 2 files changed, 65 insertions(+), 62 deletions(-) diff --git a/data.yml b/data.yml index 544b1c0..e809b33 100644 --- a/data.yml +++ b/data.yml @@ -23,51 +23,8 @@ Layer: max_size: 512 password: osm port: 5432 - srid: '' - table: |- - ( SELECT * - FROM ( - SELECT * FROM water_z0 - WHERE z(!scale_denominator!) = 0 - UNION ALL - SELECT * FROM water_z1 - WHERE z(!scale_denominator!) = 1 - UNION ALL - SELECT * FROM water_z2 - WHERE z(!scale_denominator!) = 2 - UNION ALL - SELECT * FROM water_z3 - WHERE z(!scale_denominator!) = 3 - UNION ALL - SELECT * FROM water_z4 - WHERE z(!scale_denominator!) = 4 - UNION ALL - SELECT * FROM water_z5 - WHERE z(!scale_denominator!) = 5 - UNION ALL - SELECT * FROM water_z6 - WHERE z(!scale_denominator!) = 6 - UNION ALL - SELECT ST_SimplifyPreserveTopology(geom, 200) AS geom FROM water_z8 - WHERE z(!scale_denominator!) = 8 - UNION ALL - SELECT ST_SimplifyPreserveTopology(geom, 100) AS geom FROM water_z8 - WHERE z(!scale_denominator!) BETWEEN 9 AND 10 - UNION ALL - SELECT * FROM water_z11 - WHERE z(!scale_denominator!) = 11 - UNION ALL - SELECT * FROM water_z12 - WHERE z(!scale_denominator!) = 12 - UNION ALL - SELECT * FROM water_z13 - WHERE z(!scale_denominator!) = 13 - UNION ALL - SELECT * FROM water_z14 - WHERE z(!scale_denominator!) >= 14 - ) AS water - WHERE geom && !bbox! - ) AS data + srid: 900913 + table: (SELECT * FROM layer_water(!bbox!, z(!scale_denominator!))) AS t type: postgis user: osm description: Ocean and lake polygons diff --git a/schema/layers/water.sql b/schema/layers/water.sql index 663450d..daab1a8 100644 --- a/schema/layers/water.sql +++ b/schema/layers/water.sql @@ -55,45 +55,91 @@ CREATE OR REPLACE VIEW water_z6 AS ( CREATE OR REPLACE VIEW water_z8 AS ( SELECT way AS geom FROM water_areas WHERE way_area > 1000000 - UNION ALL - SELECT way AS geom FROM waterways - WHERE waterway IN ('river') AND ST_Length(way) > 10000 + UNION ALL + SELECT way AS geom FROM waterways + WHERE waterway IN ('river') AND ST_Length(way) > 10000 ); CREATE OR REPLACE VIEW water_z9 AS ( SELECT way AS geom FROM water_areas WHERE way_area > 500000 - UNION ALL - SELECT way AS geom FROM waterways - WHERE waterway IN ('river') AND ST_Length(way) > 5000 + UNION ALL + SELECT way AS geom FROM waterways + WHERE waterway IN ('river') AND ST_Length(way) > 5000 ); CREATE OR REPLACE VIEW water_z11 AS ( SELECT way AS geom FROM water_areas WHERE way_area > 50000 - UNION ALL - SELECT way AS geom FROM waterways - WHERE waterway IN ('river') + UNION ALL + SELECT way AS geom FROM waterways + WHERE waterway IN ('river') ); CREATE OR REPLACE VIEW water_z12 AS ( SELECT way AS geom FROM water_areas WHERE way_area > 40000 - UNION ALL - SELECT way AS geom FROM waterways - WHERE waterway IN ('river', 'canal', 'stream') + UNION ALL + SELECT way AS geom FROM waterways + WHERE waterway IN ('river', 'canal', 'stream') ); CREATE OR REPLACE VIEW water_z13 AS ( SELECT way AS geom FROM water_areas WHERE way_area > 2000 - UNION ALL - SELECT way AS geom FROM waterways - WHERE waterway IN ('river', 'canal', 'stream', 'drain', 'ditch') + UNION ALL + SELECT way AS geom FROM waterways + WHERE waterway IN ('river', 'canal', 'stream', 'drain', 'ditch') ); CREATE OR REPLACE VIEW water_z14 AS ( SELECT way AS geom FROM water_areas - UNION ALL - SELECT way AS geom FROM waterways + UNION ALL + SELECT way AS geom FROM waterways ); + +CREATE OR REPLACE FUNCTION layer_water (bbox geometry, zoom_level int) +RETURNS TABLE(geom geometry) AS $$ + WITH zoom_levels AS ( + SELECT * FROM water_z0 + WHERE zoom_level = 0 + UNION ALL + SELECT * FROM water_z1 + WHERE zoom_level = 1 + UNION ALL + SELECT * FROM water_z2 + WHERE zoom_level = 2 + UNION ALL + SELECT * FROM water_z3 + WHERE zoom_level = 3 + UNION ALL + SELECT * FROM water_z4 + WHERE zoom_level = 4 + UNION ALL + SELECT * FROM water_z5 + WHERE zoom_level = 5 + UNION ALL + SELECT * FROM water_z6 + WHERE zoom_level = 6 + UNION ALL + SELECT ST_SimplifyPreserveTopology(geom, 200) AS geom FROM water_z8 + WHERE zoom_level = 8 + UNION ALL + SELECT ST_SimplifyPreserveTopology(geom, 100) AS geom FROM water_z8 + WHERE zoom_level BETWEEN 9 AND 10 + UNION ALL + SELECT * FROM water_z11 + WHERE zoom_level = 11 + UNION ALL + SELECT * FROM water_z12 + WHERE zoom_level = 12 + UNION ALL + SELECT * FROM water_z13 + WHERE zoom_level = 13 + UNION ALL + SELECT * FROM water_z14 + WHERE zoom_level >= 14 + ) + SELECT geom FROM zoom_levels + WHERE geom && bbox; +$$ LANGUAGE SQL;