From 767c8a83ccca1692a5099541f1e7b7b6f019bea8 Mon Sep 17 00:00:00 2001 From: lukasmartinelli Date: Mon, 24 Oct 2016 10:30:36 +0200 Subject: [PATCH] Merge natural earth scaleranks --- layers/place/place.sql | 75 +++++++++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/layers/place/place.sql b/layers/place/place.sql index 41c5039..0d7c200 100644 --- a/layers/place/place.sql +++ b/layers/place/place.sql @@ -1,62 +1,85 @@ +CREATE TABLE IF NOT EXISTS osm_important_place_point AS ( + SELECT osm.geometry, osm.osm_id, osm.name, osm.name_en, osm.place, ne.scalerank, COALESCE(osm.population, ne.pop_min) AS population + FROM ne_10m_populated_places AS ne, osm_place_point AS osm + WHERE + ( + ne.name ILIKE osm.name OR + ne.name ILIKE osm.name_en OR + ne.namealt ILIKE osm.name OR + ne.namealt ILIKE osm.name_en OR + ne.meganame ILIKE osm.name OR + ne.meganame ILIKE osm.name_en OR + ne.gn_ascii ILIKE osm.name OR + ne.gn_ascii ILIKE osm.name_en OR + ne.nameascii ILIKE osm.name OR + ne.nameascii ILIKE osm.name_en + ) + AND (osm.place = 'city' OR osm.place= 'town' OR osm.place = 'village') + AND ST_DWithin(ne.geom, osm.geometry, 50000) +); + +CREATE INDEX IF NOT EXISTS osm_important_place_point_geometry_idx ON osm_important_place_point USING gist(geometry); +CLUSTER osm_important_place_point USING osm_important_place_point_geometry_idx; + CREATE OR REPLACE VIEW place_z2 AS ( - SELECT geom, name, 'city' AS place, scalerank, pop_min AS population - FROM ne_10m_populated_places - WHERE scalerank <= 0 + SELECT geometry, name, place, scalerank, population + FROM osm_important_place_point + WHERE scalerank <= 0 ); CREATE OR REPLACE VIEW place_z3 AS ( - SELECT geom, name, 'city' AS place, scalerank, pop_min AS population - FROM ne_10m_populated_places - WHERE scalerank <= 2 + SELECT geometry, name, place, scalerank, population + FROM osm_important_place_point + WHERE scalerank <= 2 ); CREATE OR REPLACE VIEW place_z4 AS ( - SELECT geom, name, 'city' AS place, scalerank, pop_min AS population - FROM ne_10m_populated_places - WHERE scalerank <= 5 + SELECT geometry, name, place, scalerank, population + FROM osm_important_place_point + WHERE scalerank <= 5 ); CREATE OR REPLACE VIEW place_z5 AS ( - SELECT geom, name, 'city' AS place, scalerank, pop_min AS population - FROM ne_10m_populated_places - WHERE scalerank <= 6 + SELECT geometry, name, place, scalerank, population + FROM osm_important_place_point + WHERE scalerank <= 6 ); CREATE OR REPLACE VIEW place_z6 AS ( - SELECT geom, name, 'city' AS place, scalerank, pop_min AS population - FROM ne_10m_populated_places - WHERE scalerank <= 7 + SELECT geometry, name, place, scalerank, population + FROM osm_important_place_point + WHERE scalerank <= 7 ); CREATE OR REPLACE VIEW place_z7 AS ( - SELECT geom, name, 'city' AS place, scalerank, pop_min AS population - FROM ne_10m_populated_places + SELECT geometry, name, place, scalerank, population + FROM osm_important_place_point ); CREATE OR REPLACE VIEW place_z8 AS ( - SELECT geometry AS geom, name, place, NULL::integer AS scalerank, population FROM osm_place_point + SELECT geometry, name, place, NULL::integer AS scalerank, population FROM osm_place_point WHERE place IN ('city', 'town') ); CREATE OR REPLACE VIEW place_z10 AS ( - SELECT geometry AS geom, name, place, NULL::integer AS scalerank, population FROM osm_place_point + SELECT geometry, name, place, NULL::integer AS scalerank, population FROM osm_place_point WHERE place IN ('city', 'town', 'village') OR place='subregion' ); CREATE OR REPLACE VIEW place_z11 AS ( - SELECT geometry AS geom, name, place, NULL::integer AS scalerank, population FROM osm_place_point + SELECT geometry, name, place, NULL::integer AS scalerank, population FROM osm_place_point ); CREATE OR REPLACE VIEW place_z13 AS ( - SELECT geometry AS geom, name, place, NULL::integer AS scalerank, population FROM osm_place_point + SELECT geometry, name, place, NULL::integer AS scalerank, population FROM osm_place_point ); CREATE OR REPLACE FUNCTION layer_place(bbox geometry, zoom_level int, pixel_width numeric) -RETURNS TABLE(geom geometry, name text, place text, scalerank int) AS $$ - SELECT geom, name, place, scalerank FROM ( - SELECT geom, name, place, scalerank, +RETURNS TABLE(geometry geometry, name text, place text, scalerank int) AS $$ + SELECT geometry, name, place, scalerank FROM ( + SELECT geometry, name, place, scalerank, row_number() OVER ( - PARTITION BY LabelGrid(geom, 150 * pixel_width) + PARTITION BY LabelGrid(geometry, 150 * pixel_width) ORDER BY scalerank ASC NULLS LAST, population DESC NULLS LAST, length(name) DESC @@ -92,7 +115,7 @@ RETURNS TABLE(geom geometry, name text, place text, scalerank int) AS $$ SELECT * FROM place_z13 WHERE zoom_level >= 13 ) AS zoom_levels - WHERE geom && bbox + WHERE geometry && bbox ) AS ranked_places WHERE zoom_level <= 7 OR