From 0d38b8b3db84e16e21090d07801ad03791b79841 Mon Sep 17 00:00:00 2001 From: lukasmartinelli Date: Sat, 8 Oct 2016 17:28:40 +0200 Subject: [PATCH] Add countries based on Natural Earth tiles --- data.yml | 25 +++++++++++++++++++++ schema/layers/country.sql | 46 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 schema/layers/country.sql diff --git a/data.yml b/data.yml index 49700ef7..968620b3 100644 --- a/data.yml +++ b/data.yml @@ -170,6 +170,31 @@ Layer: properties: "buffer-size": 64 srs: +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over + - id: country + Datasource: + dbname: osm + extent: -20037508.34,-20037508.34,20037508.34,20037508.34 + geometry_field: geom + geometry_table: '' + host: db + key_field: '' + key_field_as_attribute: '' + max_size: 512 + password: osm + port: 5432 + srid: 900913 + table: (SELECT * FROM layer_country(!bbox!, z(!scale_denominator!))) AS t + type: postgis + user: osm + description: Buildings + fields: + abbrev: String + labelrank: Number + name: String + scalerank: Number + properties: + "buffer-size": 64 + srs: +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over maxzoom: 14 minzoom: 0 name: OSM2VectorTiles v3.0 diff --git a/schema/layers/country.sql b/schema/layers/country.sql new file mode 100644 index 00000000..04bf46ba --- /dev/null +++ b/schema/layers/country.sql @@ -0,0 +1,46 @@ +CREATE TABLE IF NOT EXISTS country_label AS ( + SELECT topoint(geom) AS geom, + 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_geom_idx ON country_label USING gist(geom); + +CREATE OR REPLACE VIEW country_z1 AS ( + SELECT * FROM country_label WHERE scalerank = 0 AND is_tiny = 0 AND labelrank <= 2 +); + +CREATE OR REPLACE VIEW country_z2 AS ( + SELECT * FROM country_label WHERE scalerank = 0 AND is_tiny = 0 AND labelrank <= 3 +); + +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(geom geometry, name text, abbrev text, postal text, scalerank int, labelrank int) AS $$ + WITH zoom_levels AS ( + 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 + ) + SELECT geom, name, abbrev, postal, scalerank::int, labelrank::int FROM zoom_levels + WHERE geom && bbox + ORDER BY scalerank, labelrank, length(name); +$$ LANGUAGE SQL IMMUTABLE;