fix bug in tests: detect_bends() works only on lines

This commit is contained in:
Motiejus Jakštys 2021-05-19 22:57:47 +03:00 committed by Motiejus Jakštys
parent e9d1587c8e
commit fb4a3eac6d
2 changed files with 18 additions and 28 deletions

View File

@ -25,10 +25,10 @@ insert into figures (name, way) values ('fig5',ST_GeomFromText('LINESTRING(0 39,
insert into figures (name, way) values ('fig6',ST_GeomFromText('LINESTRING(84 47,91 59,114 64,122 80,116 92,110 93,106 106,117 118,136 107,135 76,120 45,125 39,141 39,147 32)'));
insert into figures (name, way) values ('fig6-rev',ST_Reverse(ST_Translate((select way from figures where name='fig6'), 60, 0)));
insert into figures (name, way) values ('fig6-combi',
ST_LineMerge(ST_Union(
ST_Union(
ST_Translate((select way from figures where name='fig6'), 0, 90),
ST_Translate((select way from figures where name='fig6'), 80, 90)
))
)
);
insert into figures (name, way) values ('inflection-1',ST_GeomFromText('LINESTRING(110 24,114 20,133 20,145 15,145 0,136 5,123 7,114 7,111 2)'));
insert into figures (name, way) values ('multi-island',ST_GeomFromText('MULTILINESTRING((-15 10,-10 10,-5 11,0 11,5 11,10 10,11 9,13 10,15 9),(-5 11,-2 15,0 16,2 15,5 11))'));
@ -64,7 +64,7 @@ $$ language plpgsql;
-- COMBINED
drop table if exists demo_wm;
create table demo_wm (name text, i bigint, way geometry);
insert into demo_wm (name, way) select name, ST_SimplifyWM(way, name) from figures where name='fig6-combi';
insert into demo_wm (name, way) select name, ST_SimplifyWM(way, name) from figures;
do $$
declare
@ -125,25 +125,10 @@ begin
) from (select unnest(vcrossings) way) a)
);
elems1 = array((select way from debug_wm where stage='cinflections' and name='fig6-combi' and gen=1));
elems2 = (select ways from inflections where name='fig6-combi');
foreach elem in array elems1 loop
raise notice 'elem 1: %', st_astext(elem);
end loop;
foreach elem in array elems2 loop
raise notice 'elem 2: %', st_astext(elem);
end loop;
select (self_crossing(elems1)).* into vcrossings, mutated;
--select (self_crossing(elems2)).* into vcrossings, mutated;
--select (self_crossing((select ways from inflections where name='fig6-combi'))).* into vcrossings, mutated;
--select (self_crossing(array((select way from debug_wm where stage='cinflections' and name='fig6-combi')))).* into vcrossings, mutated;
select (self_crossing(array((select way from debug_wm where stage='cinflections' and name='fig6-combi' and gen=1)))).* into vcrossings, mutated;
perform assert_equals(true, mutated);
perform assert_equals(
'LINESTRING(84 137,91 149,114 154,120 135,125 129,141 129,147 122,164 137,171 149,194 154,200 135,205 129,221 129,227 122)',
'MULTILINESTRING((84 137,91 149,114 154,120 135,125 129,141 129,147 122),(164 137,171 149,194 154,200 135,205 129,221 129,227 122))',
(select st_astext(
st_linemerge(st_union(way))
) from (select unnest(vcrossings) way) a)

21
wm.sql
View File

@ -13,7 +13,13 @@ declare
bend geometry;
prev_sign int4;
cur_sign int4;
l_type text;
begin
--l_type = st_geometrytype(line);
--if l_type != 'ST_LineString' then
-- raise 'This function works with ST_LineString, got %', l_type;
--end if;
-- The last vertex is iterated over twice, because the algorithm uses 3
-- vertices to calculate the angle between them.
--
@ -323,7 +329,7 @@ $$ language plpgsql;
drop function if exists ST_SimplifyWM;
create function ST_SimplifyWM(geom geometry, dbgname text default null) returns geometry as $$
declare
dbg_stage integer;
stagenum integer;
i integer;
line geometry;
lines geometry[];
@ -342,13 +348,13 @@ begin
for i in 1..array_length(lines, 1) loop
mutated = true;
dbg_stage = 1;
stagenum = 1;
while mutated loop
if dbgname is not null then
insert into debug_wm (stage, name, gen, nbend, way) values(
'afigures',
dbgname,
dbg_stage,
stagenum,
i,
lines[i]
);
@ -360,20 +366,19 @@ begin
insert into debug_wm(stage, name, gen, nbend, way) values(
'bbends',
dbgname,
dbg_stage,
stagenum,
generate_subscripts(bends, 1),
unnest(bends)
);
end if;
raise notice 'before inflections: %', dbg_geomsummary(bends);
bends = fix_gentle_inflections(bends);
if dbgname is not null then
insert into debug_wm(stage, name, gen, nbend, way) values(
'cinflections',
dbgname,
dbg_stage,
stagenum,
generate_subscripts(bends, 1),
unnest(bends)
);
@ -385,7 +390,7 @@ begin
insert into debug_wm(stage, name, gen, nbend, way) values(
'dcrossings',
dbgname,
dbg_stage,
stagenum,
generate_subscripts(bends, 1),
unnest(bends)
);
@ -393,7 +398,7 @@ begin
if mutated then
lines[i] = st_linemerge(st_union(bends));
dbg_stage = dbg_stage + 1;
stagenum = stagenum + 1;
continue;
end if;