Parse OSM and Overpass JSON/XML to GeoJSON with Python.
This library is under development!
pip install osm2geojsonConvert OSM/Overpass data to GeoJSON using one of four main functions:
import osm2geojson
# From Overpass JSON
geojson = osm2geojson.json2geojson(overpass_json)
# From OSM/Overpass XML
geojson = osm2geojson.xml2geojson(osm_xml)
# To Shape objects (Shapely geometries + properties)
shapes = osm2geojson.json2shapes(overpass_json)
shapes = osm2geojson.xml2shapes(osm_xml)After installation, use as a command-line tool:
osm2geojson --help
# or
python -m osm2geojson --helpConvert Overpass JSON to GeoJSON FeatureCollection.
Convert OSM/Overpass XML to GeoJSON FeatureCollection.
Convert Overpass JSON to Shape objects (Shapely geometry + properties).
Convert OSM/Overpass XML to Shape objects.
All conversion functions accept these optional parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
filter_used_refs |
bool | True |
Filter unused references (False returns all geometry) |
log_level |
str | 'ERROR' |
Logging level ('DEBUG', 'INFO', 'WARNING', 'ERROR') |
area_keys |
dict | None |
Custom area key definitions (defaults from areaKeys.json) |
polygon_features |
list | None |
Custom polygon feature whitelist/blacklist (defaults from polygon-features.json) |
raise_on_failure |
bool | False |
Raise exception on geometry conversion failure |
Execute Overpass API query (with 5 automatic retries).
result = osm2geojson.overpass_call('[out:json];node(50.746,7.154,50.748,7.157);out;')Convert Shape object to GeoJSON Feature.
feature = osm2geojson.shape_to_feature(
shape_obj=shapely_shape_object,
properties={'custom': 'property'}
)Shape objects are dictionaries containing Shapely geometry and OSM properties:
{
'shape': Point | LineString | Polygon, # Shapely geometry
'properties': {
'type': 'node' | 'way' | 'relation',
'tags': { ... }, # OSM tags
'id': 123,
...
}
}import osm2geojson
with open('data.osm', 'r', encoding='utf-8') as f:
xml = f.read()
geojson = osm2geojson.xml2geojson(xml, filter_used_refs=False, log_level='INFO')
# Returns: { "type": "FeatureCollection", "features": [ ... ] }import json
import osm2geojson
with open('overpass.json', 'r', encoding='utf-8') as f:
data = json.load(f)
shapes = osm2geojson.json2shapes(data)
# Returns: [ { "shape": <Shapely geometry>, "properties": {...} }, ... ]
# Access geometry and properties
for shape_obj in shapes:
geometry = shape_obj['shape'] # Shapely object
osm_tags = shape_obj['properties']['tags']
print(f"Type: {geometry.geom_type}, Tags: {osm_tags}")import osm2geojson
# Overpass QL query
query = """
[out:json];
(
node["amenity"="restaurant"](50.746,7.154,50.748,7.157);
way["amenity"="restaurant"](50.746,7.154,50.748,7.157);
);
out body geom;
"""
result = osm2geojson.overpass_call(query)
geojson = osm2geojson.json2geojson(result)# Clone with submodules
git clone --recurse-submodules https://github.com/aspectumapp/osm2geojson.git
cd osm2geojson
# One-command setup (installs deps + pre-commit hooks)
make setupmake format # Auto-format code with Ruff
make lint # Check code quality
make test # Run tests with pytest
make all # Run all checks (do this before committing!)# Single test (unittest-style class)
pytest tests/test_main.py::TestOsm2GeoJsonMethods::test_barrier_wall -vv
# Test file
pytest tests/test_main.py -vv
# By pattern
pytest -k barrier -vv
# With coverage
make test-coverage./update-osm-polygon-features.shSee RELEASE_GUIDE.md for the release process.
Quick version bump:
./bump_version.sh 0.3.0 # Updates version, commits, and tags
git push origin master --tags
# Then create GitHub Release to publish to PyPISee CONTRIBUTING.md for detailed development guidelines.
- CONTRIBUTING.md - Development setup, workflow, and guidelines
- AI_AGENT_GUIDE.md - Comprehensive guide for AI coding assistants
- MIGRATION_NOTES.md - Guide for migrating from old setup
- RELEASE_GUIDE.md - Release process for maintainers
osm2geojson/
├── osm2geojson/ # Main package
│ ├── main.py # Core conversion logic
│ ├── parse_xml.py # XML parsing
│ ├── helpers.py # Helper functions
│ └── __main__.py # CLI interface
├── tests/ # Test suite
├── pyproject.toml # Project config (deps, tools)
├── Makefile # Development commands
└── README.md # This file
- Python: 3.8+
- Shapely: Geometric operations
- Requests: Overpass API calls
- Ruff: Fast linting & formatting
- pytest: Modern testing framework
- mypy: Type checking
Developed by rapkin
Uses data from:
- osm-polygon-features - Polygon feature definitions
- id-area-keys - Area key definitions
- Rewrite _convert_shapes_to_multipolygon (and other multipolygon methods) to support complex situations with enclaves
- Add tests and examples for cli tool
- Add actions related to cli tool (more info #32 (comment))