Files
dpg-map/docs/EXAMPLES.md
Hector van der Aa 6990d011ff Release v1.0.0
This is the first releas of dpg-map, an AI coded dearpygui map widget
built due to a lack of time to build it myself.

It features multi-widget abilities, with layers, overlays etc
2026-06-08 13:44:32 +02:00

3.5 KiB

Examples

The examples/ directory contains runnable Dear PyGui programs:

uv run python examples/basic_map.py
uv run python examples/custom_provider.py
uv run python examples/cache_stress.py
uv run python examples/markers_live_thread.py
uv run python examples/trajectory_live_thread.py
uv run python examples/sizing_window.py
uv run python examples/sizing_child.py
uv run python examples/sizing_table.py
uv run python examples/hidden_tab.py

Basic Map

Creates one map and one marker.

with dpg.window(label="Map", width=-1, height=-1):
    with dpgm.map_widget(tag="map", center=(47.9029, 1.9093), zoom=15, width=-1, height=-1):
        dpgm.add_marker("vehicle", lat=47.9029, lon=1.9093)

Run:

uv run python examples/basic_map.py

Live Marker Updates

Use explicit map_tag from background threads or callbacks.

dpgm.add_marker("vehicle", lat=47.9029, lon=1.9093, map_tag="map")

def update_from_telemetry(lat: float, lon: float) -> None:
    dpgm.update_marker("vehicle", lat=lat, lon=lon, map_tag="map")

Run a threaded stress example:

uv run python examples/markers_live_thread.py

Live Trajectory

Keep an application-owned point buffer and pass immutable snapshots to update_trajectory(...).

points: list[tuple[float, float]] = []
dpgm.add_trajectory("track", points=[], show_points=True, point_stride=12, map_tag="map")

def push_point(lat: float, lon: float) -> None:
    points.append((lat, lon))
    dpgm.update_trajectory("track", points=tuple(points), map_tag="map")

Run:

uv run python examples/trajectory_live_thread.py

Multiple Maps

Each map is independent. Reusing overlay tags across different maps is valid, but runtime updates should pass map_tag to avoid ambiguity.

with dpgm.map_widget(tag="live-map", center=(47.9, 1.9), zoom=15, width=-1, height=300):
    dpgm.add_marker("vehicle", lat=47.9, lon=1.9)

with dpgm.map_widget(tag="recap-map", center=(47.9, 1.9), zoom=13, width=-1, height=300):
    dpgm.add_trajectory("vehicle", points=[])

dpgm.update_marker("vehicle", lat=47.901, lon=1.902, map_tag="live-map")
dpgm.update_trajectory("vehicle", points=lap_points, map_tag="recap-map")

Custom Provider Switch

Register a provider, create the map with it, and switch at runtime.

carto = dpgm.TileProvider(
    name="carto-light",
    url_template="https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png",
    subdomains=("a", "b", "c", "d"),
    attribution="(c) OpenStreetMap contributors (c) CARTO",
)

dpgm.register_provider(carto)
dpgm.set_provider("carto-light", map_tag="map")
dpgm.set_provider("osm", map_tag="map")

Run:

uv run python examples/custom_provider.py

Cache Controls

Configure a local cache and expose buttons in your UI.

dpgm.configure(cache_dir=".tile-cache", memory_cache_max_tiles=128)

def clear_memory() -> None:
    dpgm.clear_memory_cache(map_tag="map")

def clear_disk() -> None:
    dpgm.clear_disk_cache(map_tag="map")

def refresh_stats() -> str:
    stats = dpgm.get_cache_stats(map_tag="map")
    return f"{stats.memory_tiles} memory tiles, {stats.disk_bytes} disk bytes"

Run:

uv run python examples/cache_stress.py

Layout And Sizing

The widget works inside windows, child windows, tables, and hidden tabs.

with dpg.child_window(width=-1, height=420):
    with dpgm.map_widget(tag="map-child", width=-1, height=-1):
        dpgm.add_marker("inside-child", lat=47.0, lon=2.0)

Run:

uv run python examples/sizing_child.py