basemap/layers/natural/prepare.sql (169 lines of code) (raw):

-- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except -- in compliance with the License. You may obtain a copy of the License at -- -- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software distributed under the License -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express -- or implied. See the License for the specific language governing permissions and limitations under -- the License. -- ('grassland', 'heath', 'scrub', 'wood', 'bay', 'beach', 'glacier', 'mud', 'shingle', 'shoal', 'strait', 'water', 'wetland', 'bare_rock', 'sand', 'scree'); CREATE MATERIALIZED VIEW osm_natural_filtered AS SELECT tags -> 'natural' AS natural_value, st_simplifypreservetopology(geom, 78270 / power(2, 12)) AS geom FROM osm_polygon WHERE geom IS NOT NULL AND st_area(geom) > 78270 / power(2, 12) * 100 AND tags ->> 'natural' IN ('grassland', 'heath', 'scrub', 'wood', 'bay', 'beach', 'glacier', 'mud', 'shingle', 'shoal', 'strait', 'water', 'wetland', 'bare_rock', 'sand', 'scree'); CREATE INDEX IF NOT EXISTS osm_natural_filtered_geom_idx ON osm_natural_filtered USING GIST (geom); CREATE INDEX IF NOT EXISTS osm_natural_filtered_tags_idx ON osm_natural_filtered (natural_value); CREATE MATERIALIZED VIEW osm_natural_clustered AS SELECT natural_value, geom, st_clusterdbscan(geom, 0, 0) OVER(PARTITION BY natural_value) AS cluster FROM osm_natural_filtered WHERE geom IS NOT NULL; CREATE INDEX IF NOT EXISTS osm_natural_clustered_geom_idx ON osm_natural_clustered USING GIST (geom); CREATE INDEX IF NOT EXISTS osm_natural_clustered_tags_idx ON osm_natural_clustered (natural_value); CREATE MATERIALIZED VIEW osm_natural_grouped AS SELECT natural_value, st_collect(geom) AS geom FROM osm_natural_clustered GROUP BY natural_value, cluster; CREATE MATERIALIZED VIEW osm_natural_buffered AS SELECT natural_value, st_buffer(geom, 0, 'join=mitre') AS geom FROM osm_natural_grouped; CREATE MATERIALIZED VIEW osm_natural_exploded AS SELECT natural_value, (st_dump(geom)).geom AS geom FROM osm_natural_buffered; CREATE MATERIALIZED VIEW osm_natural AS SELECT row_number() OVER () AS id, jsonb_build_object('natural', natural_value) AS tags, geom FROM osm_natural_exploded; CREATE INDEX IF NOT EXISTS osm_natural_geom_idx ON osm_natural_filtered USING GIST (geom); CREATE INDEX IF NOT EXISTS osm_natural_tags_idx ON osm_natural_filtered USING GIN (natural_value); -- XTRA LARGE CREATE MATERIALIZED VIEW osm_natural_xl_filtered AS SELECT id, tags -> 'natural' as natural_value, st_buffer(st_simplifypreservetopology(geom, 78270 / power(2, 8)), 78270 / power(2, 8), 'join=mitre') AS geom FROM osm_natural WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 8), 2); CREATE INDEX IF NOT EXISTS osm_natural_xl_filtered_geom_idx ON osm_natural_xl_filtered USING GIST (geom); CREATE INDEX IF NOT EXISTS osm_natural_xl_filtered_tags_idx ON osm_natural_xl_filtered (natural_value); CREATE MATERIALIZED VIEW osm_natural_xl_clustered AS SELECT natural_value, geom, st_clusterdbscan(geom, 0, 0) OVER(PARTITION BY natural_value) AS cluster FROM osm_natural_xl_filtered; CREATE INDEX IF NOT EXISTS osm_natural_xl_clustered_geom_idx ON osm_natural_xl_clustered USING GIST (geom); CREATE INDEX IF NOT EXISTS osm_natural_xl_clustered_tags_idx ON osm_natural_xl_clustered (natural_value); CREATE MATERIALIZED VIEW osm_natural_xl_grouped AS SELECT natural_value, cluster, st_collect(geom) AS geom FROM osm_natural_xl_clustered GROUP BY natural_value, cluster; CREATE MATERIALIZED VIEW osm_natural_xl_buffered AS SELECT natural_value, st_buffer(geom, -78270 / power(2, 8), 'join=mitre') AS geom FROM osm_natural_xl_grouped; CREATE MATERIALIZED VIEW osm_natural_xl_exploded AS SELECT natural_value, (st_dump(geom)).geom AS geom FROM osm_natural_xl_buffered; CREATE MATERIALIZED VIEW osm_natural_xl AS SELECT row_number() OVER () AS id, jsonb_build_object('natural', natural_value) AS tags, geom AS geom FROM osm_natural_xl_buffered; CREATE INDEX IF NOT EXISTS osm_natural_xl_geom_idx ON osm_natural_xl USING GIST (geom); CREATE INDEX IF NOT EXISTS osm_natural_xl_tags_idx ON osm_natural_xl USING GIN (tags); -- MEDIUM CREATE MATERIALIZED VIEW osm_natural_m_filtered AS SELECT id, tags -> 'natural' as natural_value, st_buffer(st_simplifypreservetopology(geom, 78270 / power(2, 5)), 78270 / power(2, 6), 'join=mitre') AS geom FROM osm_natural WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 6), 2); CREATE INDEX IF NOT EXISTS osm_natural_m_filtered_geom_idx ON osm_natural_m_filtered USING GIST (geom); CREATE INDEX IF NOT EXISTS osm_natural_m_filtered_tags_idx ON osm_natural_m_filtered (natural_value); CREATE MATERIALIZED VIEW osm_natural_m_clustered AS SELECT natural_value, geom, st_clusterdbscan(geom, 0, 0) OVER(PARTITION BY natural_value) AS cluster FROM osm_natural_m_filtered; CREATE INDEX IF NOT EXISTS osm_natural_m_clustered_geom_idx ON osm_natural_m_clustered USING GIST (geom); CREATE INDEX IF NOT EXISTS osm_natural_m_clustered_tags_idx ON osm_natural_m_clustered (natural_value); CREATE MATERIALIZED VIEW osm_natural_m_grouped AS SELECT natural_value, cluster, st_collect(geom) AS geom FROM osm_natural_m_clustered GROUP BY natural_value, cluster; CREATE MATERIALIZED VIEW osm_natural_m_buffered AS SELECT natural_value, st_buffer(geom, 0.5 * -78270 / power(2, 6), 'join=mitre') AS geom FROM osm_natural_m_grouped; CREATE MATERIALIZED VIEW osm_natural_m_exploded AS SELECT natural_value, (st_dump(geom)).geom AS geom FROM osm_natural_m_buffered; CREATE MATERIALIZED VIEW osm_natural_m AS SELECT row_number() OVER () AS id, jsonb_build_object('natural', natural_value) AS tags, geom AS geom FROM osm_natural_m_buffered; CREATE INDEX IF NOT EXISTS osm_natural_m_geom_idx ON osm_natural_m USING GIST (geom); CREATE INDEX IF NOT EXISTS osm_natural_m_tags_idx ON osm_natural_m USING GIN (tags); -- SMALL CREATE MATERIALIZED VIEW osm_natural_s_filtered AS SELECT id, tags -> 'natural' as natural_value, st_buffer(st_simplifypreservetopology(geom, 78270 / power(2, 5)), 78270 / power(2, 6), 'join=mitre') AS geom FROM osm_natural WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 6), 2); CREATE INDEX IF NOT EXISTS osm_natural_s_filtered_geom_idx ON osm_natural_s_filtered USING GIST (geom); CREATE INDEX IF NOT EXISTS osm_natural_s_filtered_tags_idx ON osm_natural_s_filtered (natural_value); CREATE MATERIALIZED VIEW osm_natural_s_clustered AS SELECT natural_value, geom, st_clusterdbscan(geom, 0, 0) OVER(PARTITION BY natural_value) AS cluster FROM osm_natural_s_filtered; CREATE INDEX IF NOT EXISTS osm_natural_s_clustered_geom_idx ON osm_natural_s_clustered USING GIST (geom); CREATE INDEX IF NOT EXISTS osm_natural_s_clustered_tags_idx ON osm_natural_s_clustered (natural_value); CREATE MATERIALIZED VIEW osm_natural_s_grouped AS SELECT natural_value, cluster, st_collect(geom) AS geom FROM osm_natural_s_clustered GROUP BY natural_value, cluster; CREATE MATERIALIZED VIEW osm_natural_s_buffered AS SELECT natural_value, st_buffer(geom, 0.1 * -78270 / power(2, 6), 'join=mitre') AS geom FROM osm_natural_s_grouped; CREATE MATERIALIZED VIEW osm_natural_s_exploded AS SELECT natural_value, (st_dump(geom)).geom AS geom FROM osm_natural_s_buffered; CREATE MATERIALIZED VIEW osm_natural_s AS SELECT row_number() OVER () AS id, jsonb_build_object('natural', natural_value) AS tags, geom AS geom FROM osm_natural_s_buffered; CREATE INDEX IF NOT EXISTS osm_natural_s_geom_idx ON osm_natural_s USING GIST (geom); CREATE INDEX IF NOT EXISTS osm_natural_s_tags_idx ON osm_natural_s USING GIN (tags);