Skip to main content

osmdiff

build and test

A read-only interface to OpenStreetMap change APIs and files. See also pyosm which can do similar things.

Documentation

📚 Comprehensive documentation is available at mvexel.github.io/osmdiff

Python Version Support

This module has been tested with Python 3.8 - 3.12. Use at your own risk with other versions.

Installing

pip install osmdiff

Usage

See the documentation for more details.

Reading

Retrieve the latest replication diff from the OSM API:

>>> from osmdiff import OSMChange
>>> o = OSMChange(frequency="minute")  # minute is the default frequency
>>> o.get_state()  # retrieve current sequence ID
>>> o.sequence_number
2704451
>>> o.retrieve()  # retrieve from API
>>> o
OSMChange (677 created, 204 modified, 14 deleted)

Read a replication diff from a file:

>>> from osmdiff import OSMChange
>>> o = OSMChange(file="test_osmchange.xml")
>>> o
OSMChange (831 created, 368 modified, 3552 deleted)

Retrieve the latest Augmented Diff from Overpass:

>>> from osmdiff import AugmentedDiff
>>> a = AugmentedDiff()
>>> a.get_state()
>>> a.sequence_number
2715051
>>> a.retrieve()
>>> a
AugmentedDiff (747 created, 374 modified, 55 deleted)

Read an augmented diff file:

>>> from osmdiff import AugmentedDiff
>>> a = AugmentedDiff(file="test_adiff.xml")
>>> a
AugmentedDiff (2329 created, 677 modified, 39 deleted)

Inspect contents

Get all the things that chris66 has created:

>>> [n for n in a.create if n.attribs["user"] == "chris66"]
[Node 5221564287, Node 5221564288, Node 5221564289, Node 5221564290, Node 5221564291, Node 5221564292, Node 5221564293, Node 5221564294, Node 5221564295, Node 5221564296, Node 5221564297, Node 5221564298, Node 5221564299, Node 5221564301, Node 5221564302, Node 5221564303, Node 5221564304, Way 539648222 (5 nodes), Way 539648223 (5 nodes), Way 539648323 (5 nodes)]

Get all residential ways that were modified:

>>> [n["new"] for n in a.modify if type(n["new"]) == Way and n["new"].tags.get("highway") == "residential"]
[Way 34561958 (3 nodes), Way 53744484 (6 nodes), Way 53744485 (6 nodes), Way 122650942 (3 nodes), Way 283221266 (4 nodes), Way 344272652 (5 nodes), Way 358243999 (13 nodes), Way 410489319 (5 nodes), Way 452218081 (10 nodes)]

Get all ways that were changed to residential from something else:

>>> [n["new"] for n in a.modify if type(n["new"]) == Way and n["new"].tags.get("highway") == "residential" and n["old"].tags["highway"] != "residential"]
[Way 410489319 (5 nodes), Way 452218081 (10 nodes)]

Inspect details:

>>> w = [n["new"] for n in a.modify if n["new"].attribs["id"] == "452218081"]
>>> w
[Way 452218081 (10 nodes)]
>>> w[0]
Way 452218081 (10 nodes)
>>> w[0].tags
{'highway': 'residential'}
>>> w[0].attribs
{'id': '452218081', 'version': '2', 'timestamp': '2017-11-10T13:52:01Z', 'changeset': '53667190', 'uid': '2352517', 'user': 'carths81'}
>>> w[0].attribs
{'id': '452218081', 'version': '2', 'timestamp': '2017-11-10T13:52:01Z', 'changeset': '53667190', 'uid': '2352517', 'user': 'carths81'}
>>> w[0].bounds
['12.8932677', '43.3575917', '12.8948117', '43.3585947']

Iterating

To continuously iterate over AugmentedDiff objects, use ContinuousAugmentedDiff:

>>> for a in ContinuousAugmentedDiff():
...     print(a)

This will iterate indefinitely, printing each AugmentedDiff as it is retrieved.

You can also use it in a loop:

for a in ContinuousAugmentedDiff():
    if a.sequence_number > 123456:
        break
    print(a)

Configuration

The osmdiff package uses a centralized configuration system in src/osmdiff/config.py. This includes:

API Configuration

Default settings for API endpoints and timeouts:

API_CONFIG = {
    "overpass": {"base_url": "...", "timeout": 30},
    "osm": {"base_url": "...", "timeout": 30},
    "nominatim": {"base_url": "...", "timeout": 30}
}

Request Headers

Standard headers used in all API requests:

DEFAULT_HEADERS = {
    "User-Agent": "osmdiff/1.0",
    "Accept": "application/json, text/xml"
}

Customizing Configuration

You can override any configuration value at runtime by passing parameters to the respective class constructors:

from osmdiff import OSMChange

# Override default URL and timeout
change = OSMChange(
    url="https://custom-api.example.com",
    timeout=60
)

Community

Join the conversation and get help:

Please be respectful and follow the OpenStreetMap Code of Conduct in all community interactions.

Contributing

I welcome your contributions in code, documentation and suggestions for enhancements.

Code style: black

If you find osmdiff useful, or you use it in commercial software, please consider sponsoring this project.

Metadata

Release files for osmdiff 0.4.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for osmdiff 0.4.6
File Size Uploaded
osmdiff-0.4.6.tar.gz 23.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for osmdiff 0.4.6
File Interpreter ABI Platform
osmdiff-0.4.6-py3-none-any.whl Python 3 none any Details

Total release size: 38.7 kB

Release files / osmdiff-0.4.6.tar.gz

Download URL osmdiff-0.4.6.tar.gz
Size 23.1 kB
Tags Source
SHA-256 checksum
How to use checksums
59e5f618f955d30deb7e6d355ecc798e77cd0f956fec2feb6c0448c0e09c7505
BLAKE2b-256 checksum
How to use checksums
aad3b8ef3e67844de69a3c7ce462c9fded248c7cb84a69f1970c5480248c061c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.8

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 May 4, 2025.

Transparency log

Release files / osmdiff-0.4.6-py3-none-any.whl

Download URL osmdiff-0.4.6-py3-none-any.whl
Size 15.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
73ac871813291f2a3cb64c9108fefe008d8f2774485e2bd557af252ae1def650
BLAKE2b-256 checksum
How to use checksums
8d4cc5c96a4a3d2d6eacb8a41b0075ac01a79bd38053bef45ea2e6de8067ecce
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.8

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 May 4, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

0.4.6 This release

2 release files

0.4.5

2 release files

0.4.3

2 release files

0.4.0

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.9

2 release files

0.1.8

1 release file

0.1.6

1 release file

0.1.5

1 release file

0.1.4

1 release file

0.1.3

1 release file

0.1.2

1 release file

0.1.1

1 release file

0.1

1 release file

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