douglas-peucker and visvalingam examples
This commit is contained in:
parent
5937f94669
commit
5b355be795
23
IV/Makefile
23
IV/Makefile
@ -28,7 +28,11 @@ FIGURES = \
|
|||||||
RIVERS = \
|
RIVERS = \
|
||||||
salvis-25k \
|
salvis-25k \
|
||||||
salvis-50k \
|
salvis-50k \
|
||||||
salvis-250k
|
salvis-250k \
|
||||||
|
salvis-douglas-64-50k \
|
||||||
|
salvis-visvalingam-64-50k \
|
||||||
|
salvis-douglas-64-chaikin-50k \
|
||||||
|
salvis-visvalingam-64-chaikin-50k
|
||||||
|
|
||||||
#################################
|
#################################
|
||||||
# The thesis, publishable version
|
# The thesis, publishable version
|
||||||
@ -126,6 +130,23 @@ salvis-50k_WIDTHDIV = 2
|
|||||||
salvis-250k_1SELECT = wm_visuals where name='salvis'
|
salvis-250k_1SELECT = wm_visuals where name='salvis'
|
||||||
salvis-250k_WIDTHDIV = 10
|
salvis-250k_WIDTHDIV = 10
|
||||||
|
|
||||||
|
#salvis-douglas-64-50k_1SELECT = wm_visuals where name='salvis'
|
||||||
|
salvis-douglas-64-50k_2SELECT = wm_visuals where name='salvis-douglas-64'
|
||||||
|
salvis-douglas-64-50k_WIDTHDIV = 2
|
||||||
|
|
||||||
|
#salvis-visvalingam-64-50k_1SELECT = wm_visuals where name='salvis'
|
||||||
|
salvis-visvalingam-64-50k_2SELECT = wm_visuals where name='salvis-visvalingam-64'
|
||||||
|
salvis-visvalingam-64-50k_WIDTHDIV = 2
|
||||||
|
|
||||||
|
salvis-douglas-64-chaikin-50k_1SELECT = wm_visuals where name='salvis'
|
||||||
|
salvis-douglas-64-chaikin-50k_2SELECT = wm_visuals where name='salvis-douglas-64-chaikin'
|
||||||
|
salvis-douglas-64-chaikin-50k_WIDTHDIV = 2
|
||||||
|
|
||||||
|
salvis-visvalingam-64-chaikin-50k_1SELECT = wm_visuals where name='salvis'
|
||||||
|
salvis-visvalingam-64-chaikin-50k_2SELECT = wm_visuals where name='salvis-visvalingam-64-chaikin'
|
||||||
|
salvis-visvalingam-64-chaikin-50k_WIDTHDIV = 2
|
||||||
|
|
||||||
|
|
||||||
.faux_test-rivers: tests-rivers.sql wm.sql Makefile .faux_db
|
.faux_test-rivers: tests-rivers.sql wm.sql Makefile .faux_db
|
||||||
bash db -v scaledwidth=$(SCALEDWIDTH) -f $<
|
bash db -v scaledwidth=$(SCALEDWIDTH) -f $<
|
||||||
touch $@
|
touch $@
|
||||||
|
@ -24,7 +24,7 @@ def inch(cm):
|
|||||||
def parse_args():
|
def parse_args():
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description='Convert a geometry to an image')
|
description='Convert a geometry to an image')
|
||||||
parser.add_argument('--group1-select', required=True)
|
parser.add_argument('--group1-select')
|
||||||
parser.add_argument('--group1-linestyle')
|
parser.add_argument('--group1-linestyle')
|
||||||
|
|
||||||
simplify = parser.add_mutually_exclusive_group()
|
simplify = parser.add_mutually_exclusive_group()
|
||||||
@ -91,9 +91,9 @@ def main():
|
|||||||
fig, ax = plt.subplots()
|
fig, ax = plt.subplots()
|
||||||
fig.set_figwidth(inch(width))
|
fig.set_figwidth(inch(width))
|
||||||
|
|
||||||
group1 is not None and group1.plot(ax=ax, **c1)
|
group1 is not None and group1.plot(ax=ax, linewidth=.75, **c1)
|
||||||
group2 is not None and group2.plot(ax=ax, **c2)
|
group2 is not None and group2.plot(ax=ax, linewidth=.75, **c2)
|
||||||
group3 is not None and group3.plot(ax=ax, **c3)
|
group3 is not None and group3.plot(ax=ax, linewidth=.75, **c3)
|
||||||
|
|
||||||
ax.axis('off')
|
ax.axis('off')
|
||||||
ax.margins(0, 0)
|
ax.margins(0, 0)
|
||||||
|
@ -34,6 +34,8 @@
|
|||||||
% does not require minted
|
% does not require minted
|
||||||
\usepackage{verbatim}
|
\usepackage{verbatim}
|
||||||
\newcommand{\inputcode}[2]{\verbatiminput{#2}}
|
\newcommand{\inputcode}[2]{\verbatiminput{#2}}
|
||||||
|
\usepackage{setspace}
|
||||||
|
\doublespacing
|
||||||
\fi
|
\fi
|
||||||
|
|
||||||
\input{version.inc}
|
\input{version.inc}
|
||||||
@ -192,12 +194,6 @@ thus convenient to analyze for both small and large scale generalization.
|
|||||||
\label{fig:salvis-25}
|
\label{fig:salvis-25}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
Same rivers, unprocessed, but with higher density (scales 1:50000 and 1:250000)
|
|
||||||
are depicted in figure~\ref{fig:salvis-50-250}. Some river features are so
|
|
||||||
compact that a reasonably thin line depicting the river is overlapping with
|
|
||||||
itself, creating a thicker line in print. As a result, generalization for this
|
|
||||||
river for a smaller scale is worthy.
|
|
||||||
|
|
||||||
\begin{figure}[h]
|
\begin{figure}[h]
|
||||||
\centering
|
\centering
|
||||||
\begin{subfigure}[b]{.49\textwidth}
|
\begin{subfigure}[b]{.49\textwidth}
|
||||||
@ -214,6 +210,50 @@ river for a smaller scale is worthy.
|
|||||||
\label{fig:salvis-50-250}
|
\label{fig:salvis-50-250}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
|
Same rivers, unprocessed, but with higher density (scales 1:50000 and 1:250000)
|
||||||
|
are depicted in figure~\onpage{fig:salvis-50-250}. Some river features are so
|
||||||
|
compact that a reasonably thin line depicting the river is touching itself,
|
||||||
|
creating a thicker line. As a result, generalization for this river for a
|
||||||
|
smaller scale is worthy.
|
||||||
|
|
||||||
|
\begin{figure}[h]
|
||||||
|
\centering
|
||||||
|
\begin{subfigure}[b]{.49\textwidth}
|
||||||
|
\includegraphics[width=\textwidth]{salvis-douglas-64-50k}
|
||||||
|
\caption{Using {\DP}}
|
||||||
|
\end{subfigure}
|
||||||
|
\hfill
|
||||||
|
\begin{subfigure}[b]{.49\textwidth}
|
||||||
|
\includegraphics[width=\textwidth]{salvis-visvalingam-64-50k}
|
||||||
|
\caption{Using {\VW}}
|
||||||
|
\end{subfigure}
|
||||||
|
\caption{Generalized using classical algorithms (1:50000).}
|
||||||
|
\label{fig:salvis-generalized-50k}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
|
||||||
|
Figure~\onpage{fig:salvis-generalized-50k} illustrates the same river bend, but
|
||||||
|
generalized using {\DP} and {\VW} algorithms. The resulting lines are jagged,
|
||||||
|
thus the resulting line looks unlike a real river. To smoothen the jaggedness,
|
||||||
|
traditionally, Chaikin's\cite{chaikin1974algorithm} is applied after
|
||||||
|
generalization, illustrated in
|
||||||
|
figure~\onpage{fig:salvis-generalized-chaikin-50k}.
|
||||||
|
|
||||||
|
\begin{figure}[h]
|
||||||
|
\centering
|
||||||
|
\begin{subfigure}[b]{.49\textwidth}
|
||||||
|
\includegraphics[width=\textwidth]{salvis-douglas-64-chaikin-50k}
|
||||||
|
\caption{Using {\DP} and Chaikin's}
|
||||||
|
\end{subfigure}
|
||||||
|
\hfill
|
||||||
|
\begin{subfigure}[b]{.49\textwidth}
|
||||||
|
\includegraphics[width=\textwidth]{salvis-visvalingam-64-chaikin-50k}
|
||||||
|
\caption{Using {\VW} and Chaikin's}
|
||||||
|
\end{subfigure}
|
||||||
|
\caption{Generalized and smoothened river (1:50000).}
|
||||||
|
\label{fig:salvis-generalized-chaikin-50k}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
\subsubsection{Modern approaches}
|
\subsubsection{Modern approaches}
|
||||||
|
|
||||||
Due to their simplicity and ubiquity, {\DP} and {\VW} have been established as
|
Due to their simplicity and ubiquity, {\DP} and {\VW} have been established as
|
||||||
|
@ -22,7 +22,7 @@ begin
|
|||||||
end
|
end
|
||||||
$$ language plpgsql;
|
$$ language plpgsql;
|
||||||
|
|
||||||
delete from wm_visuals where name in ('salvis');
|
delete from wm_visuals where name like 'salvis%';
|
||||||
insert into wm_visuals(name, way) values('salvis', (
|
insert into wm_visuals(name, way) values('salvis', (
|
||||||
select st_intersection(
|
select st_intersection(
|
||||||
(select st_union(way) from wm_rivers where name in ('Šalčia', 'Visinčia')),
|
(select st_union(way) from wm_rivers where name in ('Šalčia', 'Visinčia')),
|
||||||
@ -36,6 +36,23 @@ insert into wm_visuals(name, way) values('salvis', (
|
|||||||
)
|
)
|
||||||
));
|
));
|
||||||
|
|
||||||
|
do $$
|
||||||
|
declare
|
||||||
|
i integer;
|
||||||
|
geom1 geometry;
|
||||||
|
geom2 geometry;
|
||||||
|
begin
|
||||||
|
foreach i in array array[16, 64, 256] loop
|
||||||
|
geom1 = st_simplify((select way from wm_visuals where name='salvis'), i);
|
||||||
|
geom2 = st_simplifyvw((select way from wm_visuals where name='salvis'), i*i);
|
||||||
|
insert into wm_visuals(name, way) values
|
||||||
|
('salvis-douglas-' || i, geom1),
|
||||||
|
('salvis-douglas-' || i || '-chaikin', st_chaikinsmoothing(geom1, 5)),
|
||||||
|
('salvis-visvalingam-' || i, geom2),
|
||||||
|
('salvis-visvalingam-' || i || '-chaikin', st_chaikinsmoothing(geom2, 5));
|
||||||
|
end loop;
|
||||||
|
end $$ language plpgsql;
|
||||||
|
|
||||||
do $$
|
do $$
|
||||||
declare
|
declare
|
||||||
npoints bigint;
|
npoints bigint;
|
||||||
|
Loading…
Reference in New Issue
Block a user