High-resolution maps created from open data for self-localization of autonomous vehicles
openHDMap is a Qt-based desktop application for downloading, generating, visualizing, and exporting HD map data. The project combines a native GUI, geospatial processing, and a plugin architecture for download and export workflows.
Current release version: 0.1
- Interactive desktop GUI for map-centric workflows
- Download plugins for supported regional open-data sources
- Terrain, building, and vegetation processing based on GDAL, PDAL, VTK, and mlpack
- Export plugins for point-cloud and mesh output
- Automated test suite
Short demonstration of the openHDMap workflow and user interaction.
openHDMap.mp4
Direct link: video/openHDMap.mp4
This video shows multiple tiles generated by openHDMap as point clouds and merged into one larger point-cloud map. Localization in this PCD map is performed with ICP.
- Red arrow: ICP pose
- Green arrow: RTK-GNSS pose
- Yellow points: current lidar scan from an Ouster OS1-64
No additional preprocessing was applied to the lidar points, which is also apparent in the video. Further details about the localization process are provided in the paper.
Localization_openHDMap_short.mp4
Direct link: video/Localization_openHDMap.mp4
src/- Application sourcessrc/core/- Processing, mesh generation, parsing, worker pool, plugin handlingsrc/gui/- Main windows and Qt widgetssrc/plugins/- Download and export pluginssrc/utils/- Dialogs, defaults, and shared helpersresources/- Icons, styles, and Qt resourcestests/- Qt-based unit and integration testsDockerfile.22.04- Ubuntu 22.04 container buildrun_local.sh- Convenience launcher for local buildsrun_docker_gui.sh- Interactive Docker launcher with host X11run_docker_virtual.sh- Headless Docker validation launcher
The build uses CMake and C++17 and expects these libraries and tools to be available:
- Qt5 Core, Widgets, Network, Gui, WebEngineWidgets, WebChannel, and Concurrent
- GDAL
- PDAL
- PROJ
- VTK
- Eigen3
- OpenMP
- mlpack
- Armadillo
- Boost.Serialization
unzippkg-configg++- Optional: Docker
If CMake cannot find Qt WebEngine, PDAL, or another dependency, point it at the correct installation with CMAKE_PREFIX_PATH or the package-specific *_DIR variable.
sudo apt update
sudo apt install \
cmake g++ pkg-config unzip \
qtbase5-dev qt5-qmake qtbase5-dev-tools qtchooser qtwebengine5-dev \
libgdal-dev libpdal-dev pdal libproj-dev libvtk9-dev libeigen3-dev \
libmlpack-dev libarmadillo-dev libboost-serialization-devClone the repository from GitHub and enter the project directory:
git clone https://github.com/hscoburg/openHDMap.git
cd openHDMapcmake -S . -B build
cmake --build build -j$(nproc)Use the built binary directly:
./build/openHDMapOr use the convenience script, which configures and builds automatically if needed:
./run_local.shYou can override the build directory with OPENHDMAP_BUILD_DIR.
Run the full test suite with:
ctest --test-dir build --output-on-failureIf you run the tests from VS Code installed via Snap, the CTest configuration clears GTK_PATH automatically to avoid incompatible GTK module injection.
Build the container image:
docker build -f Dockerfile.22.04 -t openhdmap:22.04 .Smoke-test the startup path without relying on a host display:
./run_docker_virtual.sh --smoke-test
./run_docker_gui.sh --smoke-testRun the application interactively with host X11 forwarding:
./run_docker_gui.shRun a headless validation on a virtual display:
./run_docker_virtual.shNotes:
run_docker_gui.shis the user-facing mode for interactive use.run_docker_virtual.shis intended for smoke tests, CI, and headless validation. It starts the GUI on a virtual display, but it is not a practical end-user interaction mode.- Install
xhoston the host for GUI Docker runs:sudo apt install x11-xserver-utils. - Docker builds and runs require access to the Docker daemon.
- QtWebEngine inside the container uses Chromium with
--no-sandboxbecause the application runs as root in the container. - Docker working data is stored persistently on the host in
~/openHDMap-databy default. Override this withOPENHDMAP_DATA_DIRif you want a different host-visible directory.
The application discovers plugins at runtime through Qt plugin metadata and dedicated plugin directories below the executable.
Download plugins implement IDownloadPlugin and handle acquisition and conversion of source datasets such as DGM1 and LOD2.
Export plugins implement IExportPlugin and provide output formats for processed geometry and point-cloud data.
A more detailed overview is available in PLUGIN_ARCHITECTURE.md.
Current in-tree plugins include:
OpenDataBayernDownloadPluginMeshExportPluginPointCloudExportPlugin
- Open Data Bayern: regional geodata download source
- OpenStreetMap: base map and georeferencing context
- Leaflet.js: embedded map visualization in the GUI
Please review the individual upstream terms and licenses before redistributing downloaded datasets.
If you configure the project with coverage enabled, the HTML report can be opened locally at build/coverage_report/index.html.
Historical example values from 2025-06-30:
- Line coverage: 42.1%
- Function coverage: 67.3%
CHANGELOG.md- release historyPLUGIN_ARCHITECTURE.md- detailed plugin architecture and extension guideTHIRD_PARTY_LICENSES.md- third-party software and data-source noticesDOCKER_GUI_USAGE.md- Docker GUI usage notes
If you use openHDMap in academic work, cite it as:
@inproceedings{brueckner2026openhdmap,
author = {Br{\"u}ckner, C. and Patino-Studencki, L.},
title = {openHDMap: High-Resolution Maps Created from Open Data for Self-Localization of Autonomous Vehicles},
booktitle = {Proceedings of the 12th International Conference on Vehicle Technology and Intelligent Transport Systems},
year = {2026},
pages = {363--371},
isbn = {978-989-758-831-0},
issn = {2184-495X}
}Contributions are welcome through pull requests and issues.
openHDMap is licensed under the Apache License 2.0. See LICENSE for the project license and THIRD_PARTY_LICENSES.md for dependency and data-source notices.