diff --git a/IV/tests-integration.sql b/IV/tests-integration.sql index cde2764..8d82567 100644 --- a/IV/tests-integration.sql +++ b/IV/tests-integration.sql @@ -3,6 +3,16 @@ drop table if exists wm_debug; create table wm_debug(stage text, name text, gen bigint, nbend bigint, way geometry, props jsonb); +do $$ +declare + npoints bigint; + secs bigint; +begin + select * from ST_SimplifyWM_Estimate((select st_union(way) from agg_rivers)) into npoints, secs; + raise notice 'Total points: %', npoints; + raise notice 'Expected duration: %s (+-%s), depending on bend complexity', ceil(secs), floor(secs*.5); +end $$ language plpgsql; + drop table if exists wm_demo; create table wm_demo (name text, i bigint, way geometry); insert into wm_demo (name, way) select name, ST_SimplifyWM(way, name) from agg_rivers; diff --git a/IV/tests.sql b/IV/tests.sql index 042e3b1..38f8804 100644 --- a/IV/tests.sql +++ b/IV/tests.sql @@ -56,7 +56,6 @@ insert into wm_figures (name, way) values ('multi-island',ST_GeomFromText('MULTI insert into wm_figures (name, way) values ('selfcrossing-1',ST_GeomFromText('LINESTRING(-27 180,-20 166,-21 142,-18 136,55 136,55 136,71 145,44 165,37 146,22 145,14 164,11 164,3 146,-12 146,-13 176,-18 184)')); insert into wm_figures (name, way) values ('selfcrossing-1-rev',ST_Reverse(ST_Translate((select way from wm_figures where name='selfcrossing-1'), 0, 60))); - -- Run ST_SimplifyWM in debug mode, so `wm_debug` is populated. That table -- is used for geometric assertions later in the file. drop table if exists wm_demo; diff --git a/IV/wm.sql b/IV/wm.sql index 9aebf41..d373b05 100644 --- a/IV/wm.sql +++ b/IV/wm.sql @@ -441,6 +441,33 @@ begin end $$ language plpgsql; +drop function if exists ST_SimplifyWM_Estimate; +create function ST_SimplifyWM_Estimate( + geom geometry, + OUT npoints bigint, + OUT secs bigint +) as $$ +declare + lines geometry[]; + l_type text; +begin + l_type = st_geometrytype(geom); + if l_type = 'ST_LineString' then + lines = array[geom]; + elseif l_type = 'ST_MultiLineString' then + lines = array((select a.geom from st_dump(geom) a order by path[1] asc)); + else + raise 'Unknown geometry type %', l_type; + end if; + + npoints = 0; + for i in 1..array_length(lines, 1) loop + npoints = npoints + st_numpoints(lines[i]); + end loop; + secs = npoints / 800; +end +$$ language plpgsql; + -- ST_SimplifyWM simplifies a given geometry using Wang & Müller's -- "Line Generalization Based on Analysis of Shape Characteristics" algorithm, -- 1998.