From 1e57bfabaa06c450653ca5f296613ffa66a67338 Mon Sep 17 00:00:00 2001 From: lukasmartinelli Date: Sat, 8 Oct 2016 21:21:16 +0200 Subject: [PATCH] Precompute generalisation for roads and remove CTEs --- schema/layers/road.sql | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/schema/layers/road.sql b/schema/layers/road.sql index 30eee11..359b47c 100644 --- a/schema/layers/road.sql +++ b/schema/layers/road.sql @@ -7,7 +7,7 @@ CREATE OR REPLACE FUNCTION ne_road_class(type VARCHAR) RETURNS VARCHAR AS $$ END; $$ LANGUAGE SQL IMMUTABLE; -CREATE OR REPLACE VIEW ne_10m_global_roads AS ( +CREATE TABLE IF NOT EXISTS ne_10m_global_roads AS ( SELECT geom, scalerank, ne_road_class(type) AS class FROM ne_10m_roads WHERE continent <> 'North America' @@ -19,6 +19,9 @@ CREATE OR REPLACE VIEW ne_10m_global_roads AS ( WHERE type IN ('Major Highway', 'Secondary Highway', 'Road') ); +CREATE INDEX IF NOT EXISTS ne_10m_global_roads_geom_idx ON ne_10m_global_roads USING gist(geom); +CREATE INDEX IF NOT EXISTS ne_10m_global_roads_scalerank_idx ON ne_10m_global_roads(scalerank); + CREATE OR REPLACE VIEW road_z4 AS ( SELECT geom, class FROM ne_10m_global_roads @@ -43,29 +46,33 @@ CREATE OR REPLACE VIEW road_z7 AS ( WHERE scalerank <= 7 ); -CREATE OR REPLACE VIEW road_z8 AS ( - SELECT way AS geom, class::text +CREATE TABLE IF NOT EXISTS road_z8 AS ( + SELECT ST_Simplify(way, 200) AS geom, class::text FROM roads WHERE class IN ('motorway','trunk') ); +CREATE INDEX IF NOT EXISTS road_z8_geom_idx ON road_z8 USING gist(geom); -CREATE OR REPLACE VIEW road_z9 AS ( - SELECT way AS geom, class::text +CREATE TABLE IF NOT EXISTS road_z9 AS ( + SELECT ST_Simplify(way, 120) AS geom, class::text FROM roads WHERE class IN ('motorway','trunk', 'primary') ); +CREATE INDEX IF NOT EXISTS road_z9_geom_idx ON road_z9 USING gist(geom); -CREATE OR REPLACE VIEW road_z10 AS ( - SELECT way AS geom, class::text +CREATE TABLE IF NOT EXISTS road_z10 AS ( + SELECT ST_Simplify(way, 50) AS geom, class::text FROM roads WHERE class IN ('motorway','trunk', 'primary', 'secondary') ); +CREATE INDEX IF NOT EXISTS road_z10_geom_idx ON road_z10 USING gist(geom); -CREATE OR REPLACE VIEW road_z11 AS ( - SELECT way AS geom, class::text +CREATE TABLE IF NOT EXISTS road_z11 AS ( + SELECT ST_Simplify(way, 20) AS geom, class::text FROM roads WHERE class IN ('motorway','trunk', 'primary', 'secondary', 'tertiary') ); +CREATE INDEX IF NOT EXISTS road_z11_geom_idx ON road_z11 USING gist(geom); CREATE OR REPLACE VIEW road_z12 AS ( SELECT way AS geom, class::text @@ -95,7 +102,7 @@ CREATE OR REPLACE VIEW road_z14 AS ( CREATE OR REPLACE FUNCTION layer_road(bbox geometry, zoom_level int) RETURNS TABLE(geom geometry, class text) AS $$ - WITH zoom_levels AS ( + SELECT geom, class::text FROM ( SELECT * FROM road_z4 WHERE zoom_level BETWEEN 4 AND 5 UNION ALL SELECT * FROM road_z5 WHERE zoom_level = 5 @@ -106,18 +113,17 @@ RETURNS TABLE(geom geometry, class text) AS $$ 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 + SELECT geom, class FROM road_z9 WHERE zoom_level = 9 UNION ALL - SELECT ST_Simplify(geom, 120), class FROM road_z10 WHERE zoom_level = 10 + SELECT geom, class FROM road_z10 WHERE zoom_level = 10 UNION ALL - SELECT ST_Simplify(geom, 50), class FROM road_z11 WHERE zoom_level = 11 + SELECT geom, class FROM road_z11 WHERE zoom_level = 11 UNION ALL - SELECT ST_Simplify(geom, 20), class FROM road_z12 WHERE zoom_level = 12 + SELECT geom, 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 + ) AS t WHERE geom && bbox; $$ LANGUAGE SQL IMMUTABLE;