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
- โ๏ธ Highly 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 or higher โ
- SUMO: For
netconvertcommand ๐
Installing SUMO
[!IMPORTANT] SUMO's
netconvertis required for conversion. Choose your installation method below:
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
[!TIP] Use uvx to run the tool instantly without installation โ perfect for quick conversions:
uvx osm-to-xodr convert map.osm
Install from PyPI
# With uv (recommended)
uv tool install osm-to-xodr
# Or with pip
pip install osm-to-xodr
From Source
git clone https://github.com/RISE-Dependable-Transport-Systems/osm-to-xodr.git
cd osm-to-xodr
uv sync
๐ Quick Start
1. Verify SUMO Installation
[!NOTE] This command checks if
netconvertis available and shows version information.
osm-to-xodr check
2. Convert Your First Map
# Basic conversion with optimized defaults
osm-to-xodr convert map.osm
# Custom output location
osm-to-xodr convert map.osm -o output/my_network.xodr
# Enable verbose logging
osm-to-xodr convert map.osm -v
3. (Optional) Generate Configuration Template
osm-to-xodr init-config
This creates a .env file with all available settings for customization.
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
[!TIP] CLI flags take precedence over environment variables and
.envfile settings.
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/RISE-Dependable-Transport-Systems/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
[!NOTE] Integration tests require SUMO's
netconvertto be installed and available in your PATH.
๐ง Troubleshooting
โ netconvert Not Found
[!WARNING] If you see
netconvert not founderrors:
- โ Verify SUMO is installed:
netconvert --version- โ Check that SUMO's
bindirectory is in your PATH- โ On Linux, ensure you installed
sumonot justsumo-tools
๐บ๏ธ Conversion Errors
[!TIP] If conversion fails:
- Use
--verboseflag to see detailed netconvert output- Check your OSM file is valid (open in JOSM or similar)
- Try with
--keep-intermediateto inspect intermediate.net.xmlfiles- Reduce map complexity by focusing on smaller areas
โ ๏ธ Missing Road Features
[!NOTE] If converted roads are missing expected features:
- Ensure your OSM data has proper road tags (check on OpenStreetMap.org)
- Some features require specific flags (e.g.,
--no-sidewalksdisables sidewalk import)- Use
--keep-geometryto prevent road geometry simplification
๐ 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.3.0.tar.gz.
File metadata
- Download URL: osm_to_xodr-0.3.0.tar.gz
- Upload date:
- Size: 5.9 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 |
42ce1b7a2446b25630c6274530ebaab4290bdf5928cfc6dffc6a224dc0e450b6
|
|
| MD5 |
c53b72a17bda14a452a2910610c418cd
|
|
| BLAKE2b-256 |
a4ec07ca70d091817cd73c2e9bd4948fc243a9a752f962f0da4dde6000ccfa45
|
File details
Details for the file osm_to_xodr-0.3.0-py3-none-any.whl.
File metadata
- Download URL: osm_to_xodr-0.3.0-py3-none-any.whl
- Upload date:
- Size: 19.2 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 |
d38056db9dc822063527170bd24c7acff7fc9ecf1f2a932b676289837221c0cb
|
|
| MD5 |
7ea2e99c262b74eb2b1f13a76b1b67a9
|
|
| BLAKE2b-256 |
c53ae9ff963b1bccbd82bd57588b46400183915fbd53558a2734b46282cc14e1
|