wip wm_exaggerate
This commit is contained in:
parent
69f0878bb6
commit
95e515b5cc
13
test.sql
13
test.sql
@ -188,3 +188,16 @@ begin
|
|||||||
perform assert_equals(fig8gen2, st_astext(eliminations[2]));
|
perform assert_equals(fig8gen2, st_astext(eliminations[2]));
|
||||||
perform assert_equals(fig8gen3, st_astext(eliminations[3]));
|
perform assert_equals(fig8gen3, st_astext(eliminations[3]));
|
||||||
end $$ language plpgsql;
|
end $$ language plpgsql;
|
||||||
|
|
||||||
|
-- testing wm_exaggerate in isolation
|
||||||
|
do $$
|
||||||
|
declare
|
||||||
|
fig3b2 geometry;
|
||||||
|
bend geometry;
|
||||||
|
size float;
|
||||||
|
begin
|
||||||
|
select way from wm_debug where name='fig3' and stage='bbends' and gen=1 and nbend=2 into fig3b2;
|
||||||
|
size = wm_adjsize(fig3b2);
|
||||||
|
--bend = wm_exaggerate(fig3b2, size, 50.);
|
||||||
|
--insert into wm_debug(stage, name, gen, nbend, way) values('manual', 'fig3', 1, 1, bend);
|
||||||
|
end $$ language plpgsql;
|
||||||
|
41
wm.sql
41
wm.sql
@ -409,16 +409,20 @@ $$ language plpgsql;
|
|||||||
-- wm_exaggerate exaggerates a given bend. Must be a simple linestring.
|
-- wm_exaggerate exaggerates a given bend. Must be a simple linestring.
|
||||||
drop function if exists wm_exaggerate;
|
drop function if exists wm_exaggerate;
|
||||||
create function wm_exaggerate(
|
create function wm_exaggerate(
|
||||||
bend geometry,
|
INOUT bend geometry,
|
||||||
size real,
|
size float,
|
||||||
desired_size real
|
desired_size float
|
||||||
) returns geometry as $$
|
) as $$
|
||||||
declare
|
declare
|
||||||
step constant float default 1.5; -- line length multiplier per step
|
scale constant float default 2; -- per-step scaling factor
|
||||||
midpoint geometry; -- midpoint of the baseline
|
midpoint geometry; -- midpoint of the baseline
|
||||||
splitbend geometry; -- bend split across farthest point
|
splitbend geometry; -- bend split across farthest point
|
||||||
bendm geometry; -- bend with coefficients to prolong the lines
|
bendm geometry; -- bend with coefficients to prolong the lines
|
||||||
|
points geometry[];
|
||||||
begin
|
begin
|
||||||
|
if size = 0 then
|
||||||
|
raise 'unable to exaggerate a zero-area bend';
|
||||||
|
end if;
|
||||||
midpoint = st_lineinterpolatepoint(st_makeline(
|
midpoint = st_lineinterpolatepoint(st_makeline(
|
||||||
st_pointn(bend, 1),
|
st_pointn(bend, 1),
|
||||||
st_pointn(bend, -1)
|
st_pointn(bend, -1)
|
||||||
@ -431,15 +435,28 @@ begin
|
|||||||
);
|
);
|
||||||
|
|
||||||
-- Convert bend to LINESTRINGM, where M is the fraction by how
|
-- Convert bend to LINESTRINGM, where M is the fraction by how
|
||||||
-- much the point will be prolonged.
|
-- much the point will be prolonged:
|
||||||
-- Currently using linear interpolation; can be updated to gaussian
|
-- 1. draw a line between midpoint and the point on the bend.
|
||||||
-- or so (then interpolate manually instead of relying on st_addmeasure)
|
-- 2. multiply the line length by M. Midpoint stays intact.
|
||||||
bendm = st_linemerge(st_union(
|
-- 3. the new set of lines form a new bend.
|
||||||
st_addmeasure(st_geometryn(splitbend, 1), 0, frac),
|
|
||||||
st_addmeasure(st_geometryn(splitbend, 2), frac, 0)
|
|
||||||
));
|
|
||||||
|
|
||||||
|
-- Uses linear interpolation; can be updated to gaussian or similar;
|
||||||
|
-- then interpolate manually instead of relying on st_addmeasure.
|
||||||
|
bendm = st_union(
|
||||||
|
st_addmeasure(st_geometryn(splitbend, 1), 1, scale),
|
||||||
|
st_addmeasure(st_geometryn(splitbend, 2), scale, 1)
|
||||||
|
);
|
||||||
|
|
||||||
|
points = array((
|
||||||
|
select st_scale(
|
||||||
|
st_makepoint(st_x(geom), st_y(geom)),
|
||||||
|
st_makepoint(st_m(geom), st_m(geom)),
|
||||||
|
midpoint
|
||||||
|
)
|
||||||
|
from st_dumppoints(bendm)
|
||||||
|
order by path[1], path[2]
|
||||||
|
));
|
||||||
|
bend = st_makeline(points);
|
||||||
|
|
||||||
size = wm_adjsize(bend);
|
size = wm_adjsize(bend);
|
||||||
end loop;
|
end loop;
|
||||||
|
Loading…
Reference in New Issue
Block a user