diff --git a/data.yml b/data.yml index e809b33..fab9daa 100644 --- a/data.yml +++ b/data.yml @@ -68,34 +68,8 @@ Layer: max_size: 512 password: osm port: 5432 - srid: '' - table: |- - ( SELECT * - FROM ( - SELECT * FROM road_z4 WHERE z(!scale_denominator!) BETWEEN 4 AND 5 - UNION ALL - SELECT * FROM road_z5 WHERE z(!scale_denominator!) = 5 - UNION ALL - SELECT * FROM road_z6 WHERE z(!scale_denominator!) = 6 - UNION ALL - SELECT * FROM road_z7 WHERE z(!scale_denominator!) = 7 - UNION ALL - SELECT * FROM road_z8 WHERE z(!scale_denominator!) = 8 - UNION ALL - SELECT ST_Simplify(geom, 200), class FROM road_z9 WHERE z(!scale_denominator!) = 9 - UNION ALL - SELECT ST_Simplify(geom, 120), class FROM road_z10 WHERE z(!scale_denominator!) = 10 - UNION ALL - SELECT ST_Simplify(geom, 50), class FROM road_z11 WHERE z(!scale_denominator!) = 11 - UNION ALL - SELECT ST_Simplify(geom, 20), class FROM road_z12 WHERE z(!scale_denominator!) = 12 - UNION ALL - SELECT * FROM road_z13 WHERE z(!scale_denominator!) = 13 - UNION ALL - SELECT * FROM road_z14 WHERE z(!scale_denominator!) >= 14 - ) AS road - WHERE geom && !bbox! - ) AS data + srid: 900913 + table: (SELECT * FROM layer_road(!bbox!, z(!scale_denominator!))) AS t type: postgis user: osm description: Buildings diff --git a/schema/layers/road.sql b/schema/layers/road.sql index 0767f69..30eee11 100644 --- a/schema/layers/road.sql +++ b/schema/layers/road.sql @@ -1,8 +1,8 @@ CREATE OR REPLACE FUNCTION ne_road_class(type VARCHAR) RETURNS VARCHAR AS $$ SELECT CASE type - WHEN 'Major Highway' THEN 'motorway' - WHEN 'Secondary Highway' THEN 'trunk' - WHEN 'Road' THEN 'primary' + WHEN 'Major Highway' THEN 'motorway' + WHEN 'Secondary Highway' THEN 'trunk' + WHEN 'Road' THEN 'primary' ELSE type END; $$ LANGUAGE SQL IMMUTABLE; @@ -10,13 +10,13 @@ $$ LANGUAGE SQL IMMUTABLE; CREATE OR REPLACE VIEW ne_10m_global_roads AS ( SELECT geom, scalerank, ne_road_class(type) AS class FROM ne_10m_roads - WHERE continent <> 'North America' + WHERE continent <> 'North America' AND featurecla = 'Road' AND type IN ('Major Highway', 'Secondary Highway', 'Road') UNION ALL SELECT geom, scalerank, ne_road_class(type) AS class FROM ne_10m_roads_north_america - WHERE type IN ('Major Highway', 'Secondary Highway', 'Road') + WHERE type IN ('Major Highway', 'Secondary Highway', 'Road') ); CREATE OR REPLACE VIEW road_z4 AS ( @@ -92,3 +92,32 @@ CREATE OR REPLACE VIEW road_z14 AS ( SELECT way AS geom, class::text FROM road_areas ); + +CREATE OR REPLACE FUNCTION layer_road(bbox geometry, zoom_level int) +RETURNS TABLE(geom geometry, class text) AS $$ + WITH zoom_levels AS ( + SELECT * FROM road_z4 WHERE zoom_level BETWEEN 4 AND 5 + UNION ALL + SELECT * FROM road_z5 WHERE zoom_level = 5 + UNION ALL + SELECT * FROM road_z6 WHERE zoom_level = 6 + UNION ALL + SELECT * FROM road_z7 WHERE zoom_level = 7 + UNION ALL + SELECT * FROM road_z8 WHERE zoom_level = 8 + UNION ALL + SELECT ST_Simplify(geom, 200), class FROM road_z9 WHERE zoom_level = 9 + UNION ALL + SELECT ST_Simplify(geom, 120), class FROM road_z10 WHERE zoom_level = 10 + UNION ALL + SELECT ST_Simplify(geom, 50), class FROM road_z11 WHERE zoom_level = 11 + UNION ALL + SELECT ST_Simplify(geom, 20), class FROM road_z12 WHERE zoom_level = 12 + UNION ALL + SELECT * FROM road_z13 WHERE zoom_level = 13 + UNION ALL + SELECT * FROM road_z14 WHERE zoom_level >= 14 + ) + SELECT geom, class::text FROM zoom_levels + WHERE geom && bbox; +$$ LANGUAGE SQL IMMUTABLE;