Wang–Müller line simplification algorithm in PostGIS
Go to file
Motiejus Jakštys d9472757f5 Merge branch 'gdb10lt'
This breaks "test-rivers" for Nemunas.
2021-05-19 22:57:50 +03:00
Dockerfile clean up files 2021-05-19 22:57:50 +03:00
Makefile Merge branch 'gdb10lt' 2021-05-19 22:57:50 +03:00
README.md check exaggeration operator 2021-05-19 22:57:49 +03:00
aggregate-rivers.sql Merge branch 'gdb10lt' 2021-05-19 22:57:50 +03:00
amalgamate1.png amalgamation 2021-05-19 22:57:48 +03:00
bib.bib fix bib.bib 2021-05-19 22:57:49 +03:00
db support in-container make 2021-05-19 22:57:50 +03:00
extract-and-generate gentler remove 2021-05-19 22:57:48 +03:00
in-container pre-warm matplotlib font cache 2021-05-19 22:57:50 +03:00
init.sql use smaller number of rivers during development 2021-05-19 22:57:49 +03:00
layer2img.py improve coloring of visualizations 2021-05-19 22:57:50 +03:00
mj-msc.tex bring back removed subsection 2021-05-19 22:57:50 +03:00
notes.txt self-crossing bugfix 2021-05-19 22:57:47 +03:00
rivers.sql Merge branch 'gdb10lt' 2021-05-19 22:57:50 +03:00
slides-2021-03-29.txt remove demo 2021-05-19 22:57:46 +03:00
test-rivers.sql separate visuals from integration tests 2021-05-19 22:57:50 +03:00
test.sql add isolated-1-before 2021-05-19 22:57:50 +03:00
vars.awk exaggeration step and visuals 2021-05-19 22:57:50 +03:00
visuals.sql Merge branch 'gdb10lt' 2021-05-19 22:57:50 +03:00
vu.pdf add generated vu.pdf 2021-05-19 22:57:49 +03:00
wang125.png add wang125 2021-05-19 22:57:50 +03:00
wm.sql Merge branch 'gdb10lt' 2021-05-19 22:57:50 +03:00

README.md

WangMüller algorithm in PostGIS

This is a work-in-progress implementation following "Line generalization based on analysis of shape characteristics" by Wang and Müller, 1998.

Structure

There will be 2 deliverables from this folder:

  • wm.sql, the implementation.
  • paper mj-msc-full.pdf, a MSc thesis, explaining it.

It contains a few supporting files, notably:

  • tests.sql synthetic unit tests.
  • test-rivers.sql tests with real rivers.
  • Makefile glues everything together.
  • layer2img.py converts a PostGIS layer to an embeddable image.
  • aggregate-rivers.sql combines multiple river objects (linestrings or multilinestrings) to a single one.
  • init.sql initializes PostGIS database for running the tests.
  • rivers.sql is an OpenStreetMap snapshot of select rivers (Makefile contains code to update them).
  • ... and a few more files necessary to build the paper.

Running

make help lists the select commands for humans. As of writing:

# make help
mj-msc-full.pdf    Thesis for publishing
test               Unit tests (fast)
test-rivers        Rivers tests (slow)
clean              Clean the current working directory
clean-tables       Remove tables created during unit or rivers tests
help               Print this help message
wc                 Character and page count
refresh-rivers     Refresh rivers.sql from Open Street Maps

To execute the algorithm, run:

  • make test for tests with synthetic data.
  • make test-rivers for tests with real rivers. You may adjust the rivers and data source (e.g. use a different country instead of Lithuania) by changing the Makefile and the test files. Left as an exercise for the reader.

Building the paper (pdf)

# make -j$(nproc) mj-msc-full.pdf

mj-msc.tex results in mj-msc-full.pdf, which will be at some point published. It needs quite a few dependencies, including a functioning Docker environment, postgresql client, geopandas, pygments, osm2pgsql, poppler, and a "quite extensive" LaTeX installation. This was tested on Debian 11.

Contributing

Please reach out to me before contributing. As of writing, this is not ready to accept broader contributions, TODO:

  • Elimination operator.
  • Exaggeration operator.
  • Combination operator.
  • CI.
  • Known bug in wm_self_crossing: the program crashes with a river in Lithuania.

License

GPL 2.0 or later, same as PostGIS.