diff --git a/layers/housenumber/housenumber.sql b/layers/housenumber/housenumber.sql index 54cccef5..22dc4385 100644 --- a/layers/housenumber/housenumber.sql +++ b/layers/housenumber/housenumber.sql @@ -14,7 +14,7 @@ SELECT -- etldoc: osm_housenumber_point -> layer_housenumber:z14_ osm_id, geometry, - housenumber + display_housenumber(housenumber) FROM ( SELECT osm_id, diff --git a/layers/housenumber/housenumber.yaml b/layers/housenumber/housenumber.yaml index 7fa1e6e0..99a8a7cb 100644 --- a/layers/housenumber/housenumber.yaml +++ b/layers/housenumber/housenumber.yaml @@ -7,12 +7,14 @@ layer: buffer_size: 8 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 fields: - housenumber: Value of the [`addr:housenumber`](http://wiki.openstreetmap.org/wiki/Key:addr) tag. + housenumber: Value of the [`addr:housenumber`](http://wiki.openstreetmap.org/wiki/Key:addr) tag. + If there are multiple values separated by semi-colons, the first and last value separated by a dash. datasource: geometry_field: geometry srid: 900913 query: (SELECT geometry, housenumber FROM layer_housenumber(!bbox!, z(!scale_denominator!))) AS t schema: + - ./housenumber_display.sql - ./housenumber_centroid.sql - ./housenumber.sql datasources: diff --git a/layers/housenumber/housenumber_display.sql b/layers/housenumber/housenumber_display.sql new file mode 100644 index 00000000..7b4a46b0 --- /dev/null +++ b/layers/housenumber/housenumber_display.sql @@ -0,0 +1,20 @@ +CREATE OR REPLACE FUNCTION display_housenumber_nonnumeric(raw_housenumber text) +RETURNS text AS $$ + -- Find the position of the semicolon in the input string + -- and extract the first and last value + SELECT substring(raw_housenumber from 1 for position(';' in raw_housenumber) - 1) + || '–' + || substring(raw_housenumber from position(';' in raw_housenumber) + 1); +$$ LANGUAGE SQL IMMUTABLE; + + +CREATE OR REPLACE FUNCTION display_housenumber(raw_housenumber text) +RETURNS text AS $$ + SELECT CASE + WHEN raw_housenumber !~ ';' THEN raw_housenumber + WHEN raw_housenumber ~ '[^0-9;]' THEN display_housenumber_nonnumeric(raw_housenumber) + ELSE + (SELECT min(value)::text || '–' || max(value)::text + FROM unnest(string_to_array(raw_housenumber, ';')::int[]) AS value) + END +$$ LANGUAGE SQL IMMUTABLE;