commit 5f6a997e2993c787514de324a4f36792bd5aba9f (tree)
parent 661647bf4892c7017108326a1204c9c253e3f220
Author: Motiejus Jakštys <motiejus@uber.com>
Date: Fri, 16 Apr 2021 08:00:08 +0300
estimate how long the algo will take
Diffstat:
3 files changed, 37 insertions(+), 1 deletion(-)
diff --git 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
@@ -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
@@ -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.