diff --git a/data.yml b/data.yml index 2ae37dc..49700ef 100644 --- a/data.yml +++ b/data.yml @@ -157,71 +157,15 @@ Layer: max_size: 512 password: osm port: 5432 - srid: '' - table: |- - ( - SELECT * FROM ( - SELECT geom, name, class, rank, scalerank, - row_number() OVER ( - PARTITION BY LabelGrid(geom, 150 * !pixel_width!) - ORDER BY scalerank ASC NULLS LAST, - CASE class - WHEN 'settlement' THEN 10 - WHEN 'subregion' THEN 5 - WHEN 'locality' THEN 2 ELSE 1 - END DESC, - rank DESC, - population DESC NULLS LAST, - length(name) DESC - ) AS gridrank - FROM ( - SELECT * FROM place_z2 - WHERE z(!scale_denominator!) = 2 - UNION ALL - SELECT * FROM place_z3 - WHERE z(!scale_denominator!) = 3 - UNION ALL - SELECT * FROM place_z4 - WHERE z(!scale_denominator!) = 4 - UNION ALL - SELECT * FROM place_z5 - WHERE z(!scale_denominator!) = 5 - UNION ALL - SELECT * FROM place_z6 - WHERE z(!scale_denominator!) = 6 - UNION ALL - SELECT * FROM place_z7 - WHERE z(!scale_denominator!) = 7 - UNION ALL - SELECT * FROM place_z8 - WHERE z(!scale_denominator!) BETWEEN 8 AND 9 - UNION ALL - SELECT * FROM place_z10 - WHERE z(!scale_denominator!) = 10 - UNION ALL - SELECT * FROM place_z12 - WHERE z(!scale_denominator!) BETWEEN 11 AND 12 - UNION ALL - SELECT * FROM place_z13 - WHERE z(!scale_denominator!) >= 13 - ) AS place - WHERE geom && !bbox! - ) AS ranked_place - WHERE z(!scale_denominator!) <= 7 OR - (z(!scale_denominator!) = 8 AND gridrank <= 4) OR - (z(!scale_denominator!) = 9 AND gridrank <= 9) OR - (z(!scale_denominator!) = 10 AND gridrank <= 9) OR - (z(!scale_denominator!) = 11 AND gridrank <= 9) OR - (z(!scale_denominator!) = 12 AND gridrank <= 9) OR - z(!scale_denominator!) >= 13 - ) AS t + srid: 900913 + table: (SELECT * FROM layer_place(!bbox!, z(!scale_denominator!), !pixel_width!)) AS t type: postgis user: osm description: Buildings fields: class: String - gridrank: Number name: String + rank: String scalerank: Number properties: "buffer-size": 64 diff --git a/schema/layers/place.sql b/schema/layers/place.sql index e1b4249..6382fa3 100644 --- a/schema/layers/place.sql +++ b/schema/layers/place.sql @@ -1,53 +1,113 @@ CREATE OR REPLACE VIEW place_z2 AS ( - SELECT geom, name, 'settlement' AS class, 'city'::place AS rank, scalerank, pop_min AS population + SELECT geom, name, 'settlement' AS class, 'city'::place AS rank, scalerank, pop_min AS population FROM ne_10m_populated_places WHERE scalerank <= 0 ); CREATE OR REPLACE VIEW place_z3 AS ( - SELECT geom, name, 'settlement' AS class, 'city'::place AS rank, scalerank, pop_min AS population + SELECT geom, name, 'settlement' AS class, 'city'::place AS rank, scalerank, pop_min AS population FROM ne_10m_populated_places WHERE scalerank <= 2 ); CREATE OR REPLACE VIEW place_z4 AS ( - SELECT geom, name, 'settlement' AS class, 'city'::place AS rank, scalerank, pop_min AS population + SELECT geom, name, 'settlement' AS class, 'city'::place AS rank, scalerank, pop_min AS population FROM ne_10m_populated_places WHERE scalerank <= 5 ); CREATE OR REPLACE VIEW place_z5 AS ( - SELECT geom, name, 'settlement' AS class, 'city'::place AS rank, scalerank, pop_min AS population + SELECT geom, name, 'settlement' AS class, 'city'::place AS rank, scalerank, pop_min AS population FROM ne_10m_populated_places WHERE scalerank <= 6 ); CREATE OR REPLACE VIEW place_z6 AS ( - SELECT geom, name, 'settlement' AS class, 'city'::place AS rank, scalerank, pop_min AS population + SELECT geom, name, 'settlement' AS class, 'city'::place AS rank, scalerank, pop_min AS population FROM ne_10m_populated_places WHERE scalerank <= 7 ); CREATE OR REPLACE VIEW place_z7 AS ( - SELECT geom, name, 'settlement' AS class, 'city'::place AS rank, scalerank, pop_min AS population + SELECT geom, name, 'settlement' AS class, 'city'::place AS rank, scalerank, pop_min AS population FROM ne_10m_populated_places ); CREATE OR REPLACE VIEW place_z8 AS ( - SELECT way AS geom, name, class::text, rank, NULL::integer AS scalerank, population FROM place_point + SELECT way AS geom, name, class::text, rank, NULL::integer AS scalerank, population FROM place_point WHERE rank IN ('city', 'town') ); CREATE OR REPLACE VIEW place_z10 AS ( - SELECT way AS geom, name, class::text, rank, NULL::integer AS scalerank, population FROM place_point + SELECT way AS geom, name, class::text, rank, NULL::integer AS scalerank, population FROM place_point WHERE rank IN ('city', 'town', 'village') OR class='subregion' ); CREATE OR REPLACE VIEW place_z11 AS ( - SELECT way AS geom, name, class::text, rank, NULL::integer AS scalerank, population FROM place_point + SELECT way AS geom, name, class::text, rank, NULL::integer AS scalerank, population FROM place_point WHERE class IN ('subregion', 'settlement') ); CREATE OR REPLACE VIEW place_z13 AS ( - SELECT way AS geom, name, class::text, rank, NULL::integer AS scalerank, population FROM place_point + SELECT way AS geom, name, class::text, rank, NULL::integer AS scalerank, population FROM place_point ); + +CREATE OR REPLACE FUNCTION layer_place(bbox geometry, zoom_level int, pixel_width numeric) +RETURNS TABLE(geom geometry, name text, class text, rank text, scalerank int) AS $$ + WITH zoom_levels AS ( + SELECT * FROM place_z2 + WHERE zoom_level = 2 + UNION ALL + SELECT * FROM place_z3 + WHERE zoom_level = 3 + UNION ALL + SELECT * FROM place_z4 + WHERE zoom_level = 4 + UNION ALL + SELECT * FROM place_z5 + WHERE zoom_level = 5 + UNION ALL + SELECT * FROM place_z6 + WHERE zoom_level = 6 + UNION ALL + SELECT * FROM place_z7 + WHERE zoom_level = 7 + UNION ALL + SELECT * FROM place_z8 + WHERE zoom_level BETWEEN 8 AND 9 + UNION ALL + SELECT * FROM place_z10 + WHERE zoom_level = 10 + UNION ALL + SELECT * FROM place_z12 + WHERE zoom_level BETWEEN 11 AND 12 + UNION ALL + SELECT * FROM place_z13 + WHERE zoom_level >= 13 + ), ranked_places AS ( + SELECT geom, name, class, rank, scalerank, + row_number() OVER ( + PARTITION BY LabelGrid(geom, 150 * pixel_width) + ORDER BY scalerank ASC NULLS LAST, + CASE class + WHEN 'settlement' THEN 10 + WHEN 'subregion' THEN 5 + WHEN 'locality' THEN 2 ELSE 1 + END DESC, + rank DESC, + population DESC NULLS LAST, + length(name) DESC + ) AS gridrank + FROM zoom_levels + WHERE geom && bbox + ) + SELECT geom, name, class, rank::text, scalerank FROM ranked_places + WHERE + zoom_level <= 7 OR + (zoom_level = 8 AND gridrank <= 4) OR + (zoom_level = 9 AND gridrank <= 9) OR + (zoom_level = 10 AND gridrank <= 9) OR + (zoom_level = 11 AND gridrank <= 9) OR + (zoom_level = 12 AND gridrank <= 9) OR + zoom_level >= 13; +$$ LANGUAGE SQL IMMUTABLE;