add gpkg samples

This commit is contained in:
Motiejus Jakštys 2020-05-22 10:19:17 +03:00
parent b515e40435
commit d932c7c7fc
10 changed files with 196 additions and 23 deletions

4
.gitignore vendored
View File

@ -18,6 +18,10 @@ __pycache__
*.blg *.blg
*.bcf *.bcf
*.run.xml *.run.xml
*.gpkg-wal
*.gpkg-shm
env/ env/
*.pyc *.pyc
version.tex
db/

View File

@ -1,2 +1,30 @@
mj-referatas.pdf: $(shell git ls-files .) SHELL = /bin/bash
latexmk -g -pdf mj-referatas.tex
GEN = zeimena.pdf st-simplify-100.pdf st-simplify-150.pdf st-simplify-300.pdf st-simplify-500.pdf
mj-referatas.pdf: mj-referatas.tex version.tex bib.bib zeimena-pretty.pdf $(GEN)
latexmk -g -pdf $<
zeimena.pdf: zeimena.gpkg
./layer2img.py --infile=$< --size=74x52 --outfile $@
st-simplify-%.pdf: db/.faux_st-simplify-%
./layer2img.py --table=douglas_$* --size=74x52 --outfile $@
db/.faux_st-simplify-%: db/.faux_ready st-simplify.sql
. ./managedb ; \
psql --echo-all -v ON_ERROR_STOP=1 -v tolerance=$* -f st-simplify.sql
touch $@
db/.faux_ready: zeimena.gpkg managedb
-./managedb stop; rm -fr db
./managedb init
ogr2ogr -f PostgreSQL "PG:host=127.0.0.1 user=osm dbname=osm" zeimena.gpkg
touch $@
GIT_DIR = $(shell git rev-parse --show-toplevel)/.git
version.tex: $(shell git ls-files .) $(GIT_DIR)
date "+%F %T %Z" | awk '{print "\\gdef\\GeneratedAt{"$$0"}%"}' > $@
[ -n "$$(git status --porcelain)" ] && suffix="-dirty"; \
git describe --tags | awk '{print "\\gdef\\VCDescribe{"$$0"'$$suffix'}%"}' >> $@

View File

@ -52,7 +52,7 @@
publisher={University of Toronto Press} publisher={University of Toronto Press}
} }
// algorithms for generalization, not reaching satisfactory results % Algorithms for generalization, not reaching satisfactory results
@inproceedings{monmonier1986toward, @inproceedings{monmonier1986toward,
title={Toward a practicable model of cartographic generalisation.}, title={Toward a practicable model of cartographic generalisation.},
author={Monmonier, Mark}, author={Monmonier, Mark},
@ -113,7 +113,7 @@
year={2012} year={2012}
} }
// LIKELY UNNEEDED % LIKELY UNNEEDED
@book{buttenfield1991map, @book{buttenfield1991map,
title={Map Generalization: Making rules for knowledge representation}, title={Map Generalization: Making rules for knowledge representation},
author={Buttenfield, Barbara Pfeil and McMaster, Robert Brainerd}, author={Buttenfield, Barbara Pfeil and McMaster, Robert Brainerd},

View File

@ -3,12 +3,15 @@
import argparse import argparse
import geopandas import geopandas
import psycopg2
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
INCH = 25.4 # mm INCH = 25.4 # mm
def plt_size(string): def plt_size(string):
if not string: if not string:
# using default matplotlib dimensions
return None return None
try: try:
w, h = string.split("x") w, h = string.split("x")
@ -16,25 +19,36 @@ def plt_size(string):
except Exception as e: except Exception as e:
raise argparse.ArgumentTypeError from e raise argparse.ArgumentTypeError from e
def parse_args(): def parse_args():
parser = argparse.ArgumentParser(description='Convert layer to an image') parser = argparse.ArgumentParser(
parser.add_argument('infile', type=str) description='Convert geopackage to an image')
parser.add_argument('layer', type=str) group = parser.add_mutually_exclusive_group(required=True)
parser.add_argument('-o', '--output', metavar='<file>', type=str) group.add_argument('--infile', type=str)
parser.add_argument('--size', type=plt_size, help='Figure size in mm (WWxHH)') group.add_argument('--table', type=str)
parser.add_argument('-o', '--outfile', metavar='<file>', type=str)
parser.add_argument(
'--size', type=plt_size, help='Figure size in mm (WWxHH)')
return parser.parse_args() return parser.parse_args()
def main(): def main():
args = parse_args() args = parse_args()
f = geopandas.read_file(args.infile) if args.table:
conn = psycopg2.connect("host=127.0.0.1 dbname=osm user=osm")
sql = "SELECT geom FROM %s" % args.table
f = geopandas.read_postgis(sql, con=conn, geom_col='geom')
else:
f = geopandas.read_file(args.infile)
f.plot(figsize=args.size) f.plot(figsize=args.size)
plt.axis('off') plt.axis('off')
plt.margins(0, 0) plt.margins(0, 0)
plt.tight_layout(0) plt.tight_layout(0)
if args.output: if args.outfile:
plt.savefig(args.output, bbox_inches=0, dpi=300) plt.savefig(args.outfile, bbox_inches=0, dpi=300)
else: else:
plt.show() plt.show()
if __name__ == '__main__': if __name__ == '__main__':
main() main()

46
II/Referatas/managedb Executable file
View File

@ -0,0 +1,46 @@
#!/bin/bash
main() {
PATH=$PATH:/usr/lib/postgresql/12/bin
case ${1:-} in
init)
mkdir -p db && initdb db
mkdir -p db/wal
sed -i "s/.*unix_socket_dir.*/unix_socket_directories = '.\/wal'/" \
db/postgresql.conf
pg_ctl -D db -l db/logfile start
export PGHOST=127.0.0.1
psql postgres -c 'CREATE ROLE osm WITH SUPERUSER LOGIN'
psql postgres -c 'CREATE DATABASE osm'
psql osm osm -c 'CREATE EXTENSION postgis'
;;
start)
pg_ctl -D db -l db/logfile start
;;
stop)
pg_ctl -D db -l db/logfile stop
;;
*)
>&2 echo "Unknown command: '$*'"
exit 1
;;
esac
}
if [[ "${BASH_SOURCE[0]}" != "${0}" ]]; then
if [[ $# != 0 ]]; then
>&2 echo "Sourcing does not accept arguments: $*"
else
export PGHOST=127.0.0.1
export PGUSER=osm
export PGDATABASE=osm
>&2 echo "OK: exported PGUSER, PGHOST and PGDATABASE"
fi
else
set -euo pipefail
export PGHOST=
export PGUSER=
export PGDATABASE=
main "$@"
fi

View File

@ -14,6 +14,7 @@
\usepackage{varwidth} \usepackage{varwidth}
\usepackage{tikz} \usepackage{tikz}
\usetikzlibrary{er,positioning} \usetikzlibrary{er,positioning}
\input{version}
\title{ \title{
Cartografic Generalization of Lines \\ Cartografic Generalization of Lines \\
@ -21,15 +22,40 @@
} }
\iffalse \iffalse
small scale: 1:XXXXXX
large scale: 1:XXX
take douglas-pecker and check for different scales.
a4: 210x297mm a4: 210x297mm
a6: 105x148xmm a6: 105x148xmm
a7: 74x105mm a7: 74x105mm
a8: 52x74mm a8: 52x74mm
connect rivers first to a single polylines:
- some algs can preserve connectivity, some not.
ideal hypothesis: mueller algorithm + topology may fully realize cartographic generalization tasks.
what scales and what distances?
https://postgis.net/docs/ST_SimplifyVW.html
https://postgis.net/docs/ST_Simplify.html
https://postgis.net/docs/ST_SimplifyPreserveTopology.html
how is tolerance bound to scale?
- just use same parameter.
\fi \fi
\author{Motiejus Jakštys} \author{Motiejus Jakštys}
\date{\today} \date{
\vspace{10mm}
Version: \VCDescribe \\ \vspace{4mm}
Generated At: \GeneratedAt
}
\begin{document} \begin{document}
\maketitle \maketitle
@ -73,7 +99,7 @@ of straight and curved river shape, and author's familiarity with the location.
\begin{figure} \begin{figure}
\centering \centering
\includegraphics[width=148mm]{zeimena} \includegraphics[width=148mm]{zeimena-pretty}
\caption{Žeimena near Jaunadaris} \caption{Žeimena near Jaunadaris}
\label{fig:zeimena} \label{fig:zeimena}
\end{figure} \end{figure}
@ -81,19 +107,60 @@ of straight and curved river shape, and author's familiarity with the location.
\section{Mathematical and geometrical algorithms} \section{Mathematical and geometrical algorithms}
To understand why geometrical algorithms are not entirely suitable for To understand why geometrical algorithms are not entirely suitable for
downscaling, let's pick some visual examples. downscaling, let's pick some visual examples. Start with
\cite{douglas1973algorithms}, one of the most well-known line simplification
algorithms, which is often used for generalization. Žeimena example is
generalized with different tolerances in figure~\ref{fig:douglas-peucker} on
page~\pageref{fig:douglas-peucker}.
\subsection{Douglas \& Peucker} As one can observe in figure~\ref{fig:douglas-100}, the Douglas \& Peucker with
100m tolerance preserves most of the shape, and 500m
(figure~\ref{fig:douglas-500}) becomes a straight line.
\cite{douglas1973algorithms} is one of the most well-known line simplification \begin{figure}
algorithms, which is often used for generalization. It will simplify the line shape. \centering
\begin{subfigure}[b]{0.18\textwidth}
Trying the same dataset with different tolerances for Douglas \& Peucker. \includegraphics[width=\textwidth]{zeimena}
\caption{original}
\label{fig:zeimena-original}
\end{subfigure}
~
\begin{subfigure}[b]{0.18\textwidth}
\includegraphics[width=\textwidth]{st-simplify-100}
\caption{100m}
\label{fig:douglas-100}
\end{subfigure}
~
\begin{subfigure}[b]{0.18\textwidth}
\includegraphics[width=\textwidth]{st-simplify-150}
\caption{150m}
\label{fig:douglas-150}
\end{subfigure}
~
\begin{subfigure}[b]{0.18\textwidth}
\includegraphics[width=\textwidth]{st-simplify-300}
\caption{300m}
\label{fig:douglas-300}
\end{subfigure}
~
\begin{subfigure}[b]{0.18\textwidth}
\includegraphics[width=\textwidth]{st-simplify-500}
\caption{500m}
\label{fig:douglas-500}
\end{subfigure}
\caption{Douglas \& Peucker line simplifications with different tolerances}
\label{fig:douglas-peucker}
\end{figure}
\section{Algorithms based on cartographical knowledge} \section{Algorithms based on cartographical knowledge}
\cite{jiang2003line}, \cite{dyken2009simultaneous}, For further investigation:
\cite{mustafa2006dynamic}, \cite{nollenburg2008morphing} \begin{itemize}
\item \cite{jiang2003line}
\item \cite{dyken2009simultaneous}
\item \cite{mustafa2006dynamic}
\item \cite{nollenburg2008morphing}
\end{itemize}
\section{My Idea} \section{My Idea}
\label{sec:my_idea} \label{sec:my_idea}

View File

@ -0,0 +1,14 @@
DROP TABLE IF EXISTS douglas_:tolerance;
CREATE TABLE douglas_:tolerance (
fid serial NOT NULL,
geom geometry(MULTILINESTRING, 3346)
);
INSERT INTO douglas_:tolerance (geom) (
SELECT
ST_Simplify (ST_LineMerge (ST_Union (geom)),
:tolerance) AS geoms
FROM
zeimena);

Binary file not shown.

BIN
II/Referatas/zeimena.gpkg Normal file

Binary file not shown.

Binary file not shown.