Skip to main content

Build Status Coverage Status Downloads DOI Anaconda-Server Badge

Simplification

Simplify a LineString using the Ramer–Douglas–Peucker or Visvalingam-Whyatt algorithms

Line

Installation

uv add simplification OR
pip install simplification OR
conda install conda-forge::simplification

Installing for local development

  1. Ensure you have a Rust toolchain installed
  2. run uv sync --dev (this builds the extension using maturin)
  3. 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

  1. Ensure you have a Rust toolchain installed, as above
  2. 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_idx
  • cutil.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

Blue Oak Model Licence 1.0.0

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)

Source distribution for simplification 2.0.0
File Size Uploaded
simplification-2.0.0.tar.gz 1.5 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for simplification 2.0.0
File
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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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

Release history Release notifications | RSS feed

This release

2.0.0 This release

6 release files

0.7.0

21 release files

0.6.7

25 release files

0.6.6

25 release files

0.6.4

24 release files

0.6.2

19 release files

0.6.1

15 release files

0.6.0

11 release files

0.5.14

8 release files

0.5.7

12 release files

0.5.1

18 release files

0.4.4

18 release files

0.4.2

14 release files

0.3.8

16 release files

0.3.7

14 release files

0.3.3

9 release files

0.3.2

9 release files

0.2.9

14 release files

0.2.8

13 release files

0.2.7

12 release files

0.2.2

7 release files

0.2.1

7 release files

0.1.6

7 release files

0.1.2

7 release files

0.1.1

7 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page