Wang–Müller line simplification algorithm in PostGIS
Go to file
Motiejus Jakštys 2c7be0989a split bendattrs to bends and attrs
this makes code easier to reason about, and some lines shorter (thus
removing splitting requirement).
2021-05-19 22:57:50 +03:00
aggregate-rivers.sql labeled code listings 2021-05-19 22:57:49 +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
Dockerfile clean up files 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
Makefile raising notices 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
README.md check exaggeration operator 2021-05-19 22:57:49 +03:00
rivers.sql separate visuals from integration tests 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 exaggeration step and visuals 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 split bendattrs to bends and attrs 2021-05-19 22:57:50 +03:00

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.