estimate how long the algo will take
This commit is contained in:
parent
661647bf48
commit
5f6a997e29
@ -3,6 +3,16 @@
|
|||||||
drop table if exists wm_debug;
|
drop table if exists wm_debug;
|
||||||
create table wm_debug(stage text, name text, gen bigint, nbend bigint, way geometry, props jsonb);
|
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;
|
drop table if exists wm_demo;
|
||||||
create table wm_demo (name text, i bigint, way geometry);
|
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;
|
insert into wm_demo (name, way) select name, ST_SimplifyWM(way, name) from agg_rivers;
|
||||||
|
@ -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',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)));
|
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
|
-- Run ST_SimplifyWM in debug mode, so `wm_debug` is populated. That table
|
||||||
-- is used for geometric assertions later in the file.
|
-- is used for geometric assertions later in the file.
|
||||||
drop table if exists wm_demo;
|
drop table if exists wm_demo;
|
||||||
|
27
IV/wm.sql
27
IV/wm.sql
@ -441,6 +441,33 @@ begin
|
|||||||
end
|
end
|
||||||
$$ language plpgsql;
|
$$ 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
|
-- ST_SimplifyWM simplifies a given geometry using Wang & Müller's
|
||||||
-- "Line Generalization Based on Analysis of Shape Characteristics" algorithm,
|
-- "Line Generalization Based on Analysis of Shape Characteristics" algorithm,
|
||||||
-- 1998.
|
-- 1998.
|
||||||
|
Loading…
Reference in New Issue
Block a user