11-- ============================================================================
2- -- Function: create_water_areas_subdivided_mview
3- -- Description:
4- -- Creates a materialized view for water areas using ST_Subdivide to simplify
5- -- complex geometries. The input geometries are validated with ST_MakeValid and
6- -- dumped using ST_Dump to extract components.
7- --
8- -- Multilingual name columns are added dynamically from the `languages` table.
9- --
10- -- Parameters:
11- -- input_table TEXT - The source table containing raw geometries.
12- -- mview_name TEXT - The name of the materialized view to be created.
13- --
14- -- Behavior:
15- -- - Uses a temporary view during creation to avoid downtime.
16- -- - Only valid POLYGON and MULTIPOLYGON geometries are retained.
17- -- - Adds GiST spatial index on geometry and unique index on (id).
2+ -- Water Areas Materialized Views for Multiple Zoom Levels
3+ -- Creates a pyramid of materialized views for water areas, optimized for
184-- ============================================================================
19- DROP FUNCTION IF EXISTS create_water_areas_subdivided_mview;
20-
21- CREATE OR REPLACE FUNCTION create_water_areas_subdivided_mview (
22- input_table TEXT ,
23- mview_name TEXT
24- )
25- RETURNS void AS $$
26- DECLARE
27- lang_columns TEXT := get_language_columns();
28- tmp_view_name TEXT := mview_name || ' _tmp' ;
29- sql_create TEXT ;
30- unique_columns TEXT := ' id' ;
31- BEGIN
32- sql_create := format($sql$
33- CREATE MATERIALIZED VIEW %I AS
34- SELECT
35- row_number() OVER () AS id,
36- geometry,
37- osm_id,
38- NULLIF(name, ' ' ) AS name,
39- NULLIF(type, ' ' ) AS type,
40- NULLIF(start_date, ' ' ) AS start_date,
41- NULLIF(end_date, ' ' ) AS end_date,
42- isodatetodecimaldate(pad_date(start_date, ' start' ), FALSE) AS start_decdate,
43- isodatetodecimaldate(pad_date(end_date, ' end' ), FALSE) AS end_decdate,
44- area,
45- %s
46- FROM (
47- SELECT
48- ST_Subdivide((g).geom, 512 ) AS geometry,
49- osm_id,
50- name,
51- type,
52- start_date,
53- end_date,
54- area,
55- tags,
56- %s
57- FROM (
58- SELECT
59- osm_id,
60- name,
61- type,
62- start_date,
63- end_date,
64- area,
65- ST_Dump(ST_MakeValid(geometry)) AS g,
66- tags,
67- %s
68- FROM %I
69- WHERE geometry IS NOT NULL
70- ) AS fixed_geoms
71- WHERE GeometryType((g).geom) IN (' POLYGON' , ' MULTIPOLYGON' )
72- ) AS final_data;
73- $sql$, tmp_view_name, lang_columns, lang_columns, lang_columns, input_table);
74-
75- PERFORM finalize_materialized_view(
76- tmp_view_name,
77- mview_name,
78- unique_columns,
79- sql_create
80- );
81- END;
82- $$ LANGUAGE plpgsql;
835
84- -- ============================================================================
85- -- Function: create_water_areas_centroids_mview
86- -- Description:
87- -- This function creates a materialized view with centroids for named water areas.
88- -- It uses ST_MaximumInscribedCircle to compute a representative centroid from
89- -- each polygonal feature. The function can be called per zoom level using different source tables.
90- --
91- -- Parameters:
92- -- source_table TEXT - Source table containing water area polygons.
93- -- view_name TEXT - Name of the resulting materialized view.
94- --
95- -- Notes:
96- -- - Only features with non-empty names are included.
97- -- - Geometry is computed as the center of the maximum inscribed circle.
98- -- - A GiST index is created on geometry, and uniqueness is enforced on osm_id.
99- -- - Uses a temporary view to avoid downtime during refresh.
100- -- ============================================================================
6+ -- Delete existing views, in cascade
7+ DROP MATERIALIZED VIEW IF EXISTS mv_water_areas_z16_20 CASCADE;
1018
102- DROP FUNCTION IF EXISTS create_water_areas_centroids_mview;
103-
104- CREATE OR REPLACE FUNCTION create_water_areas_centroids_mview (
105- source_table TEXT ,
106- view_name TEXT
107- )
108- RETURNS void AS $$
109- DECLARE
110- lang_columns TEXT := get_language_columns();
111- tmp_view_name TEXT := view_name || ' _tmp' ;
112- sql_create TEXT ;
113- unique_columns TEXT := ' osm_id, type' ;
114- BEGIN
115- sql_create := format($sql$
116- CREATE MATERIALIZED VIEW %I AS
117- SELECT
118- osm_id,
119- NULLIF(name, ' ' ) AS name,
120- NULLIF(type, ' ' ) AS type,
121- NULLIF(start_date, ' ' ) AS start_date,
122- NULLIF(end_date, ' ' ) AS end_date,
123- isodatetodecimaldate(pad_date(start_date, ' start' ), FALSE) AS start_decdate,
124- isodatetodecimaldate(pad_date(end_date, ' end' ), FALSE) AS end_decdate,
125- area,
126- %s,
127- (ST_MaximumInscribedCircle(geometry)).center AS geometry
128- FROM %I
129- WHERE name IS NOT NULL AND name <> ' ' ;
130- $sql$, tmp_view_name, lang_columns, source_table);
131-
132- PERFORM finalize_materialized_view(
133- tmp_view_name,
134- view_name,
135- unique_columns,
136- sql_create
137- );
138- END;
139- $$ LANGUAGE plpgsql;
9+ -- Zoom levels 16-20: Base view with full detail, no simplification
10+ SELECT create_areas_mview(' osm_water_areas' ,' mv_water_areas_z16_20' ,0 ,0 ,' id, osm_id, type' );
14011
141- -- ============================================================================
142- -- Create materialized views for water ceontroids
143- -- ============================================================================
144- SELECT create_water_areas_centroids_mview(' osm_water_areas_z0_2' , ' mv_water_areas_centroids_z0_2' );
145- SELECT create_water_areas_centroids_mview(' osm_water_areas_z3_5' , ' mv_water_areas_centroids_z3_5' );
146- SELECT create_water_areas_centroids_mview(' osm_water_areas_z6_7' , ' mv_water_areas_centroids_z6_7' );
147- SELECT create_water_areas_centroids_mview(' osm_water_areas_z8_9' , ' mv_water_areas_centroids_z8_9' );
148- SELECT create_water_areas_centroids_mview(' osm_water_areas_z10_12' , ' mv_water_areas_centroids_z10_12' );
149- SELECT create_water_areas_centroids_mview(' osm_water_areas_z13_15' , ' mv_water_areas_centroids_z13_20' );
12+ -- Zoom levels 13-15: Light simplification (5m tolerance), no area filter
13+ SELECT create_area_mview_from_mview(' mv_water_areas_z16_20' ,' mv_water_areas_z13_15' ,5 ,0 .0 ,NULL );
14+
15+ -- Zoom levels 10-12: Moderate simplification (20m tolerance), min area 100
16+ SELECT create_area_mview_from_mview(' mv_water_areas_z13_15' ,' mv_water_areas_z10_12' ,20 ,100 , ' type IN (' ' water' ' ,' ' pond' ' ,' ' basin' ' ,' ' canal' ' ,' ' mill_pond' ' ,' ' riverbank' ' )' );
17+
18+ -- Zoom levels 8-9: Higher simplification (100m tolerance), min area 10,000
19+ SELECT create_area_mview_from_mview(' mv_water_areas_z10_12' ,' mv_water_areas_z8_9' ,100 ,10000 , NULL );
20+
21+ -- Zoom levels 6-7: Very high simplification (200m tolerance), min area 1,000,000
22+ SELECT create_area_mview_from_mview(' mv_water_areas_z8_9' ,' mv_water_areas_z6_7' ,200 ,1000000 , NULL );
23+
24+ -- Zoom levels 3-5: Extreme simplification (1000m tolerance), min area 50,000,000
25+ SELECT create_area_mview_from_mview(' mv_water_areas_z6_7' ,' mv_water_areas_z3_5' ,1000 ,50000000 , NULL );
26+
27+ -- Zoom levels 0-2: Maximum simplification (5000m tolerance), min area 100,000,000
28+ SELECT create_area_mview_from_mview(' mv_water_areas_z3_5' ,' mv_water_areas_z0_2' ,5000 ,100000000 , ' type IN (' ' water' ' ,' ' riverbank' ' )' );
15029
15130-- ============================================================================
152- -- Create materialized views for water areas using subdivided geometries and generic function
31+ -- Water Areas Centroids Materialized Views for Multiple Zoom Levels
15332-- ============================================================================
154- SELECT create_water_areas_subdivided_mview(' osm_water_areas_z0_2' , ' mv_water_areas_z0_2_subdivided' );
155- SELECT create_water_areas_subdivided_mview(' osm_water_areas_z3_5' , ' mv_water_areas_z3_5_subdivided' );
156- SELECT create_water_areas_subdivided_mview(' osm_water_areas_z6_7' , ' mv_water_areas_z6_7_subdivided' );
157- SELECT create_water_areas_subdivided_mview(' osm_water_areas_z8_9' , ' mv_water_areas_z8_9_subdivided' );
158- SELECT create_generic_mview(' osm_water_areas_z10_12' , ' mv_water_areas_z10_12' , ARRAY[' osm_id' , ' type' ]);
159- SELECT create_generic_mview(' osm_water_areas_z13_15' , ' mv_water_areas_z13_15' , ARRAY[' osm_id' , ' type' ]);
160- SELECT create_generic_mview(' osm_water_areas' , ' mv_water_areas_z16_20' , ARRAY[' osm_id' , ' type' ]);
33+ select create_mview_centroid_from_mview(' mv_water_areas_z16_20' ,' mv_water_areas_centroids_z16_20' , ' name IS NOT NULL AND name <> ' ' ' ' ' );
34+ select create_mview_centroid_from_mview(' mv_water_areas_z13_15' ,' mv_water_areas_centroids_z13_15' , ' name IS NOT NULL AND name <> ' ' ' ' ' );
35+ select create_mview_centroid_from_mview(' mv_water_areas_z10_12' ,' mv_water_areas_centroids_z10_12' , ' name IS NOT NULL AND name <> ' ' ' ' ' );
36+ select create_mview_centroid_from_mview(' mv_water_areas_z8_9' ,' mv_water_areas_centroids_z8_9' , ' name IS NOT NULL AND name <> ' ' ' ' ' );
37+ select create_mview_centroid_from_mview(' mv_water_areas_z6_7' ,' mv_water_areas_centroids_z6_7' , ' name IS NOT NULL AND name <> ' ' ' ' ' );
38+ select create_mview_centroid_from_mview(' mv_water_areas_z3_5' ,' mv_water_areas_centroids_z3_5' , ' name IS NOT NULL AND name <> ' ' ' ' ' );
39+ select create_mview_centroid_from_mview(' mv_water_areas_z0_2' ,' mv_water_areas_centroids_z0_2' , ' name IS NOT NULL AND name <> ' ' ' ' ' );
40+
16141
16242-- ============================================================================
163- -- Create materialized views for water lines
43+ -- Water lines Materialized Views for Multiple Zoom Levels
16444-- ============================================================================
165- SELECT create_generic_mview(' osm_water_lines_z8_9' , ' mv_water_lines_z8_9' );
166- SELECT create_generic_mview(' osm_water_lines_z10_12' , ' mv_water_lines_z10_12' );
167- SELECT create_generic_mview(' osm_water_lines_z13_15' , ' mv_water_lines_z13_15' );
168- SELECT create_generic_mview(' osm_water_lines_z16_20' , ' mv_water_lines_z16_20' );
45+
46+ SELECT create_lines_mview(' osm_water_lines' , ' mv_water_lines_z16_20' , 0 , 0 , ' id, osm_id, type' , ' type IN (' ' river' ' , ' ' canal' ' , ' ' cliff' ' , ' ' dam' ' , ' ' stream' ' , ' ' ditch' ' , ' ' drain' ' )' );
47+ SELECT create_mview_line_from_mview(' mv_water_lines_z16_20' , ' mv_water_lines_z13_15' , 5 , ' type IN (' ' river' ' , ' ' canal' ' , ' ' cliff' ' , ' ' dam' ' , ' ' stream' ' )' );
48+ SELECT create_mview_line_from_mview(' mv_water_lines_z13_15' , ' mv_water_lines_z10_12' , 20 , ' type IN (' ' river' ' , ' ' canal' ' , ' ' cliff' ' , ' ' dam' ' )' );
49+ SELECT create_mview_line_from_mview(' mv_water_lines_z10_12' , ' mv_water_lines_z8_9' , 100 , ' type IN (' ' river' ' , ' ' canal' ' )' );
50+
51+
52+ -- Refresh areas views
53+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_areas_z16_20;
54+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_areas_z13_15;
55+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_areas_z10_12;
56+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_areas_z8_9;
57+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_areas_z6_7;
58+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_areas_z3_5;
59+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_areas_z0_2;
60+
61+ -- Refresh centroids views
62+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_areas_centroids_z16_20;
63+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_areas_centroids_z13_15;
64+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_areas_centroids_z10_12;
65+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_areas_centroids_z8_9;
66+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_areas_centroids_z6_7;
67+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_areas_centroids_z3_5;
68+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_areas_centroids_z0_2;
69+
70+ -- Refresh lines views
71+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_lines_z16_20
72+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_lines_z13_15
73+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_lines_z10_12
74+ -- REFRESH MATERIALIZED VIEW CONCURRENTLY mv_water_lines_z8_9
0 commit comments