diff --git a/bend.sql b/bend.sql index 272f8ae..a656866 100644 --- a/bend.sql +++ b/bend.sql @@ -1,3 +1,6 @@ +\set ON_ERROR_STOP on +SET plpgsql.extra_errors TO 'all'; + create or replace function detect_bends(line geometry) returns table(bend geometry) as $$ /* for each bend, should return: - size (area) @@ -9,6 +12,8 @@ declare p1 geometry; p2 geometry; p3 geometry; + prev_sign int4; + cur_sign int4; begin pi = radians(180); @@ -16,8 +21,20 @@ begin p3 = p2; p2 = p1; p1 = p; - if p3 is null then continue; end if; - raise notice 'ANGLE %', degrees(pi - st_angle(p1, p2, p2, p3)); + if p3 is null then + continue; + end if; + cur_sign = sign(pi - st_angle(p1, p2, p2, p3)); + + bend = st_linemerge(st_union(bend, st_makeline(p3, p2))); + + if prev_sign + cur_sign = 0 then + if bend is not null then + return next; + end if; + bend = st_makeline(p3, p2); + end if; + prev_sign = cur_sign; end loop; end $$ language plpgsql;