diff --git a/data.yml b/data.yml index 611da25..544b1c0 100644 --- a/data.yml +++ b/data.yml @@ -87,42 +87,8 @@ Layer: max_size: 512 password: osm port: 5432 - srid: '' - table: |- - ( SELECT * - FROM ( - SELECT * FROM boundary_z0 WHERE z(!scale_denominator!) = 0 - UNION ALL - SELECT * FROM boundary_z1 WHERE z(!scale_denominator!) BETWEEN 1 AND 2 - UNION ALL - SELECT * FROM boundary_z3 WHERE z(!scale_denominator!) = 3 - UNION ALL - SELECT * FROM boundary_z4 WHERE z(!scale_denominator!) = 4 - UNION ALL - SELECT * FROM boundary_z5 WHERE z(!scale_denominator!) BETWEEN 5 AND 6 - UNION ALL - SELECT * FROM boundary_z7 WHERE z(!scale_denominator!) = 7 - UNION ALL - SELECT ST_Simplify(geom, 400) AS geom, admin_level, scalerank, class - FROM boundary_z8 WHERE z(!scale_denominator!) = 8 - UNION ALL - SELECT ST_Simplify(geom, 320) AS geom, admin_level, scalerank, class - FROM boundary_z8 WHERE z(!scale_denominator!) = 9 - UNION ALL - SELECT ST_Simplify(geom, 150) AS geom, admin_level, scalerank, class - FROM boundary_z10 WHERE z(!scale_denominator!) = 10 - UNION ALL - SELECT ST_Simplify(geom, 100) AS geom, admin_level, scalerank, class - FROM boundary_z10 WHERE z(!scale_denominator!) = 11 - UNION ALL - SELECT ST_Simplify(geom, 50) AS geom, admin_level, scalerank, class - FROM boundary_z10 WHERE z(!scale_denominator!) = 12 - UNION ALL - SELECT geom, admin_level, scalerank, class - FROM boundary_z10 WHERE z(!scale_denominator!) >= 13 - ) AS admin - WHERE geom && !bbox! - ) AS data + srid: 900913 + table: (SELECT * FROM layer_boundary(!bbox!, z(!scale_denominator!))) AS t type: postgis user: osm description: Buildings diff --git a/schema/layers/boundary.sql b/schema/layers/boundary.sql index 350cd7c..8833f17 100644 --- a/schema/layers/boundary.sql +++ b/schema/layers/boundary.sql @@ -85,3 +85,40 @@ CREATE OR REPLACE VIEW boundary_z10 AS ( FROM admin_line WHERE level <= 8 ); + +CREATE OR REPLACE FUNCTION layer_boundary (bbox geometry, zoom_level int) +RETURNS TABLE(geom geometry, admin_level int, scalerank int, class text) AS $$ + WITH zoom_levels AS ( + SELECT * FROM boundary_z0 WHERE zoom_level = 0 + UNION ALL + SELECT * FROM boundary_z1 WHERE zoom_level BETWEEN 1 AND 2 + UNION ALL + SELECT * FROM boundary_z3 WHERE zoom_level = 3 + UNION ALL + SELECT * FROM boundary_z4 WHERE zoom_level = 4 + UNION ALL + SELECT * FROM boundary_z5 WHERE zoom_level BETWEEN 5 AND 6 + UNION ALL + SELECT * FROM boundary_z7 WHERE zoom_level = 7 + UNION ALL + SELECT ST_Simplify(geom, 400) AS geom, admin_level, scalerank, class + FROM boundary_z8 WHERE zoom_level = 8 + UNION ALL + SELECT ST_Simplify(geom, 320) AS geom, admin_level, scalerank, class + FROM boundary_z8 WHERE zoom_level = 9 + UNION ALL + SELECT ST_Simplify(geom, 150) AS geom, admin_level, scalerank, class + FROM boundary_z10 WHERE zoom_level = 10 + UNION ALL + SELECT ST_Simplify(geom, 100) AS geom, admin_level, scalerank, class + FROM boundary_z10 WHERE zoom_level = 11 + UNION ALL + SELECT ST_Simplify(geom, 50) AS geom, admin_level, scalerank, class + FROM boundary_z10 WHERE zoom_level = 12 + UNION ALL + SELECT geom, admin_level, scalerank, class + FROM boundary_z10 WHERE zoom_level >= 13 + ) + SELECT geom, admin_level, scalerank::int, class FROM zoom_levels + WHERE geom && bbox; +$$ LANGUAGE SQL;