CTEs always materialise so inline the union zoom level views ⚠️

This commit is contained in:
lukasmartinelli 2016-10-08 21:27:28 +02:00
parent d53ca84a36
commit 63985fca1e
9 changed files with 52 additions and 60 deletions

View File

@ -88,7 +88,7 @@ CREATE OR REPLACE VIEW boundary_z10 AS (
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 geom, admin_level, scalerank::int, class FROM (
SELECT * FROM boundary_z0 WHERE zoom_level = 0
UNION ALL
SELECT * FROM boundary_z1 WHERE zoom_level BETWEEN 1 AND 2
@ -118,7 +118,6 @@ RETURNS TABLE(geom geometry, admin_level int, scalerank int, class text) AS $$
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
) AS zoom_levels
WHERE geom && bbox;
$$ LANGUAGE SQL IMMUTABLE;

View File

@ -8,16 +8,15 @@ CREATE OR REPLACE VIEW building_z14 AS (
CREATE OR REPLACE FUNCTION layer_building(bbox geometry, zoom_level int)
RETURNS TABLE(geom geometry, osm_id bigint, render_height float) AS $$
WITH zoom_levels AS (
SELECT way, osm_id,
least(greatest(3, COALESCE(height, levels*3.66,5)),400)^.7 AS render_height
FROM (
SELECT osm_id, ST_Simplify(way, 10) AS way, height, levels FROM building_z13
WHERE zoom_level = 13
UNION ALL
SELECT * FROM building_z14
WHERE zoom_level >= 14
)
SELECT way, osm_id,
least(greatest(3, COALESCE(height, levels*3.66,5)),400)^.7 AS render_height
FROM zoom_levels
) AS zoom_levels
WHERE way && bbox
ORDER BY render_height, ST_YMin(way) DESC;
$$ LANGUAGE SQL IMMUTABLE;

View File

@ -27,7 +27,7 @@ CREATE OR REPLACE VIEW country_z5 AS (
CREATE OR REPLACE FUNCTION layer_country(bbox geometry, zoom_level int)
RETURNS TABLE(geom geometry, name text, abbrev text, postal text, scalerank int, labelrank int) AS $$
WITH zoom_levels AS (
SELECT geom, name, abbrev, postal, scalerank::int, labelrank::int FROM (
SELECT * FROM country_z1
WHERE zoom_level = 1
UNION ALL
@ -39,8 +39,7 @@ RETURNS TABLE(geom geometry, name text, abbrev text, postal text, scalerank int,
UNION ALL
SELECT * FROM country_z5
WHERE zoom_level >= 5
)
SELECT geom, name, abbrev, postal, scalerank::int, labelrank::int FROM zoom_levels
) AS t
WHERE geom && bbox
ORDER BY scalerank, labelrank, length(name);
$$ LANGUAGE SQL IMMUTABLE;

View File

@ -18,7 +18,7 @@ CREATE OR REPLACE VIEW ice_z5 AS (
CREATE OR REPLACE FUNCTION layer_ice(bbox geometry, zoom_level int)
RETURNS TABLE(geom geometry, class text) AS $$
WITH zoom_levels AS (
SELECT geom, type::text AS class FROM (
SELECT ST_Simplify(geom, 80000) AS geom, type FROM ice_z0
WHERE zoom_level BETWEEN 0 AND 1
UNION ALL
@ -27,7 +27,6 @@ RETURNS TABLE(geom geometry, class text) AS $$
UNION ALL
SELECT * FROM ice_z5
WHERE zoom_level BETWEEN 5 AND 8
)
SELECT geom, type::text AS class FROM zoom_levels
) AS zoom_levels
WHERE geom && bbox;
$$ LANGUAGE SQL IMMUTABLE;

View File

@ -54,7 +54,21 @@ CREATE OR REPLACE VIEW place_z13 AS (
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 geom, name, class, rank::text, scalerank 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 zoom_level = 2
UNION ALL
@ -84,24 +98,9 @@ RETURNS TABLE(geom geometry, name text, class text, rank text, scalerank int) AS
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
) AS zoom_levels
WHERE geom && bbox
)
SELECT geom, name, class, rank::text, scalerank FROM ranked_places
) AS ranked_places
WHERE
zoom_level <= 7 OR
(zoom_level = 8 AND gridrank <= 4) OR

View File

@ -124,6 +124,6 @@ RETURNS TABLE(geom geometry, class text) AS $$
SELECT * FROM road_z13 WHERE zoom_level = 13
UNION ALL
SELECT * FROM road_z14 WHERE zoom_level >= 14
) AS t
) AS zoom_levels
WHERE geom && bbox;
$$ LANGUAGE SQL IMMUTABLE;

View File

@ -29,16 +29,15 @@ CREATE OR REPLACE VIEW state_z4 AS (
CREATE OR REPLACE FUNCTION layer_state(bbox geometry, zoom_level int)
RETURNS TABLE(geom geometry, name text, name_en text, abbrev text, postal text, scalerank int, labelrank int) AS $$
WITH zoom_levels AS (
SELECT geom,
COALESCE(name_local, name_en) AS name_local, name_en,
abbrev, postal, scalerank::int, labelrank::int FROM (
SELECT * FROM state_z3
WHERE zoom_level = 3
UNION ALL
SELECT * FROM state_z4
WHERE zoom_level >= 4
)
SELECT geom,
COALESCE(name_local, name_en) AS name_local, name_en,
abbrev, postal, scalerank::int, labelrank::int FROM zoom_levels
) AS t
WHERE geom && bbox
ORDER BY scalerank ASC, labelrank ASC, shape_area DESC;
$$ LANGUAGE SQL IMMUTABLE;

View File

@ -16,7 +16,7 @@ CREATE OR REPLACE VIEW urban_z6 AS (
CREATE OR REPLACE FUNCTION layer_urban(bbox geometry, zoom_level int)
RETURNS TABLE(geom geometry, scalerank int) AS $$
WITH zoom_levels AS (
SELECT geom, scalerank FROM (
SELECT * FROM urban_z4
WHERE zoom_level = 4
UNION ALL
@ -25,7 +25,6 @@ RETURNS TABLE(geom geometry, scalerank int) AS $$
UNION ALL
SELECT * FROM urban_z6
WHERE zoom_level >= 6 AND scalerank-1 <= zoom_level
)
SELECT geom, scalerank FROM zoom_levels
) AS zoom_levels
WHERE geom && bbox;
$$ LANGUAGE SQL IMMUTABLE;

View File

@ -104,7 +104,7 @@ CREATE OR REPLACE VIEW water_z14 AS (
CREATE OR REPLACE FUNCTION layer_water (bbox geometry, zoom_level int)
RETURNS TABLE(geom geometry) AS $$
WITH zoom_levels AS (
SELECT geom FROM (
SELECT * FROM water_z0
WHERE zoom_level = 0
UNION ALL
@ -143,7 +143,6 @@ RETURNS TABLE(geom geometry) AS $$
UNION ALL
SELECT * FROM water_z14
WHERE zoom_level >= 14
)
SELECT geom FROM zoom_levels
) AS zoom_levels
WHERE geom && bbox;
$$ LANGUAGE SQL IMMUTABLE;