add some figures, use different exaggeration algorithm

This commit is contained in:
Motiejus Jakštys 2021-05-19 22:57:51 +03:00 committed by Motiejus Jakštys
parent 2f144197c1
commit 3a7ac37ae9
5 changed files with 62 additions and 43 deletions

View File

@ -40,7 +40,8 @@ RIVERS = \
salvis-visvalingam-64-chaikin-50k \ salvis-visvalingam-64-chaikin-50k \
salvis-overlaid-douglas-64-chaikin-50k \ salvis-overlaid-douglas-64-chaikin-50k \
salvis-overlaid-visvalingam-64-chaikin-50k \ salvis-overlaid-visvalingam-64-chaikin-50k \
salvis-wm-24-50k salvis-wm-75-50k \
salvis-wm-375-250k
################################# #################################
# The thesis, publishable version # The thesis, publishable version
@ -192,10 +193,15 @@ salvis-overlaid-visvalingam-64-chaikin-50k_1COLOR = orange
salvis-overlaid-visvalingam-64-chaikin-50k_WIDTHDIV = 2 salvis-overlaid-visvalingam-64-chaikin-50k_WIDTHDIV = 2
salvis-overlaid-visvalingam-64-chaikin-50k_QUADRANT = 1 salvis-overlaid-visvalingam-64-chaikin-50k_QUADRANT = 1
salvis-wm-24-50k_1SELECT = wm_visuals where name='salvis' salvis-wm-75-50k_1SELECT = wm_visuals where name='salvis'
salvis-wm-24-50k_2SELECT = wm_visuals where name='salvis-wm-24' salvis-wm-75-50k_2SELECT = wm_visuals where name='salvis-wm-75'
salvis-wm-24-50k_2COLOR = orange salvis-wm-75-50k_1COLOR = orange
#salvis-wm-24-50k_WIDTHDIV = 4 salvis-wm-75-50k_WIDTHDIV = 2
salvis-wm-375-250k_1SELECT = wm_visuals where name='salvis'
salvis-wm-375-250k_2SELECT = wm_visuals where name='salvis-wm-375'
salvis-wm-375-250k_1COLOR = orange
salvis-wm-375-250k_WIDTHDIV = 2
.faux_db: db init.sql rivers.sql .faux_db: db init.sql rivers.sql
bash db start bash db start

View File

@ -1292,18 +1292,25 @@ NOTE: this should provide a higher-level overview of the written code:
\subsection{Generalization results of Analyzed Rivers} \subsection{Generalization results of Analyzed Rivers}
Figure~\ref{fig:salvis-wm-24-50k} visualizes the generalization result for Figure~\ref{fig:salvis-wm-75-50k} visualizes the generalization result for
Šalčia and Visinčia. The generalized feature is orange. As can be seen, Šalčia and Visinčia. The generalized feature is orange. As can be seen,
some isolated bends are exaggerated, and some small bends are removed. some isolated bends are exaggerated, and some small bends are removed.
% TODO: replace 24 to 75.
\begin{figure}[ht] \begin{figure}[ht]
\centering \centering
\includegraphics[width=.5\textwidth]{salvis-wm-24-50k} \includegraphics[width=.5\textwidth]{salvis-wm-75-50k}
\caption{{\WM}-generalized river (1:{\numprint{50000}}).} \caption{{\WM}-generalized river (1:{\numprint{50000}}).}
\label{fig:salvis-wm-24-50k} \label{fig:salvis-wm-75-50k}
\end{figure} \end{figure}
\begin{figure}[ht]
\centering
\includegraphics[width=.5\textwidth]{salvis-wm-375-250k}
\caption{{\WM}-generalized river (1:{\numprint{250000}}).}
\label{fig:salvis-wm-375-250k}
\end{figure}
\subsection{Generalization result comparison with national spatial data sets} \subsection{Generalization result comparison with national spatial data sets}
% TODO: GDR50LT and GDR250LT % TODO: GDR50LT and GDR250LT

View File

@ -49,6 +49,8 @@ insert into wm_figures (name, way) values ('fig6-combi', ST_Union(
insert into wm_figures (name, way) values ('selfcrossing-1-rev',ST_Reverse( 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))); ST_Translate((select way from wm_figures where name='selfcrossing-1'), 0, 60)));
update wm_figures set way=st_setsrid(way, 3857);
delete from wm_debug where name in (select distinct name from wm_figures); delete from wm_debug where name in (select distinct name from wm_figures);
delete from wm_demo where name in (select distinct name from wm_figures); delete from wm_demo where name in (select distinct name from wm_figures);
insert into wm_demo (name, way) select name, ST_SimplifyWM(way, .1, null, name) from wm_figures where name not in ('fig8', 'isolated-1'); insert into wm_demo (name, way) select name, ST_SimplifyWM(way, .1, null, name) from wm_figures where name not in ('fig8', 'isolated-1');

View File

@ -123,8 +123,7 @@ begin
('salvis-visvalingam-' || i, geom2), ('salvis-visvalingam-' || i, geom2),
('salvis-visvalingam-' || i || '-chaikin', st_chaikinsmoothing(geom2, 5)); ('salvis-visvalingam-' || i || '-chaikin', st_chaikinsmoothing(geom2, 5));
end loop; end loop;
-- TODO: 75 foreach i in array array[75, 375] loop
foreach i in array array[16, 24] loop
geom3 = st_simplifywm((select way from wm_visuals where name='salvis'), i, 50, 'salvis-' || i); geom3 = st_simplifywm((select way from wm_visuals where name='salvis'), i, 50, 'salvis-' || i);
insert into wm_visuals(name, way) values insert into wm_visuals(name, way) values
('salvis-wm-' || i, geom3); ('salvis-wm-' || i, geom3);

67
wm.sql
View File

@ -414,9 +414,9 @@ begin
return st_split(st_snap(input, blade, 0.00000001), blade); return st_split(st_snap(input, blade, 0.00000001), blade);
end $$ language plpgsql; end $$ language plpgsql;
-- wm_exaggerate_bend exaggerates a given bend. Must be a simple linestring.
drop function if exists wm_exaggerate_bend; drop function if exists wm_exaggerate_bend2;
create function wm_exaggerate_bend( create function wm_exaggerate_bend2(
INOUT bend geometry, INOUT bend geometry,
size float, size float,
desired_size float desired_size float
@ -424,9 +424,13 @@ create function wm_exaggerate_bend(
declare declare
scale constant float default 1.2; -- exaggeration enthusiasm scale constant float default 1.2; -- exaggeration enthusiasm
midpoint geometry; -- midpoint of the baseline midpoint geometry; -- midpoint of the baseline
splitbend geometry; -- bend split across its half
bendm geometry; -- bend with coefficients to prolong the lines
points geometry[]; points geometry[];
startazimuth float;
azimuth float;
diffazimuth float;
point geometry;
sss float;
protect int = 10;
begin begin
if size = 0 then if size = 0 then
raise 'invalid input: zero-area bend'; raise 'invalid input: zero-area bend';
@ -435,35 +439,36 @@ begin
st_pointn(bend, 1), st_pointn(bend, 1),
st_pointn(bend, -1) st_pointn(bend, -1)
), .5); ), .5);
startazimuth = st_azimuth(midpoint, st_pointn(bend, 1));
while size < desired_size loop while (size < desired_size) and (protect > 0) loop
splitbend = wm_st_split(bend, st_lineinterpolatepoint(bend, .5)); protect = protect - 1;
-- Convert bend to LINESTRINGM, where M is the fraction by how for i in 2..st_npoints(bend)-1 loop
-- much the point will be prolonged: point = st_pointn(bend, i);
-- 1. draw a line between midpoint and the point on the bend. azimuth = st_azimuth(midpoint, point);
-- 2. multiply the line length by M. Midpoint stays intact. diffazimuth = degrees(azimuth - startazimuth);
-- 3. the new set of lines form a new bend. if diffazimuth > 180 then
-- Uses linear interpolation; can be updated to gaussian or similar; diffazimuth = diffazimuth - 360;
-- then interpolate manually instead of relying on st_addmeasure. elseif diffazimuth < -180 then
bendm = st_collect( diffazimuth = diffazimuth + 360;
st_addmeasure(st_geometryn(splitbend, 1), 1, scale), end if;
st_addmeasure(st_geometryn(splitbend, 2), scale, 1) diffazimuth = abs(diffazimuth);
if diffazimuth > 90 then
diffazimuth = 180 - diffazimuth;
end if;
sss = ((scale-1) * (diffazimuth / 90)^0.5);
point = st_transform(
st_project(
st_transform(point, 4326)::geography,
st_distance(midpoint, point) * sss, azimuth)::geometry,
3857
); );
bend = st_setpoint(bend, i-1, point);
points = array(( end loop;
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_setsrid(st_makeline(points), st_srid(bend));
size = wm_adjsize(bend); size = wm_adjsize(bend);
end loop; end loop;
end $$ language plpgsql; end
$$ language plpgsql;
-- wm_adjsize calculates adjusted size for a polygon. Can return 0. -- wm_adjsize calculates adjusted size for a polygon. Can return 0.
drop function if exists wm_adjsize; drop function if exists wm_adjsize;
@ -512,7 +517,7 @@ begin
<<bendloop>> <<bendloop>>
for i in 1..array_length(attrs, 1) loop for i in 1..array_length(attrs, 1) loop
if attrs[i].isolated and attrs[i].adjsize < desired_size then if attrs[i].isolated and attrs[i].adjsize < desired_size then
bend = wm_exaggerate_bend(bends[i], attrs[i].adjsize, desired_size); bend = wm_exaggerate_bend2(bends[i], attrs[i].adjsize, desired_size);
-- does bend intersect with the previous or next -- does bend intersect with the previous or next
-- intersect_patience bends? If they do, abort exaggeration for this one. -- intersect_patience bends? If they do, abort exaggeration for this one.