parent
485c1479ec
commit
3d0adae810
38
Makefile
38
Makefile
|
@ -1,5 +1,5 @@
|
||||||
SOURCE ?= lithuania-latest.osm.pbf
|
OSM ?= lithuania-latest.osm.pbf
|
||||||
WHERE ?= name='Visinčia' OR name='Šalčia' OR name='Nemunas' OR name='Žeimena' OR name='Lakaja'
|
WHERE ?= name='Visinčia' OR name='Šalčia' OR name='Nemunas'
|
||||||
#WHERE ?= name like '%'
|
#WHERE ?= name like '%'
|
||||||
SLIDES = slides-2021-03-29.pdf
|
SLIDES = slides-2021-03-29.pdf
|
||||||
|
|
||||||
|
@ -112,7 +112,8 @@ selfcrossing-1-after_1SELECT = wm_debug where name='selfcrossing-1' AND stage='d
|
||||||
selfcrossing-1-after_2SELECT = wm_debug where name='selfcrossing-1' AND stage='bbends' AND gen=1
|
selfcrossing-1-after_2SELECT = wm_debug where name='selfcrossing-1' AND stage='bbends' AND gen=1
|
||||||
selfcrossing-1-after_2LINESTYLE = invisible
|
selfcrossing-1-after_2LINESTYLE = invisible
|
||||||
|
|
||||||
.faux_test-integration: tests-integration.sql wm.sql .faux_aggregate-rivers
|
|
||||||
|
.faux_test-integration: tests-integration.sql wm.sql .faux_db
|
||||||
./db -f $<
|
./db -f $<
|
||||||
touch $@
|
touch $@
|
||||||
|
|
||||||
|
@ -122,18 +123,7 @@ selfcrossing-1-after_2LINESTYLE = invisible
|
||||||
|
|
||||||
.faux_db: db init.sql
|
.faux_db: db init.sql
|
||||||
./db start
|
./db start
|
||||||
./db -f init.sql
|
./db -f init.sql -f rivers.sql
|
||||||
touch $@
|
|
||||||
|
|
||||||
$(SOURCE):
|
|
||||||
wget http://download.geofabrik.de/europe/$@
|
|
||||||
|
|
||||||
.faux_aggregate-rivers: aggregate-rivers.sql .faux_import-osm Makefile
|
|
||||||
./db -v where="$(WHERE)" -f $<
|
|
||||||
touch $@
|
|
||||||
|
|
||||||
.faux_import-osm: $(SOURCE) .faux_db
|
|
||||||
PGPASSWORD=osm osm2pgsql -c --multi-geometry -H 127.0.0.1 -d osm -U osm $<
|
|
||||||
touch $@
|
touch $@
|
||||||
|
|
||||||
################################
|
################################
|
||||||
|
@ -155,7 +145,7 @@ slides-2021-03-29.pdf: slides-2021-03-29.txt
|
||||||
pandoc -t beamer -i $< -o $@
|
pandoc -t beamer -i $< -o $@
|
||||||
|
|
||||||
dump-debug_wm.sql.xz:
|
dump-debug_wm.sql.xz:
|
||||||
docker exec -ti wm-mj pg_dump -Uosm osm -t debug_wm | xz -v > $@
|
docker exec -ti wm-mj pg_dump -Uosm osm -t wm_devug | xz -v > $@
|
||||||
|
|
||||||
mj-msc-gray.pdf: mj-msc.pdf
|
mj-msc-gray.pdf: mj-msc.pdf
|
||||||
gs \
|
gs \
|
||||||
|
@ -171,7 +161,7 @@ mj-msc-gray.pdf: mj-msc.pdf
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean: ## Clean the current working directory
|
clean: ## Clean the current working directory
|
||||||
-./db stop
|
-./db stop
|
||||||
-rm -r .faux_test .faux_aggregate-rivers .faux_import-osm .faux_db \
|
-rm -r .faux_test .faux_aggregate-rivers .faux_db \
|
||||||
version.inc.tex vars.inc.tex version.aux version.fdb_latexmk \
|
version.inc.tex vars.inc.tex version.aux version.fdb_latexmk \
|
||||||
_minted-mj-msc \
|
_minted-mj-msc \
|
||||||
$(shell git ls-files -o mj-msc*) \
|
$(shell git ls-files -o mj-msc*) \
|
||||||
|
@ -186,3 +176,17 @@ clean-tables: ## Remove tables created during unit or integration tests
|
||||||
.PHONY: help
|
.PHONY: help
|
||||||
help: ## Print this help message
|
help: ## Print this help message
|
||||||
@awk -F':.*?## ' '/^[a-z0-9.-]*: *.*## */{printf "%-18s %s\n",$$1,$$2}' $(MAKEFILE_LIST)
|
@awk -F':.*?## ' '/^[a-z0-9.-]*: *.*## */{printf "%-18s %s\n",$$1,$$2}' $(MAKEFILE_LIST)
|
||||||
|
|
||||||
|
$(OSM):
|
||||||
|
wget http://download.geofabrik.de/europe/$@
|
||||||
|
|
||||||
|
.PHONY: refresh-rivers
|
||||||
|
refresh-rivers: aggregate-rivers.sql $(OSM) .faux_db ## Refresh rivers.sql from Open Street Maps
|
||||||
|
PGPASSWORD=osm osm2pgsql -c --multi-geometry -H 127.0.0.1 -d osm -U osm $(OSM)
|
||||||
|
./db -v where="$(WHERE)" -f $<
|
||||||
|
(\
|
||||||
|
echo '-- Generated at $(shell TZ=UTC date +"%FT%TZ") on $(shell whoami)@$(shell hostname -f)'; \
|
||||||
|
echo '-- Select: $(WHERE)'; \
|
||||||
|
docker exec -ti wm-mj pg_dump --clean -Uosm osm -t wm_rivers | tr -d '\r' \
|
||||||
|
) > rivers.sql.tmp
|
||||||
|
mv rivers.sql.tmp rivers.sql
|
||||||
|
|
24
layer2img.py
24
layer2img.py
|
@ -6,14 +6,25 @@ import matplotlib.pyplot as plt
|
||||||
|
|
||||||
from matplotlib import rc
|
from matplotlib import rc
|
||||||
|
|
||||||
# CMAP = 'Set3' # this is nice too
|
# CMAP = 'Set3' # is nice too
|
||||||
CMAP = 'tab20c'
|
CMAP = 'tab20c'
|
||||||
|
|
||||||
BOUNDS = ('xmin', 'ymin', 'xmax', 'ymax')
|
BOUNDS = ('xmin', 'ymin', 'xmax', 'ymax')
|
||||||
|
INCH = 25.4 # mm
|
||||||
BLACK, GREEN, ORANGE, PURPLE = '#000000', '#1b9e77', '#d95f02', '#7570b3'
|
BLACK, GREEN, ORANGE, PURPLE = '#000000', '#1b9e77', '#d95f02', '#7570b3'
|
||||||
PSQL_CREDS = "host=127.0.0.1 dbname=osm user=osm password=osm"
|
PSQL_CREDS = "host=127.0.0.1 dbname=osm user=osm password=osm"
|
||||||
|
|
||||||
|
|
||||||
|
def plt_size(string):
|
||||||
|
if not string:
|
||||||
|
return None
|
||||||
|
try:
|
||||||
|
w, h = string.split("x")
|
||||||
|
return float(w) / INCH, float(h) / INCH
|
||||||
|
except Exception as e:
|
||||||
|
raise argparse.ArgumentTypeError from e
|
||||||
|
|
||||||
|
|
||||||
def parse_args():
|
def parse_args():
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description='Convert geopackage to an image')
|
description='Convert geopackage to an image')
|
||||||
|
@ -34,6 +45,11 @@ def parse_args():
|
||||||
|
|
||||||
parser.add_argument('-o', '--outfile', metavar='<file>')
|
parser.add_argument('-o', '--outfile', metavar='<file>')
|
||||||
parser.add_argument('--clip', type=float, nargs=4, metavar=BOUNDS)
|
parser.add_argument('--clip', type=float, nargs=4, metavar=BOUNDS)
|
||||||
|
parser.add_argument(
|
||||||
|
'--size',
|
||||||
|
type=plt_size,
|
||||||
|
help='Figure size in mm (WWxHH)',
|
||||||
|
)
|
||||||
return parser.parse_args()
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
@ -44,19 +60,19 @@ def read_layer(select):
|
||||||
sql = "SELECT way FROM %s" % select
|
sql = "SELECT way FROM %s" % select
|
||||||
return geopandas.read_postgis(sql, con=conn, geom_col='way')
|
return geopandas.read_postgis(sql, con=conn, geom_col='way')
|
||||||
|
|
||||||
|
|
||||||
def plot_args(color, maybe_cmap, maybe_linestyle):
|
def plot_args(color, maybe_cmap, maybe_linestyle):
|
||||||
if maybe_cmap:
|
if maybe_cmap:
|
||||||
r = {'cmap': CMAP}
|
r = {'cmap': CMAP}
|
||||||
else:
|
else:
|
||||||
r = {'color': color}
|
r = {'color': color}
|
||||||
|
|
||||||
if maybe_linestyle == 'invisible':
|
if maybe_linestyle == 'invisible':
|
||||||
r['color'] = (0, 0, 0, 0)
|
r['color'] = (0, 0, 0, 0)
|
||||||
elif maybe_linestyle:
|
elif maybe_linestyle:
|
||||||
r['linestyle'] = maybe_linestyle
|
r['linestyle'] = maybe_linestyle
|
||||||
|
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
args = parse_args()
|
args = parse_args()
|
||||||
group1 = read_layer(args.group1_select)
|
group1 = read_layer(args.group1_select)
|
||||||
|
@ -69,6 +85,8 @@ def main():
|
||||||
rc('text', usetex=True)
|
rc('text', usetex=True)
|
||||||
fig, ax = plt.subplots()
|
fig, ax = plt.subplots()
|
||||||
fig.set_figwidth(8.27 / args.widthdiv)
|
fig.set_figwidth(8.27 / args.widthdiv)
|
||||||
|
if args.size:
|
||||||
|
fig.set_size_inches(args.size)
|
||||||
if c := args.clip:
|
if c := args.clip:
|
||||||
ax.set_xlim(left=c[0], right=c[2])
|
ax.set_xlim(left=c[0], right=c[2])
|
||||||
ax.set_ylim(bottom=c[1], top=c[3])
|
ax.set_ylim(bottom=c[1], top=c[3])
|
||||||
|
|
15
mj-msc.tex
15
mj-msc.tex
|
@ -32,6 +32,14 @@
|
||||||
\newcommand{\MYTITLE}{Cartographic Generalization of Lines using free software (example of rivers)}
|
\newcommand{\MYTITLE}{Cartographic Generalization of Lines using free software (example of rivers)}
|
||||||
\newcommand{\MYAUTHOR}{Motiejus Jakštys}
|
\newcommand{\MYAUTHOR}{Motiejus Jakštys}
|
||||||
|
|
||||||
|
\iffalse
|
||||||
|
a4: 210x297mm
|
||||||
|
a5: 148x210mm
|
||||||
|
a6: 105x148xmm
|
||||||
|
a7: 74x105mm
|
||||||
|
a8: 52x74mm
|
||||||
|
\fi
|
||||||
|
|
||||||
\title{\MYTITLE}
|
\title{\MYTITLE}
|
||||||
\author{\MYAUTHOR}
|
\author{\MYAUTHOR}
|
||||||
\date{\VCDescribe}
|
\date{\VCDescribe}
|
||||||
|
@ -140,9 +148,10 @@ Both algorithms are part of PostGIS, a free-software GIS suite:
|
||||||
\href{https://postgis.net/docs/ST_SimplifyVW.html}{PostGIS SimplifyVW}.
|
\href{https://postgis.net/docs/ST_SimplifyVW.html}{PostGIS SimplifyVW}.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
Since both algorithms produce jagged output lines, it is worthwhile to process
|
Examples of <TBD Chaikin and others>
|
||||||
those through a widely available Chaikin's line smoothing
|
|
||||||
algorithm \cite{chaikin1974algorithm} via
|
It may be worthwhile to post-process those through a widely available Chaikin's
|
||||||
|
line smoothing algorithm \cite{chaikin1974algorithm} via
|
||||||
\href{https://postgis.net/docs/ST_ChaikinSmoothing.html}{PostGIS
|
\href{https://postgis.net/docs/ST_ChaikinSmoothing.html}{PostGIS
|
||||||
ChaikinSmoothing}.
|
ChaikinSmoothing}.
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue