From 0c6fe2d9baa0c0da37e6121f5ed577e130afdce8 Mon Sep 17 00:00:00 2001 From: Tomas Pohanka Date: Tue, 24 Nov 2020 11:27:06 +0100 Subject: [PATCH] Building aggregation fix (#1044) This PR solving the speed and memory issue with buildings aggregation on zoom level 13. The problem was to create ST_ClusterDBScan which failed after try to cluster a larger area. Now it will make cluster only in "small" polygon using 'country_osm_grid` which covers the world's lands. This PR solving #1022 and #974 --- layers/building/building.sql | 4 +- layers/building/etl_diagram.png | Bin 34584 -> 32745 bytes layers/building/update_building.sql | 154 +++++++++++++++++++--------- 3 files changed, 107 insertions(+), 51 deletions(-) diff --git a/layers/building/building.sql b/layers/building/building.sql index 0f55098..fbca048 100644 --- a/layers/building/building.sql +++ b/layers/building/building.sql @@ -82,7 +82,7 @@ SELECT geometry, CASE WHEN hide_3d THEN TRUE END AS hide_3d FROM ( SELECT - -- etldoc: osm_building_block_gen1 -> layer_building:z13 + -- etldoc: osm_building_block_gen_z13 -> layer_building:z13 osm_id, geometry, NULL::int AS render_height, @@ -90,7 +90,7 @@ FROM ( NULL::text AS material, NULL::text AS colour, FALSE AS hide_3d - FROM osm_building_block_gen1 + FROM osm_building_block_gen_z13 WHERE zoom_level = 13 AND geometry && bbox UNION ALL diff --git a/layers/building/etl_diagram.png b/layers/building/etl_diagram.png index c77cd48fb6a81d6f4911c1290dd9771ab98fbc2b..6e16c11e624de54589645c676562f5e9875ca82c 100644 GIT binary patch literal 32745 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
  • o&cpMS zI^B{xe2nBTo}=-bs^0+)exRoa2nfIhvhV&h*D7&G@eK*isM$n4CYUp<4VGb;C){wl zfzorwY>L7@DyVLi&z_Kgr`@O&F}v3TR_nh=g*`yu^E4114F|%)lCi>r5FWvK{?vy@lcq z$>`=>E2}H+vt@*&&;4*PoP)H~!8v|1_UZpgs!&yftW&?Bo(6>FEX(Lg50#aWFJ$tzPUJ`qK>@uu9?B=C=KsUqI}Mww1Nn4J->4}Gr=XS8 zT9}#1ywW#NoR4S4R^J60o1C3JpQKM*aY^!Lg@FteO7hvWyE;6-t+|Mq#`*Jmz8sPj zGwafK|K4L?WZUc4baBX_owmHE^6OWxV&dXT)}^o6(<+2h#WWNi;rVcX!MY>lL}^DRZzegM>9O8HCCnhba}&Xq5E6w=%^8S zkFI-|jmNA}GK$7t@;g;b1$aIYsd{o54JxJdGe;dB#K7$ZkS25ro;*y7B?@*tdKYUP zW^`__#6;^0m~?c(Wi30qguYZzd-bhY_;({wN;ty zYkLm5EucxTJMg+-JhoD>FR##rv6j|T7F#iLExyU-GyAih4 zmS;LR&3&~c8IXHy{`&QDTAH0s6wN9#=3~5fQ^zpZg79s4YCWi(l|W8@v%cZ|^Lkt0 zcj}Pcx;39(=X4 z;oBL?LN9VWD<~JjvVz9Aitd?$g!&n%hQ#{=TkmL!H826{eOsuXfjr*u)7s z-XQN=UR)MZqwuqBMQfk~f#G}$Oae{$E!BM>kKEqgA#>wghe%g2iFMeauYHcA#jsp@ z-|A^^<={|FM;Q>Gs{Vd4W(pHhGv(N~Po6M?m4U`f(ruW0?I__01Nk-7G3-M!P&Jj= z(-$vxL!f~U97*|2UXht(9v2rej07wcL)!8Unau|h>!*G`92uDf@&&t3)Mkui(u4^@ z#!sBk$G2uycX0SjWXb$;Zvu4`?G8Xi|9<^;5mW?yol^6m@Zn2;?#A?M(&`(t2=`5) z9YW!okl^6vb}=W%2Y>wV@Il75Css)eI8;<4oCg`o1cqgl8{3M8=M4&N2ot~Cnj&p^ z;ru$=RZ|qg*gLd`GkrQUnIuJYBdltw!{)>dJw$^ZmX>a%a-a+z2QTBOlX&I~XQ}Ms zKlNIkA?3TZ&ndwL7RZRQi4Vm?abSdmx=bv-`PYyM0tX}CoYYHOsZp@*2^D@1C6lGP zmh}Z&6hCzGlr@k3>}Bh>PbeTn9eWXBa-5I3`E90#kdA;k%6Vh*=T!H+hb>1>p2Jy{ zt`y%?pb$o0A>Zi%3by@Nd3}c{)V;f+_RR(?q$MP#aAA}LKEj6ig^vs#T#a3FUH_ii zij+ZM29&Bhc6_B&V|tX~D`Bb&LDu~!2V$u3W6s@iTcm_`>k}#~U`8Mcg1Dp#Y%4ed z9y!7_dp4BeymDFJJfbT4ToSQxIxVBQ$;o85(vA_z$}=H=gdbVhulunzI#Jy--HmdA z^WYXzJ}%JUL<(*~nDFGZV^dT7W%(?L$^CLoAYgt0pcG@LPI0=K4w=Fp#2DYm71yIh zp`O1!eBpXs1@J_+Kcm%LtoiMRF{CH}PgKAd*mGH1A7iQ9PaSBE(JAWIH4MN}0N~7E=-WP&mkJ=T^Sgh+v4}fg=J>pJ(gnSv%@BH6 zAlYAdY+GBNnX9clJig#B`V(Ww8|;-8=Z{#bGxXsX7&ur@5|pU2Zx4}a|L&)v?Z<21 zx-8{?;JiuY^|E5}f_{MAuSpHw*^v|-`SYXYen%p?>*2Z7RPaj+NyaUaeEH`wKg?@AbRw25#Zw`ZvO+? zZcr4UZLn(8jsh8e8|Fdc*}P^4bFumW-T8*EeE;(0 zzh%y{;NrpgRUV$67ypOu4;gZmD`tuSDPCzxQ(8Q;5JWM~Do`m{&WI0#MrnJPT>GHs-4{NYPH61Z(P2bO*55b z-?YxL=iQ<0;*jhpONx3Ck3#=8TZDvQWQ@5TA%@3!p#eGGa9Tn^O6>5G>$S7d{oU2f0Ervxm~P$ z^M{KlbVBzs6#2Gz8a+U(87evC7AK(;95nquM5)?8GcI|NL|KV`GGXTVgX?i2!v0G} z0+CmXfw-SVc18QvJwLouxLJ=mOJENMghwwPAIW$^{E*MG>RYFb+Mjol)M*$~U|+Ss zxxyCuYU>15sf?bYmS3Sq6nhvGn>u&15wc<|J((V0$Iti_+YR`LbM!P-{19={30MIj zx?RgGIW(mIY;t?UPe@K6u|38dc`lpqoL{^@&qPwTcnwKbXSz>aX=7yr{p`mR}eAiG)l0Yj^4szV%i4wU31F173FZy0vKIWrcaSehUBo N`|SBzY`N3{(Z#? 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 G&;J7|s|aTR diff --git a/layers/building/update_building.sql b/layers/building/update_building.sql index 97d9eb3..d363eac 100644 --- a/layers/building/update_building.sql +++ b/layers/building/update_building.sql @@ -1,13 +1,13 @@ DROP TRIGGER IF EXISTS trigger_refresh ON buildings.updates; DROP TRIGGER IF EXISTS trigger_flag ON osm_building_polygon; ---creating aggregated building blocks with removed small polygons and small ---holes. Aggregated polygons are simplified. +-- Creating aggregated building blocks with removed small polygons and small +-- holes. Aggregated polygons are simplified by Visvalingam-Whyatt algorithm. +-- Aggregating is made block by block using country_osm_grid polygon table. ---function returning recordset for matview ---returning recordset of buildings aggregates by zres 14, with removed small ---holes and with removed small buildings/blocks --- +-- Function returning recordset for matview. +-- Returning recordset of buildings aggregates by zres 14, with removed small +-- holes and with removed small buildings/blocks. CREATE OR REPLACE FUNCTION osm_building_block_gen1() RETURNS table @@ -20,50 +20,68 @@ $$ DECLARE zres14 float := Zres(14); zres12 float := Zres(12); + zres14vw float := Zres(14) * Zres(14); + polyg_world record; + BEGIN - FOR osm_id, geometry IN - WITH dta AS ( -- CTE is used because of optimization - SELECT o.osm_id, o.geometry, ST_ClusterDBSCAN(o.geometry, eps := zres14, minpoints := 1) OVER () cid - FROM osm_building_polygon o - ) - SELECT (array_agg(dta.osm_id))[1] osm_id, - ST_Buffer(ST_MemUnion(ST_Buffer(dta.geometry, zres14, 'join=mitre')), -zres14, 'join=mitre') geometry - FROM dta - GROUP BY cid - + FOR polyg_world IN + SELECT ST_Transform(country.geometry, 3857) AS geometry + FROM country_osm_grid country + LOOP - -- removing holes smaller than - IF ST_NumInteriorRings(geometry) > 0 THEN -- only from geometries wih holes - geometry := ( - -- there are some multi-geometries in this layer - SELECT ST_Collect(gn) - FROM ( - -- in some cases are "holes" NULL, because all holes are smaller than - SELECT COALESCE( - -- exterior ring - ST_MakePolygon(ST_ExteriorRing(dmp.geom), holes), - ST_MakePolygon(ST_ExteriorRing(dmp.geom)) - ) gn + FOR osm_id, geometry IN + WITH dta AS ( -- CTE is used because of optimization + SELECT o.osm_id, + o.geometry, + ST_ClusterDBSCAN(o.geometry, eps := zres14, minpoints := 1) OVER () cid + FROM osm_building_polygon o + WHERE ST_Intersects(o.geometry, polyg_world.geometry) + ) + SELECT (array_agg(dta.osm_id))[1] AS osm_id, + ST_Buffer( + ST_Union( + ST_Buffer( + ST_SnapToGrid(dta.geometry, 0.000001) + , zres14, 'join=mitre') + ) + , -zres14, 'join=mitre') AS geometry + FROM dta + GROUP BY cid - FROM ST_Dump(geometry) dmp, -- 1 dump polygons - LATERAL ( - SELECT array_agg(ST_Boundary(rg.geom)) holes -- 2 create array - FROM ST_DumpRings(dmp.geom) rg -- 3 from rings - WHERE rg.path[1] > 0 -- 5 except inner ring - AND ST_Area(rg.geom) >= power(zres12, 2) -- 4 bigger than - ) holes - ) new_geom - ); - END IF; + LOOP + -- removing holes smaller than + IF ST_NumInteriorRings(geometry) > 0 THEN -- only from geometries wih holes + geometry := ( + -- there are some multi-geometries in this layer + SELECT ST_Collect(gn) + FROM ( + -- in some cases are "holes" NULL, because all holes are smaller than + SELECT COALESCE( + -- exterior ring + ST_MakePolygon(ST_ExteriorRing(dmp.geom), holes), + ST_MakePolygon(ST_ExteriorRing(dmp.geom)) + ) gn - IF ST_Area(geometry) < power(zres12, 2) THEN - CONTINUE; - END IF; + FROM ST_Dump(geometry) dmp, -- 1 dump polygons + LATERAL ( + SELECT array_agg(ST_Boundary(rg.geom)) holes -- 2 create array + FROM ST_DumpRings(dmp.geom) rg -- 3 from rings + WHERE rg.path[1] > 0 -- 5 except inner ring + AND ST_Area(rg.geom) >= power(zres12, 2) -- 4 bigger than + ) holes + ) new_geom + ); + END IF; - -- simplify - geometry := ST_SimplifyPreserveTopology(geometry, zres14::float); + IF ST_Area(geometry) < power(zres12, 2) THEN + CONTINUE; + END IF; - RETURN NEXT; + -- simplify + geometry := ST_SimplifyVW(geometry, zres14vw); + + RETURN NEXT; + END LOOP; END LOOP; END; $$ LANGUAGE plpgsql STABLE @@ -71,15 +89,52 @@ $$ LANGUAGE plpgsql STABLE PARALLEL SAFE; -DROP MATERIALIZED VIEW IF EXISTS osm_building_block_gen1; +DROP MATERIALIZED VIEW IF EXISTS osm_building_block_gen1_dup CASCADE; -CREATE MATERIALIZED VIEW osm_building_block_gen1 AS +CREATE MATERIALIZED VIEW osm_building_block_gen1_dup AS SELECT * FROM osm_building_block_gen1(); -CREATE INDEX ON osm_building_block_gen1 USING gist (geometry); -CREATE UNIQUE INDEX ON osm_building_block_gen1 USING btree (osm_id); +CREATE INDEX ON osm_building_block_gen1_dup USING gist (geometry); +-- etldoc: osm_building_polygon -> osm_building_block_gen_z13 +DROP MATERIALIZED VIEW IF EXISTS osm_building_block_gen_z13; +CREATE MATERIALIZED VIEW osm_building_block_gen_z13 AS +( +WITH + counts AS ( + SELECT count(osm_id) AS counts, + osm_id + FROM osm_building_block_gen1_dup + GROUP BY osm_id + ), + + duplicates AS ( + SELECT counts.osm_id + FROM counts + WHERE counts.counts > 1 + ) + +SELECT osm.osm_id, + ST_Union( + ST_MakeValid(osm.geometry)) AS geometry + FROM osm_building_block_gen1_dup osm, + duplicates + WHERE osm.osm_id = duplicates.osm_id + GROUP BY osm.osm_id + + UNION ALL + + SELECT osm.osm_id, + osm.geometry + FROM osm_building_block_gen1_dup osm, + counts + WHERE counts.counts = 1 + AND osm.osm_id = counts.osm_id +); + +CREATE INDEX ON osm_building_block_gen_z13 USING gist (geometry); +CREATE UNIQUE INDEX ON osm_building_block_gen_z13 USING btree (osm_id); -- Handle updates @@ -106,7 +161,8 @@ DECLARE t TIMESTAMP WITH TIME ZONE := clock_timestamp(); BEGIN RAISE LOG 'Refresh buildings block'; - REFRESH MATERIALIZED VIEW osm_building_block_gen1; + REFRESH MATERIALIZED VIEW osm_building_block_gen1_dup; + REFRESH MATERIALIZED VIEW osm_building_block_gen_z13; -- noinspection SqlWithoutWhere DELETE FROM buildings.updates;