Convert OpenStreetMap (.osm) files to OpenDRIVE (.xodr) using SUMO netconvert with sane defaults
Project description
osm-to-xodr
Convert OpenStreetMap (.osm) files to OpenDRIVE (.xodr) using SUMO's netconvert with optimized defaults for driving simulators like CARLA.
Features
- Sane Defaults: Pre-configured netconvert parameters optimized for realistic road networks
- Traffic Sign Support: Extracts and converts traffic signs to OpenDRIVE signals
- Configurable: Settings via CLI arguments, environment variables, or
.envfile - Modern Python CLI: Built with Typer, Rich progress display, and Loguru logging
- Modular Architecture: Clean separation of concerns for easy maintenance
Requirements
- Python 3.11+
- SUMO (for
netconvertcommand)
Installing SUMO
Linux (Ubuntu/Debian):
# Stable release
sudo add-apt-repository ppa:sumo/stable
sudo apt-get update
sudo apt-get install sumo sumo-tools
# Or via Flatpak
flatpak install flathub org.eclipse.sumo
macOS / Linux:
brew tap dlr-ts/sumo
brew install sumo
Windows: Download from SUMO Downloads
Installation
Using uv (recommended)
# Install as a tool
uv tool install git+https://github.com/kallegrens/osm-to-xodr.git
# Or clone and install in development mode
git clone https://github.com/kallegrens/osm-to-xodr.git
cd osm-to-xodr
uv sync
Using pip
pip install git+https://github.com/kallegrens/osm-to-xodr.git
Quick Start
# Check if netconvert is available
osm-to-xodr check
# Convert an OSM file with defaults
osm-to-xodr convert map.osm
# Convert with custom output path
osm-to-xodr convert map.osm -o output/my_network.xodr
# Convert with verbose output
osm-to-xodr convert map.osm -v
# Generate .env configuration template
osm-to-xodr init-config
CLI Reference
osm-to-xodr convert
Convert an OpenStreetMap file to OpenDRIVE format.
Usage: osm-to-xodr convert [OPTIONS] INPUT_FILE
Arguments:
INPUT_FILE Input OpenStreetMap (.osm) file
Options:
-o, --output PATH Output OpenDRIVE (.xodr) file
-d, --output-dir PATH Output directory [default: output]
--lane-width FLOAT Default lane width in meters [default: 3.5]
--sidewalk-width FLOAT Default sidewalk width [default: 2.0]
--bikelane-width FLOAT Default bike lane width [default: 1.5]
--crossing-width FLOAT Default crossing width [default: 4.0]
--no-roundabouts Disable roundabout guessing
--no-ramps Disable ramp guessing
--no-tls Disable traffic light guessing
--no-sidewalks Don't import sidewalks
--no-crossings Don't import crossings
--no-turn-lanes Don't import turn lanes
--no-bike-access Don't import bike access
--keep-geometry Don't simplify geometry
--turnarounds Enable turnaround connections
-k, --keep-intermediate Keep intermediate files
-v, --verbose Enable verbose output
-V, --version Show version
osm-to-xodr check
Check if netconvert is available and show version information.
osm-to-xodr init-config
Generate a template .env configuration file with all available settings.
Configuration
Settings can be configured via:
- CLI arguments (highest priority)
- Environment variables with
OSM_TO_XODR_prefix .envfile in the current directory
Environment Variables
# Lane dimensions
OSM_TO_XODR_LANE_WIDTH=3.5
OSM_TO_XODR_SIDEWALK_WIDTH=2.0
OSM_TO_XODR_BIKELANE_WIDTH=1.5
OSM_TO_XODR_CROSSING_WIDTH=4.0
# Feature flags
OSM_TO_XODR_GUESS_ROUNDABOUTS=true
OSM_TO_XODR_GUESS_RAMPS=true
OSM_TO_XODR_GUESS_TLS_SIGNALS=true
OSM_TO_XODR_IMPORT_SIDEWALKS=true
OSM_TO_XODR_IMPORT_CROSSINGS=true
OSM_TO_XODR_IMPORT_TURN_LANES=true
OSM_TO_XODR_IMPORT_BIKE_ACCESS=true
OSM_TO_XODR_REMOVE_GEOMETRY=true
OSM_TO_XODR_NO_TURNAROUNDS=true
# Application settings
OSM_TO_XODR_OUTPUT_DIR=output
OSM_TO_XODR_TMP_DIR=tmp
OSM_TO_XODR_KEEP_INTERMEDIATE=false
OSM_TO_XODR_VERBOSE=false
Project Structure
osm-to-xodr/
├── src/osm_to_xodr/
│ ├── __init__.py # Package metadata
│ ├── cli.py # Typer CLI interface
│ ├── config.py # Pydantic settings
│ ├── converter.py # Main orchestration
│ ├── netconvert.py # SUMO subprocess wrapper
│ └── postprocess.py # Signal conversion
├── data/
│ ├── osm/ # Input OSM files
│ └── xodr/ # Output XODR files
├── tests/ # Pytest test suite
├── justfile # Task runner
└── pyproject.toml # Project configuration
Development
Setup
# Clone repository
git clone https://github.com/kallegrens/osm-to-xodr.git
cd osm-to-xodr
# Install with dev dependencies
uv sync --all-extras
# Install pre-commit hooks
uv run pre-commit install
Task Runner (just)
# Show available commands
just
# Run linting
just lint
# Run tests
just test
# Run tests with coverage
just test-cov
# Format code
just fmt
# Run pre-commit on all files
just pre-commit
# Test conversion with sample file
just convert-test
# Full CI pipeline
just ci
Running Tests
# Run all tests
just test
# Run unit tests only
uv run pytest -m "not integration"
# Run integration tests (requires netconvert)
uv run pytest -m integration
# With coverage
uv run pytest --cov=osm_to_xodr --cov-report=html
How It Works
The conversion process has three steps:
- Extract Traffic Signs: First netconvert pass extracts traffic sign POIs from OSM
- Generate OpenDRIVE: Second pass creates the road network with signs as objects
- Post-process Signals: Python converts
<object>elements to proper<signal>elements for CARLA compatibility
License
MIT License - See LICENSE for details.
Credits
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file osm_to_xodr-0.2.0.tar.gz.
File metadata
- Download URL: osm_to_xodr-0.2.0.tar.gz
- Upload date:
- Size: 5.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
937fb2a4ccd4b6d5d6795d9b5c5116e54ee699eb07f631f1a529c3a3218fd8ac
|
|
| MD5 |
72276ae90751fa8f3835592e3094f456
|
|
| BLAKE2b-256 |
0a4b2e13f8718a394d48c362d717bc71cf5666331bf83b31388d7e8758733df7
|
File details
Details for the file osm_to_xodr-0.2.0-py3-none-any.whl.
File metadata
- Download URL: osm_to_xodr-0.2.0-py3-none-any.whl
- Upload date:
- Size: 16.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
db3e716f89cf1dc5de918d2646e9af914314049140c824d85d4e9af41ca5560f
|
|
| MD5 |
bad495101fcec5f4ac08b5f36d75a242
|
|
| BLAKE2b-256 |
1d5be56a294d9632b8580f94e742f69168c01ab8d51e9c2eb279634af9c81750
|