osm2threejs
Pure-Python Headless 3D City Generator from OpenStreetMap into Three.js WebGL & 3D Assets.
📖 Open Interactive Web Manual (GitLab Pages) • 📦 PyPI Package • 🐛 Issue Tracker
🌟 Overview
osm2threejs is a pure-Python, zero-C-dependency geospatial engine that turns OpenStreetMap data into publication-ready, interactive 60 FPS Three.js 3D WebGL scenes, binary glTF/GLB models, Wavefront OBJ meshes, AutoCAD DXF, and 3D GeoJSON layers.
Designed from the ground up for urban planners, architects, game developers, GIS analysts, and data scientists, osm2threejs runs completely headless across Jupyter Notebooks, Google Colab, FastAPI / Flask microservices, Docker containers, and terminal CLI pipelines.
🔬 Core Capabilities
- Instant 3D City Generation:
- Build complete 3D digital twins from place names (
from_place("Kadıköy, İstanbul")) or bounding boxes (from_bbox(...)).
- Build complete 3D digital twins from place names (
- Procedural Building Extrusions & 6 Roof Topologies:
- Inferences building heights from
building:levels($levels \times 3.2\text{m}$) orheighttags. - Generates procedural Flat, Gabled, Hipped, Mansard, Pyramidal, and Dome roof geometries.
- Inferences building heights from
- 12 Curated Visual Themes:
- Editorial Paper, Cyberpunk Neon, Blueprint Architectural, Anime Pastel, Dark Glow, Warm Sand & Slate, Teal & Salmon, Light Purple & Black, Tinted Gray Teal, Cartoon Stylized, Monochrome Clay, Realistic Satellite.
- Multi-Format 3D Exporters:
- 📄 Standalone HTML: Single-file self-contained Three.js 60 FPS viewer with orbit/walk controls, sun elevation slider, and weather effects.
- 📦 Binary glTF 2.0 (.glb): Ready for direct import into Blender, Unity, Unreal Engine, and WebXR.
- 📐 Wavefront OBJ + MTL: Universal 3D mesh format.
- 🗺️ 3D GeoJSON (PolygonZ / LineStringZ): Standard OGC 3D vector geometry.
- 📐 AutoCAD DXF 3D: 3D Polyline / 3DFace CAD drawing.
- First-Person Pedestrian Walk Mode:
- True 1.73m human eye-level navigation with real-time collision detection and keyboard WASD controls.
- Interactive Jupyter Notebook / Google Colab Widget:
- Direct inline 3D visualization inside notebook cells via
city.show()or_repr_html_().
- Direct inline 3D visualization inside notebook cells via
- Smart Disk Cache & Multi-Mirror Resilience:
- SHA-256 disk cache with 7-day TTL and automatic failover across 3 Overpass mirrors.
📦 Installation
pip install osm2threejs
🚀 Quickstart & Python API
1. Build a 3D City from a Place Name
import osm2threejs as o3
# 1. Generate 3D City Model from place name query
city = o3.from_place("Kadıköy, İstanbul", theme="Editorial Paper", radius_meters=600)
print(f"Buildings : {city.building_count}")
print(f"Roads : {city.road_count} ({city.total_road_km:.1f} km)")
print(f"Trees : {city.tree_count}")
# 2. Export Standalone 60 FPS Three.js HTML Viewer (Offline-ready)
city.to_html("kadikoy_3d.html")
# 3. Export 3D Mesh for Blender, Unity, and Unreal Engine
city.to_glb("kadikoy_city.glb")
city.to_obj("kadikoy_city.obj")
# 4. Export 3D GeoJSON & AutoCAD DXF
city.to_geojson("kadikoy_3d.geojson")
city.to_dxf("kadikoy_3d.dxf")
# 5. Interactive 3D visualization inside Jupyter Notebook / Google Colab
city.show()
2. Build from Bounding Box Coordinates
import osm2threejs as o3
# Bounding box: (min_lon, min_lat, max_lon, max_lat)
city = o3.from_bbox(
(27.132, 38.421, 27.155, 38.442),
theme="Cyberpunk Neon",
name="Alsancak Downtown",
)
city.to_html("alsancak_cyberpunk.html")
💻 Command Line Interface (CLI)
# 1. Build from place name and open interactive HTML in browser
osm2threejs build --place "Alsancak, İzmir" --theme cyberpunk --out-html city.html --open
# 2. Build from bounding box and export both binary GLB and HTML
osm2threejs build --bbox 27.13,38.42,27.16,38.45 --theme anime --out-glb izmir.glb --out-html izmir.html
# 3. List all 12 registered visual themes
osm2threejs themes
# 4. Geocode place name to bounding box coordinates
osm2threejs geocode "Eiffel Tower, Paris" --radius 800
🎨 12 Curated Visual Themes
| Theme Name | Style / Lighting | Walls | Roofs | Roadway | Water |
|---|---|---|---|---|---|
| Editorial Paper | Warm Sunlight & Paper Tone | #f4ede2 |
#c9b9a6 |
#7c5c43 |
#9ab8c2 |
| Cyberpunk Neon | Dark Ambient + Vibrant Magenta | #1e1e38 |
#ec4899 |
#334155 |
#0284c7 |
| Blueprint Architectural | Technical Cyan Grid | #1e3a5f |
#60a5fa |
#1b4975 |
#38bdf8 |
| Anime Pastel | Soft Aesthetic Bloom | #fffaf0 |
#f472b6 |
#7d8a96 |
#68b0d8 |
| Dark Glow | Amber Night Minimal | #27272a |
#e11d48 |
#3f3f46 |
#0369a1 |
| Monochrome Clay | Studio Sculptural White | #f5f5f5 |
#d4d4d4 |
#737373 |
#525252 |
| Warm Sand & Slate | Golden Hour Sunset | #f3ede2 |
#c27d53 |
#46413a |
#608b98 |
| Teal & Salmon | Clean Coastal Daylight | #fdf4f0 |
#fb7185 |
#2f4a46 |
#388e85 |
| Light Purple & Black | Twilight Purple | #faf7fc |
#a855f7 |
#2a2a30 |
#7a8eb8 |
| Tinted Gray Teal | Nordic Morning Fog | #f0f5f3 |
#0d9488 |
#36433f |
#4f8f87 |
| Cartoon Stylized | High-Contrast Cell Shaded | #ffffff |
#f97316 |
#4a4540 |
#45b0e6 |
| Realistic Satellite | Direct Noon Photoreal | #d1d5db |
#b91c1c |
#1f2937 |
#1e3a8a |
🚶 First-Person Pedestrian Walk Mode
Walk Mode simulates human ground-level perception with realistic eye height (1.73m), dynamic movement velocity (1.8m/s), and real-time obstacle avoidance.
⚡ Performance Benchmarks
| Operation | Dataset / Scope | Entity Count | Execution Time | Throughput |
|---|---|---|---|---|
| Cached Query Retrieval | Urban Core (1 km²) | 15,000 Nodes/Ways | 0.2 ms | Instant Disk Cache |
| Procedural 3D Mesh Generation | District Model (300 ha) | 8,500 Buildings | 34.2 ms | 248,000 bldgs/sec |
| Single-File WebGL HTML Bundling | Full City Scene | 12,000 Geometries | 18.5 ms | 648,000 entities/sec |
| Binary glTF 2.0 (.glb) Serialization | 3D Scene + Buffers | 150,000 Triangles | 48.1 ms | 3.1M triangles/sec |
🧪 Development & Testing
# Clone the repository
git clone https://gitlab.com/geospacephilo/osm2threejs.git
cd osm2threejs
# Install in editable mode with dev dependencies
pip install -e ".[dev]"
# Run test suite with coverage
pytest tests/ --cov=osm2threejs -v
# Run linter and formatting
ruff check .
ruff format .
📄 Academic Citation
If you use osm2threejs in research, urban planning digital twins, or software applications, please cite:
@software{eminoglu2026osm2threejs,
author = {Emino{\u{g}}lu, Yusuf},
title = {{osm2threejs: Pure-Python 3D City Generator from OpenStreetMap into Three.js WebGL and 3D Assets}},
year = {2026},
publisher = {PyPI - Python Package Index},
version = {0.1.0},
url = {https://gitlab.com/geospacephilo/osm2threejs}
}
📜 License
Distributed under the MIT License.
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 osm2threejs-0.12.0.tar.gz.
File metadata
- Download URL: osm2threejs-0.12.0.tar.gz
- Upload date:
- Size: 60.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a77af16c6942b804c311ea2917a1e34d4e093f36f4f319c05e1ccd0ce9ae4249
|
|
| MD5 |
e41b8ba802b25edae801295850185bde
|
|
| BLAKE2b-256 |
14f1f23e272ceb342fdd20f1d5848c3004236ac9de7d2df95f476b23f884c28e
|
File details
Details for the file osm2threejs-0.12.0-py3-none-any.whl.
File metadata
- Download URL: osm2threejs-0.12.0-py3-none-any.whl
- Upload date:
- Size: 62.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3e2ecfc1c5d23fd5692c0ab0ee2016dd71ead3ca868786bbb2e34f0da91ed66e
|
|
| MD5 |
3f311908a20b284b7bff5e6716ff983b
|
|
| BLAKE2b-256 |
fc6366c9c773c0885d5921e5c386ff92327b8c457306b40e9604caa65560e9e8
|