From d9d3b96dc74dd1dc11e0ca71fd8984f4d26055be Mon Sep 17 00:00:00 2001 From: lukasmartinelli Date: Sat, 29 Oct 2016 10:56:58 +0200 Subject: [PATCH] Refactor layer code to use OSM --- layers/place/city.sql | 12 +++---- layers/place/country.sql | 55 +++----------------------------- layers/place/merge_city_rank.sql | 4 +-- layers/place/place.sql | 8 ++--- layers/place/state.sql | 42 +++++------------------- 5 files changed, 24 insertions(+), 97 deletions(-) diff --git a/layers/place/city.sql b/layers/place/city.sql index be7df656..902b64b4 100644 --- a/layers/place/city.sql +++ b/layers/place/city.sql @@ -1,14 +1,14 @@ CREATE OR REPLACE FUNCTION layer_city(bbox geometry, zoom_level int, pixel_width numeric) -RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, class city_class, scalerank int) AS $$ - SELECT osm_id, geometry, name, name_en, place, scalerank +RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, class city_class, "rank" int) AS $$ + SELECT osm_id, geometry, name, name_en, place, "rank" FROM osm_city_point WHERE geometry && bbox - AND ((zoom_level = 2 AND scalerank = 0) - OR (zoom_level BETWEEN 3 AND 7 AND scalerank < zoom_level) + AND ((zoom_level = 2 AND "rank" = 0) + OR (zoom_level BETWEEN 3 AND 7 AND "rank" < zoom_level) ) UNION ALL - SELECT osm_id, geometry, name, name_en, place, scalerank FROM ( - SELECT osm_id, geometry, name, name_en, place, scalerank, + SELECT osm_id, geometry, name, name_en, place, "rank" FROM ( + SELECT osm_id, geometry, name, name_en, place, "rank", row_number() OVER ( PARTITION BY LabelGrid(geometry, 150 * pixel_width) ORDER BY place ASC NULLS LAST, diff --git a/layers/place/country.sql b/layers/place/country.sql index 55366668..805b90da 100644 --- a/layers/place/country.sql +++ b/layers/place/country.sql @@ -1,53 +1,6 @@ -CREATE TABLE IF NOT EXISTS country_label AS ( - SELECT topoint(geom) AS geometry, - NULL::bigint AS osm_id, - name, - adm0_a3, abbrev, postal, - scalerank, labelrank, - CASE WHEN tiny < 0 THEN 0 ELSE 1 END AS is_tiny - FROM ne_10m_admin_0_countries - WHERE scalerank <= 1 -); -CREATE INDEX IF NOT EXISTS country_label_geometry_idx ON country_label USING gist(geometry); - -CREATE OR REPLACE VIEW country_z0 AS ( - SELECT * FROM country_label WHERE scalerank = 0 AND is_tiny = 0 AND labelrank <= 2 -); - -CREATE OR REPLACE VIEW country_z1 AS ( - SELECT * FROM country_label WHERE scalerank = 0 AND is_tiny = 0 AND labelrank <= 3 -); - -CREATE OR REPLACE VIEW country_z2 AS ( - SELECT * FROM country_label WHERE scalerank = 0 AND is_tiny = 0 AND labelrank <= 4 -); - -CREATE OR REPLACE VIEW country_z3 AS ( - SELECT * FROM country_label WHERE scalerank = 0 AND is_tiny = 0 -); - -CREATE OR REPLACE VIEW country_z5 AS ( - SELECT * FROM country_label WHERE scalerank <= 1 -); - CREATE OR REPLACE FUNCTION layer_country(bbox geometry, zoom_level int) -RETURNS TABLE(osm_id bigint, geometry geometry, name text, abbrev text, postal text, scalerank int, labelrank int) AS $$ - SELECT osm_id, geometry, name, abbrev, postal, scalerank::int, labelrank::int FROM ( - SELECT * FROM country_z0 - WHERE zoom_level = 0 - UNION ALL - SELECT * FROM country_z1 - WHERE zoom_level = 1 - UNION ALL - SELECT * FROM country_z2 - WHERE zoom_level BETWEEN 2 AND 4 - UNION ALL - SELECT * FROM country_z3 - WHERE zoom_level BETWEEN 3 AND 4 - UNION ALL - SELECT * FROM country_z5 - WHERE zoom_level >= 5 - ) AS t - WHERE geometry && bbox - ORDER BY scalerank ASC, labelrank ASC, length(name) ASC; +RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, "rank" int) AS $$ + SELECT osm_id, geometry, name, name_en, "rank" FROM osm_country_point + WHERE geometry && bbox AND "rank" <= (zoom_level + 2) + ORDER BY "rank" ASC, length(name) ASC; $$ LANGUAGE SQL IMMUTABLE; diff --git a/layers/place/merge_city_rank.sql b/layers/place/merge_city_rank.sql index fc8ec81d..db3d7ee6 100644 --- a/layers/place/merge_city_rank.sql +++ b/layers/place/merge_city_rank.sql @@ -18,8 +18,8 @@ WITH important_city_point AS ( AND ST_DWithin(ne.geom, osm.geometry, 50000) ) UPDATE osm_city_point AS osm -SET scalerank = ne.scalerank +SET "rank" = ne.scalerank FROM important_city_point AS ne WHERE osm.osm_id = ne.osm_id; -CREATE INDEX IF NOT EXISTS osm_city_point_scalerank_idx ON osm_city_point(scalerank); +CREATE INDEX IF NOT EXISTS osm_city_point_rank_idx ON osm_city_point("rank"); diff --git a/layers/place/place.sql b/layers/place/place.sql index 855d6641..591795d6 100644 --- a/layers/place/place.sql +++ b/layers/place/place.sql @@ -1,8 +1,8 @@ CREATE OR REPLACE FUNCTION layer_place(bbox geometry, zoom_level int, pixel_width numeric) -RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, class text, abbrev text, scalerank int) AS $$ - SELECT osm_id, geometry, name, name AS name_en, 'country' AS class, abbrev, scalerank FROM layer_country(bbox, zoom_level) +RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, class text, "rank" int) AS $$ + SELECT osm_id, geometry, name, name AS name_en, 'country' AS class, "rank" FROM layer_country(bbox, zoom_level) UNION ALL - SELECT osm_id, geometry, name, name_en, 'state' AS class, abbrev, scalerank FROM layer_state(bbox, zoom_level) + SELECT osm_id, geometry, name, name_en, 'state' AS class, "rank" FROM layer_state(bbox, zoom_level) UNION ALL - SELECT osm_id, geometry, name, name_en, class::text, NULL AS abbrev, scalerank FROM layer_city(bbox, zoom_level, pixel_width) + SELECT osm_id, geometry, name, name_en, class::text, "rank" FROM layer_city(bbox, zoom_level, pixel_width) $$ LANGUAGE SQL IMMUTABLE; diff --git a/layers/place/state.sql b/layers/place/state.sql index 600569a9..96c90d8f 100644 --- a/layers/place/state.sql +++ b/layers/place/state.sql @@ -1,36 +1,10 @@ -CREATE OR REPLACE FUNCTION fix_win1252_shp_encoding(str TEXT) RETURNS TEXT -AS $$ -BEGIN - RETURN convert_from(convert_to(str, 'WIN1252'), 'UTF-8'); - EXCEPTION WHEN others THEN RETURN str; -END; -$$ LANGUAGE plpgsql IMMUTABLE; - -CREATE TABLE IF NOT EXISTS state_label AS ( - SELECT topoint(geom) AS geometry, - NULL::bigint AS osm_id, - name_local, fix_win1252_shp_encoding(name) AS name_en, - abbrev, postal, - scalerank, labelrank, - shape_area, datarank, type - FROM ne_10m_admin_1_states_provinces_shp - WHERE type IN ('State', 'Avtonomnyy Okrug', 'Sheng', 'Estado') - AND scalerank <= 3 AND labelrank <= 2 -); -CREATE INDEX IF NOT EXISTS state_label_geometry_idx ON state_label USING gist(geometry); - CREATE OR REPLACE FUNCTION layer_state(bbox geometry, zoom_level int) -RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, abbrev text, postal text, scalerank int, labelrank int) AS $$ - SELECT osm_id, geometry, - COALESCE(name_local, name_en) AS name, name_en, - abbrev, postal, scalerank::int, labelrank::int FROM ( - SELECT * FROM state_label - WHERE (zoom_level = 3) - AND ((scalerank <= 2 AND labelrank <= 1) OR type = 'Avtonomnyy Okrug') - UNION ALL - SELECT * FROM state_label - WHERE zoom_level >= 4 - ) AS t - WHERE geometry && bbox - ORDER BY scalerank ASC, labelrank ASC, shape_area DESC; +RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, "rank" int) AS $$ + SELECT osm_id, geometry, name, name_en, "rank" + FROM osm_state_point + WHERE geometry && bbox AND ( + (zoom_level = 3 AND "rank" <= 1) OR + (zoom_level >= 4) + ) + ORDER BY "rank" ASC; $$ LANGUAGE SQL IMMUTABLE;