Simplification
Simplify a LineString using the Ramer–Douglas–Peucker or Visvalingam-Whyatt algorithms
Installation
uv add simplification OR
pip install simplification OR
conda install conda-forge::simplification
Installing for local development
- Ensure you have a Rust toolchain installed
- run
uv sync --dev(this builds the extension using maturin) - run
uv run pytest
Changes to Cargo.toml, Cargo.lock, or any .rs file will bust the cache, triggering a rebuild when uv commands are run.
Building SDist and Wheels
- Ensure you have a Rust toolchain installed, as above
- Run
uv build --sdist --wheel
Supported Python Versions
Simplification supports all currently supported Python versions.
Binary wheels target the CPython Stable ABI (abi3): a single abi3 wheel per platform covers CPython 3.11 and later.
Supported Platforms
- Linux (
manylinux-compatible) x86_64 and aarch64 - macOS Darwin x86_64 and arm64
- Windows 64-bit
Usage
from simplification.cutil import (
simplify_coords,
simplify_coords_idx,
simplify_coords_vw,
simplify_coords_vw_idx,
simplify_coords_vwp,
)
# Using Ramer–Douglas–Peucker
coords = [
[0.0, 0.0],
[5.0, 4.0],
[11.0, 5.5],
[17.3, 3.2],
[27.8, 0.1]
]
# For RDP, Try an epsilon of 1.0 to start with. Other sensible values include 0.01, 0.001
simplified = simplify_coords(coords, 1.0)
# simplified is [[0.0, 0.0], [5.0, 4.0], [11.0, 5.5], [27.8, 0.1]]
# Using Visvalingam-Whyatt
# You can also pass numpy arrays, in which case you'll get numpy arrays back
import numpy as np
coords_vw = np.array([
[5.0, 2.0],
[3.0, 8.0],
[6.0, 20.0],
[7.0, 25.0],
[10.0, 10.0]
])
simplified_vw = simplify_coords_vw(coords_vw, 30.0)
# simplified_vw is [[5.0, 2.0], [7.0, 25.0], [10.0, 10.0]]
Passing empty and/or 1-element lists will return them unaltered.
Coordinates must be a sequence of (x, y) pairs, or an (N, 2) array. Anything else (including (N, 3) arrays) raises a ValueError.
But I only want the simplified Indices
simplification now has:
cutil.simplify_coords_idxcutil.simplify_coords_vw_idx
The values returned by these functions are the retained indices. In order to use them as e.g. a masked array in Numpy, something like the following will work:
import numpy as np
from simplification.cutil import simplify_coords_idx
# assume an array of coordinates: orig
simplified = simplify_coords_idx(orig, 1.0)
# build new geometry using only retained coordinates
orig_simplified = orig[simplified]
But I need to ensure that the resulting geometries are valid
You can use the topology-preserving variant of VW for this: simplify_coords_vwp. It's slower, but has a far greater likelihood of producing a valid geometry.
But I Want to Simplify Polylines
No problem; Decode them to LineStrings first.
# pip install pypolyline before you do this
from pypolyline.cutil import decode_polyline
# an iterable of Google-encoded Polylines, so precision is 5. For OSRM &c., it's 6
decoded = (decode_polyline(line, 5) for line in polylines)
simplified = [simplify_coords(line, 1.0) for line in decoded]
How it Works
PyO3 bindings to the simplification algorithms in the Rust geo crate. The GIL is released while simplifying.
Is It Fast
I should think so.
What does that mean
Using numpy arrays for input and output, the library can be reasonably expected to process around 2500 1000-point LineStrings per second on a Core i7 or equivalent, for a 98%+ reduction in size.
A larger LineString, containing 200k+ points can be reduced to around 3k points (98.5%+) in around 50ms using RDP.
This is based on a test harness available here.
Disclaimer
All benchmarks are subjective, and pathological input will greatly increase processing time. Error-checking is non-existent at this point.
License
Citing Simplification
If Simplification has been significant in your research, and you would like to acknowledge the project in your academic publication, we suggest citing it as follows (example in APA style, 7th edition):
Hügel, S. (2021). Simplification (Version X.Y.Z) [Computer software]. https://doi.org/10.5281/zenodo.5774852
In Bibtex format:
@software{Hugel_Simplification_2021,
author = {Hügel, Stephan},
doi = {10.5281/zenodo.5774852},
license = {MIT},
month = {12},
title = {{Simplification}},
url = {https://github.com/urschrei/simplification},
version = {X.Y.Z},
year = {2021}
}
Metadata
Release files for simplification 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| simplification-2.0.0.tar.gz | 1.5 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| simplification-2.0.0-cp311-abi3-win_amd64.whl | CPython 3.11 | abi3 | Windows x86-64 | Details |
| simplification-2.0.0-cp311-abi3-manylinux_2_28_x86_64.whl | CPython 3.11 | abi3 | Linux glibc 2.28+ x86-64 | Details |
| simplification-2.0.0-cp311-abi3-manylinux_2_28_aarch64.whl | CPython 3.11 | abi3 | Linux glibc 2.28+ ARM64 | Details |
| simplification-2.0.0-cp311-abi3-macosx_11_0_x86_64.whl | CPython 3.11 | abi3 | macOS 11.0+ x86-64 | Details |
| simplification-2.0.0-cp311-abi3-macosx_11_0_arm64.whl | CPython 3.11 | abi3 | macOS 11.0+ ARM64 | Details |
Total release size: 2.6 MB
Release files / simplification-2.0.0.tar.gz
| Download URL | simplification-2.0.0.tar.gz |
|---|---|
| Size | 1.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6d176fda192035339cf891f46737a10d8260433ab04fa150a3a231d37c80789d
|
|
BLAKE2b-256 checksum How to use checksums |
0d2324c7dfa6d2fe07dc33f2e094c4d7bde3447469e3c743a7404967f18fd934
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.
Transparency logRelease files / simplification-2.0.0-cp311-abi3-win_amd64.whl
| Download URL | simplification-2.0.0-cp311-abi3-win_amd64.whl |
|---|---|
| Size | 176.9 kB |
| Tags | CPython 3.11 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
aecb481a2466f783969b604c743475b707dc51c10ceb1a1c9fa6bf1157ea1492
|
|
BLAKE2b-256 checksum How to use checksums |
b8c3c022bd6d1f01f9c4f1706eb7d75f487293e3742320da25e18003bc869bbe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.
Transparency logRelease files / simplification-2.0.0-cp311-abi3-manylinux_2_28_x86_64.whl
| Download URL | simplification-2.0.0-cp311-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 254.3 kB |
| Tags | CPython 3.11 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
a07a0773a48a63d57c19f223aea5f89598f6c7409212413f9485349914fb3cb7
|
|
BLAKE2b-256 checksum How to use checksums |
115a2e1466fb015e7b1ab6f676b8985c4b0c7f15c1a39547d6d5e3ad8572148c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.
Transparency logRelease files / simplification-2.0.0-cp311-abi3-manylinux_2_28_aarch64.whl
| Download URL | simplification-2.0.0-cp311-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 242.1 kB |
| Tags | CPython 3.11 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
2afc7c43a6562291994c0a568d077aeb08eff992e343c1c91400b5a6c414a3e7
|
|
BLAKE2b-256 checksum How to use checksums |
369942fc49762cb3a0d01a310007b9fec9687af05c565d05d56eb0073d02c155
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.
Transparency logRelease files / simplification-2.0.0-cp311-abi3-macosx_11_0_x86_64.whl
| Download URL | simplification-2.0.0-cp311-abi3-macosx_11_0_x86_64.whl |
|---|---|
| Size | 244.4 kB |
| Tags | CPython 3.11 abi3 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
c55f089a0f79c5568c8ce4c6741155c5f1c22b6074298912910d6bbe55cbd1e7
|
|
BLAKE2b-256 checksum How to use checksums |
78ae8215562ca00673cf91878ff7852173970dfe12a382d17d8176f75b50ae62
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.
Transparency logRelease files / simplification-2.0.0-cp311-abi3-macosx_11_0_arm64.whl
| Download URL | simplification-2.0.0-cp311-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 234.9 kB |
| Tags | CPython 3.11 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
f49f0460a42b4255106962e3c8f94598bba2662cae1710c0960d0c77ed37435d
|
|
BLAKE2b-256 checksum How to use checksums |
946b8ee0c271be942473429fee75426c3c75a1033ed20b2a6715107a56346965
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.
Transparency log