Introduce landcover classes

pull/24/head
lukasmartinelli 2016-10-24 14:27:51 +02:00
rodzic 15a61983ae
commit f65fded9f4
3 zmienionych plików z 54 dodań i 44 usunięć

Wyświetl plik

@ -1,41 +1,48 @@
CREATE OR REPLACE FUNCTION landcover_class(landuse VARCHAR, "natural" VARCHAR, wetland VARCHAR) RETURNS TEXT AS $$
SELECT CASE
WHEN landuse IN ('farmland', 'farm', 'orchard', 'vineyard', 'plant_nursery') THEN 'farmland'
WHEN "natural" IN ('glacier', 'ice_shelf') THEN 'ice'
WHEN "natural"='wood' OR landuse IN ('forest', 'wood') THEN 'wood'
WHEN "natural"='grassland' OR landuse IN ('grass', 'meadow', 'village_green', 'allotments', 'park', 'recreation_ground', 'grassland') THEN 'grass'
WHEN "natural"='wetland' OR wetland IN ('bog', 'swamp', 'wet_meadow', 'marsh', 'reedbed', 'saltern', 'tidalflat', 'saltmarsh', 'mangrove') THEN 'wetland'
ELSE NULL
END;
$$ LANGUAGE SQL IMMUTABLE;
CREATE OR REPLACE VIEW landcover_z0 AS (
SELECT NULL::int AS osm_id, geom AS geometry, 'glacier' AS landuse, NULL AS "natural", NULL AS wetland FROM ne_110m_glaciated_areas
SELECT NULL::int AS osm_id, geom AS geometry, NULL AS landuse, 'glacier' AS "natural", NULL::text AS wetland FROM ne_110m_glaciated_areas
);
CREATE OR REPLACE VIEW landcover_z2 AS (
SELECT NULL::int AS osm_id, geom AS geometry, 'glacier' AS landuse, NULL AS "natural", NULL AS wetland FROM ne_50m_glaciated_areas
SELECT NULL::bigint AS osm_id, geom AS geometry, NULL::text AS landuse, 'glacier' AS "natural", NULL::text AS wetland FROM ne_50m_glaciated_areas
UNION ALL
SELECT NULL::int AS osm_id, geom AS geometry, 'ice_shelf' AS landuse, NULL AS "natural", NULL AS wetland FROM ne_50m_antarctic_ice_shelves_polys
SELECT NULL::bigint AS osm_id, geom AS geometry, NULL::text AS landuse, 'ice_shelf' AS "natural", NULL::text AS wetland FROM ne_50m_antarctic_ice_shelves_polys
);
CREATE OR REPLACE VIEW landcover_z5 AS (
SELECT NULL::int AS osm_id, geom AS geometry, 'glacier' AS landuse, NULL AS "natural", NULL AS wetland FROM ne_10m_glaciated_areas
SELECT NULL::bigint AS osm_id, geom AS geometry, NULL::text AS landuse, 'glacier' AS "natural", NULL::text AS wetland FROM ne_10m_glaciated_areas
UNION ALL
SELECT NULL::int AS osm_id, geom AS geometry, 'ice_shelf' AS landuse, NULL AS "natural", NULL AS wetland FROM ne_10m_antarctic_ice_shelves_polys
SELECT NULL::bigint AS osm_id, geom AS geometry, NULL::text AS landuse, 'ice_shelf' AS "natural", NULL::text AS wetland FROM ne_10m_antarctic_ice_shelves_polys
);
CREATE OR REPLACE VIEW landcover_z8 AS (
SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon
WHERE ST_Area(geometry) > 15000000
SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon_gen5
);
CREATE OR REPLACE VIEW landcover_z9 AS (
SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon
WHERE ST_Area(geometry) > 4200000
SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon_gen4
);
CREATE OR REPLACE VIEW landcover_z10 AS (
SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon
WHERE ST_Area(geometry) > 1200000
SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon_gen3
);
CREATE OR REPLACE VIEW landcover_z11 AS (
SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon WHERE ST_Area(geometry) > 480000
SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon_gen2
);
CREATE OR REPLACE VIEW landcover_z12 AS (
SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon WHERE ST_Area(geometry) > 240000
SELECT osm_id, geometry, landuse, "natural", wetland FROM osm_landcover_polygon_gen1
);
CREATE OR REPLACE VIEW landcover_z13 AS (
@ -47,8 +54,11 @@ CREATE OR REPLACE VIEW landcover_z14 AS (
);
CREATE OR REPLACE FUNCTION layer_landcover(bbox geometry, zoom_level int)
RETURNS TABLE(osm_id bigint, geom geometry, landuse text, "natural" text, wetland text) AS $$
SELECT osm_id, geometry, landuse, "natural", wetland FROM (
RETURNS TABLE(osm_id bigint, geometry geometry, class text, subclass text) AS $$
SELECT osm_id, geometry,
landcover_class(landuse, "natural", wetland) AS class,
COALESCE(NULLIF("natural", ''), NULLIF(landuse, ''), NULLIF('wetland', '')) AS subclass
FROM (
SELECT * FROM landcover_z0
WHERE zoom_level BETWEEN 0 AND 1 AND geometry && bbox
UNION ALL
@ -58,19 +68,19 @@ RETURNS TABLE(osm_id bigint, geom geometry, landuse text, "natural" text, wetlan
SELECT * FROM landcover_z5
WHERE zoom_level BETWEEN 5 AND 7 AND geometry && bbox
UNION ALL
SELECT osm_id, ST_Simplify(geometry, 300) AS geometry, landuse, "natural", wetland
SELECT osm_id, geometry, landuse, "natural", wetland
FROM landcover_z8 WHERE zoom_level = 8 AND geometry && bbox
UNION ALL
SELECT osm_id, ST_Simplify(geometry, 200) AS geometry, landuse, "natural", wetland
SELECT osm_id, geometry, landuse, "natural", wetland
FROM landcover_z9 WHERE zoom_level = 9 AND geometry && bbox
UNION ALL
SELECT osm_id, ST_Simplify(geometry, 120) AS geometry, landuse, "natural", wetland
SELECT osm_id, geometry, landuse, "natural", wetland
FROM landcover_z10 WHERE zoom_level = 10 AND geometry && bbox
UNION ALL
SELECT osm_id, ST_Simplify(geometry, 80) AS geometry, landuse, "natural", wetland
SELECT osm_id, geometry, landuse, "natural", wetland
FROM landcover_z11 WHERE zoom_level = 11 AND geometry && bbox
UNION ALL
SELECT osm_id, ST_Simplify(geometry, 50) AS geometry, landuse, "natural", wetland
SELECT osm_id, geometry, landuse, "natural", wetland
FROM landcover_z12 WHERE zoom_level = 12 AND geometry && bbox
UNION ALL
SELECT osm_id, ST_Simplify(geometry, 10) AS geometry, landuse, "natural", wetland
@ -80,4 +90,3 @@ RETURNS TABLE(osm_id bigint, geom geometry, landuse text, "natural" text, wetlan
FROM landcover_z14 WHERE zoom_level >= 14 AND geometry && bbox
) AS zoom_levels;
$$ LANGUAGE SQL IMMUTABLE;

Wyświetl plik

@ -3,6 +3,7 @@ layer:
description: Landcover is used to describe the physical material at the surface of the earth. Land covers include grass, asphalt, trees, bare ground etc. Tagging of landcover is often only implied by other tags at present, for example a park may be assumed to be covered in grass, but in some places this may in fact be trees or sand or some other cover. The following keys imply or specifically indicate landcover properties.
buffer_size: 4
datasource:
geometry_field: geometry
query: (SELECT * FROM layer_landcover(!bbox!, z(!scale_denominator!))) AS t
schema:
- ./landcover.sql

Wyświetl plik

@ -1,11 +1,23 @@
generalized_tables:
landcover_polygon_gen0:
source: landcover_polygon_gen1
sql_filter: area>500000.000000
landcover_polygon_gen5:
source: landcover_polygon_gen4
sql_filter: area>15000000
tolerance: 300.0
landcover_polygon_gen4:
source: landcover_polygon_gen3
sql_filter: area>4200000
tolerance: 200.0
landcover_polygon_gen3:
source: landcover_polygon_gen2
sql_filter: area>1200000
tolerance: 120.0
landcover_polygon_gen2:
source: landcover_polygon_gen1
sql_filter: area>480000
tolerance: 80.0
landcover_polygon_gen1:
source: landcover_polygon
sql_filter: area>50000.000000
sql_filter: area>240000
tolerance: 50.0
tables:
landcover_polygon:
@ -31,7 +43,6 @@ tables:
- farm
- farmland
- orchard
- greenhouse_horticulture
- plant_nursery
- vineyard
- grass
@ -41,28 +52,17 @@ tables:
- village_green
- recreation_ground
- forest
- beach
- greenfield
natural:
- wetland
- gravel
- sand
- wood
- scrub
- mud
- beach
- rock
- bare_rock
- scree
- grassland
- heath
- fell
wetland:
- saltmarsh
- reedbed
- bog
- marsh
- mangrove
- swamp
- wet_meadow
- marsh
- reedbed
- saltern
- tidalflat
- saltmarsh
- mangrove
type: polygon