Wang–Müller algorithm in PostGIS
This is Wang–Müller line generalization algorithm implementation in PostGIS. Following "Line generalization based on analysis of shape characteristics" by the same author, 1998.
Status
It mostly works. Read mj-msc-full.pdf for visual examples and possible
gotchas.
Structure
There are be 2 deliverables:
wm.sql, the implementation.- paper
mj-msc-full.pdf, a MSc thesis, explaining it.
It contains a few supporting files, notably:
tests.sqlsynthetic unit tests.test-rivers.sqltests with real rivers.Makefileglues everything together.layer2img.pyconverts a PostGIS layer to an embeddable image.aggregate-rivers.sqlcombines multiple river objects (linestrings or multilinestrings) to a single one.init.sqlinitializes PostGIS database for running the tests.rivers-*.sqlare national dataset snapshots of rivers (Makefilecontains 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 testfor tests with synthetic data.make test-riversfor tests with real rivers. You may adjust the rivers and data source (e.g. use a different country instead of Lithuania) by changing theMakefileand the test files. Left as an exercise for the reader.
N.B. the make test-rivers fails (see test-rivers.sql), because with higher
dhalfcircle values, the unionized river (salvis) is going on top of itself,
making the resulting geometry invalid.
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 to this repo. It needs quite a few dependencies, including a
functioning Docker environment, postgresql client, geopandas, pygments,
osm2pgsql, poppler, and a "quite extensive" LaTeX installation. Tested on
Debian 11.
Contributing
This repository is frozen and will not accept contributions. Please fork it. If fork has improved the algorithm substantially, feel free to ping me, I will link to it in this README.
Credit
Nacionalinė Žemės Tarnyba for the river data sets.
License
GPLv2 or later.
