Package: simplification
SimplificationSimplify a LineString using theRamer–Douglas–PeuckerorVisvalingam-WhyattalgorithmsInstallationpip install simplificationInstalling for local developmentEnsure you have a copy oflibrdpfromhttps://github.com/urschrei/rdp/releases, and it's in thesrc/simplificationsubdirrunpip install -e .[test] --use-pep517runpytest .Supported Python Versions (Linux x86_64 + aarch64, macOS x86_64 + arm64, Windows amd64)Python 3.8Python 3.9Python 3.10Python 3.11Python 3.12Supported PlatformsLinux (manylinux-compatible) x86_64 and aarch64macOS Darwin x86_64 and arm64Windows 64-bitUsagefromsimplification.cutilimport(simplify_coords,simplify_coords_idx,simplify_coords_vw,simplify_coords_vw_idx,simplify_coords_vwp,)# Using Ramer–Douglas–Peuckercoords=[[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.001simplified=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 backimportnumpyasnpcoords_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.But I only want the simplifiedIndicessimplificationnow has:cutil.simplify_coords_idxcutil.simplify_coords_vw_idxThe values returned by these functions are theretainedindices. In order to use them as e.g. amasked arrayin 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 validYou can use the topology-preserving variant ofVWfor this:simplify_coords_vwp. It's slower, but has a far greater likelihood of producing a valid geometry.But I Want to Simplify PolylinesNo problem;Decode them to LineStringsfirst.# pip install pypolyline before you do thisfrompypolyline.cutilimportdecode_polyline# an iterable of Google-encoded Polylines, so precision is 5. For OSRM &c., it's 6decoded=(decode_polyline(line,5)forlineinpolylines)simplified=[simplify_coords(line,1.0)forlineindecoded]How it WorksFFI and aRust binaryIs It FastI should think so.What does that meanUsingnumpyarrays 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 availablehere.DisclaimerAll benchmarks are subjective, and pathological input will greatly increase processing time. Error-checking is non-existent at this point.LicenseMITCitingSimplificationIf 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.5774852In 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}
}