Skip to main content

An OpenStreetMap study area rising into a procedural 3D city and recolouring through curated looks as the sun crosses the sky

osm2threejs logo

osm2threejs

CI PyPI version Python version support Documentation License: MIT Code style: Ruff

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.

osm2threejs export pipeline from Overpass to GeoJSON and Three.js 3D models


🔬 Core Capabilities

  1. Instant 3D City Generation:
    • Build complete 3D digital twins from place names (from_place("Kadıköy, İstanbul")) or bounding boxes (from_bbox(...)).
  2. Procedural Building Extrusions & 6 Roof Topologies:
    • Inferences building heights from building:levels ($levels \times 3.2\text{m}$) or height tags.
    • Generates procedural Flat, Gabled, Hipped, Mansard, Pyramidal, and Dome roof geometries.
  3. 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.
  4. 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.
  5. First-Person Pedestrian Walk Mode:
    • True 1.73m human eye-level navigation with real-time collision detection and keyboard WASD controls.
  6. Interactive Jupyter Notebook / Google Colab Widget:
    • Direct inline 3D visualization inside notebook cells via city.show() or _repr_html_().
  7. 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

12 Curated Visual Themes Gallery for osm2threejs

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

A 1.85 metre walker moving through the street with the eye height marked at 1.73 metres

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

osm2threejs-0.12.0.tar.gz (60.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

osm2threejs-0.12.0-py3-none-any.whl (62.2 kB view details)

Uploaded Python 3

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

Hashes for osm2threejs-0.12.0.tar.gz
Algorithm Hash digest
SHA256 a77af16c6942b804c311ea2917a1e34d4e093f36f4f319c05e1ccd0ce9ae4249
MD5 e41b8ba802b25edae801295850185bde
BLAKE2b-256 14f1f23e272ceb342fdd20f1d5848c3004236ac9de7d2df95f476b23f884c28e

See more details on using hashes here.

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

Hashes for osm2threejs-0.12.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3e2ecfc1c5d23fd5692c0ab0ee2016dd71ead3ca868786bbb2e34f0da91ed66e
MD5 3f311908a20b284b7bff5e6716ff983b
BLAKE2b-256 fc6366c9c773c0885d5921e5c386ff92327b8c457306b40e9604caa65560e9e8

See more details on using hashes here.

Release history Release notifications | RSS feed

0.12.1

2 files

This release

0.12.0 This release

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page