Skip to main content

Umap Art

Editable city maps for posters, neighborhood guides, architectural studies and repeat photography.

Create maps for spatial studies, presentations and personal neighborhood guides from open data. Start with a bundled real-world example, then choose a theme, add your own places, and export PNG, editable SVG and vector PDF at a real-world scale — through Python, the CLI or a local MCP server.

Python 3.12–3.14 Source version 0.3.0 License: MIT

Quick start · Python · MCP · Documentation · Türkçe başlangıç

What changed from v0.2.0 to v0.3.0?

Task v0.2.0 v0.3.0
Add selected places Enter each place in the map recipe Import up to 12 places from a CSV in row order. Invalid coordinates identify the row to fix.
Read nearby markers Overlapping numbers share space and produce a warning Numbers move apart automatically. A dot and a leader line identify each original coordinate.
Carry a neighborhood guide A3 or A4, with the map and directory on one side A5 pocket guide with the map on the front and numbered places and notes on the reverse, in one two-page PDF.
Return to a camera position A numbered point identifies the location Aynı Kadraj gives each station its own A5 card with a position, direction arrow, true bearing, reference photo and field note.
Read the exported artwork DPI-based PNGs and single-weight page typography All five layouts share clearer titles and page identifiers. Default PNG exports have at least 3,840 pixels on the long side. SVG and PDF preserve physical scale.

Five v0.3.0 layouts rendered from Kadıköy data

The poster, neighborhood guide and atlas are A4. The pocket guide and camera card are A5. All five use the same October 2026 map data at 1:5000. The building in the example camera card is an AI-generated illustration.

Install the v0.3.0 package with python -m pip install "umap-art==0.3.0", then try:

umap-art demo --preset pocket
umap-art demo --preset field-cards

Open pocket-guide.pdf. Print at actual size on A5 (148 × 210 mm), double-sided, flipping on the long edge. PNG and editable SVG exports are named by side.

Make your own field cards. Put your reference JPEG or PNG next to a UTF-8 file named stations.csv. These example coordinates fit the bundled Kadıköy map. Replace the filename and bearing with those from your own shot.

name,latitude,longitude,bearing,reference_photo,note
Sokak köşesi,40.9850,29.0250,75,corner.jpg,Kapı eşiğini kadrajın solunda tut.
umap-art demo --preset field-cards --places-csv stations.csv

Open field-cards.pdf. Each page uses one CSV row. Bearings are degrees clockwise from true north. The project ZIP includes the reference images for offline reprints. For a pocket guide, only name,latitude,longitude are required. --places-csv also works with render and refresh on your own map recipe. See the Turkish walkthrough.

What you can make

Make Start with What you get
A personal city poster umap-art demo A4 portrait, vintage colours, a centred title and numbered places
A neighborhood guide umap-art demo --preset guide A4 portrait, blueprint colours and an ordered place directory
A pocket guide umap-art demo --preset pocket A5 map front and a notes directory on the back
Camera station cards umap-art demo --preset field-cards A5 cards with mapped direction, coordinates and a reference image
An architectural study umap-art demo --preset atlas Four aligned A4 pages for buildings, roads, green spaces and water
A general city map Kadıköy map A3 landscape with a legend, scale bar and all four map layers
  • Edit the artwork. SVG retains semantic groups, individual paths, stable IDs and editable text. PDF embeds the bundled font.
  • Keep the scale. Page geometry uses millimetres and points. Set a scale such as 1:5000, or fit a bounding box to the page.
  • Make it yours. Choose from six themes, override layer colours, adjust title sizes and add up to twelve numbered places.
  • Revise offline. Saved recipes pin a verified dataset. Changing colours, text or selected places reuses that data.
  • Take the project with you. Every default export includes the recipe, snapshot, source manifest, font/license and a portable ZIP.

The bundled demo needs no map download. Acquiring your own area uses public services without an account or API key. Their availability and data coverage can vary. Umap runs locally and does not call a model API; an MCP client supplies its own assistant.

Quick start

Use Python 3.12–3.14 to install the v0.3.0 release.

python -m pip install "umap-art==0.3.0"
umap-art doctor
umap-art demo

If your shell cannot find umap-art, use python -m umap_art with the same Python environment. The distribution name is umap-art; the import is umap_art. For a source installation, see Development and verification.

The demo works from the installed package, without cloning example files or contacting map services. Its default is an A4 portrait poster in the vintage theme at 1:5000. Installation itself may download Python dependencies. The command prints the preview, SVG, PDF and recipe paths, and creates a new project directory under outputs. Open a PNG to inspect the map or an SVG to continue in your vector editor.

Make a guide, an architectural atlas or a different poster theme from the same saved data, without editing JSON:

umap-art demo --preset guide --output outputs
umap-art demo --preset atlas --output outputs
umap-art demo --theme neon --output outputs
umap-art styles

Use --preset poster, guide, atlas, pocket or field-cards. Supply --places-csv to use your own stations. Use --theme to override a preset's theme. Each run keeps earlier outputs and delivers its own recipe, snapshot and ZIP. The atlas produces four separate pages. The presets share a dataset and physical scale. Their visible frames vary by layout.

For your own area, use the Python example below or adapt a repository recipe and run umap-art render <recipe.json> --output outputs. Those additional recipes are not copied into your working directory by package installation. First acquisition depends on public services; delivered snapshots support later offline edits.

Choose your look

All five layouts use Space Grotesk and a single white background across the page and map. An explicit style.background sets both to the same colour.

Theme Palette and treatment
architectural Restrained greys and soft land/water colours
city_poster Terracotta buildings, warm grey streets and blue water
minimal Black, white and greys
blueprint Blue outlines and navy roads on white
vintage Sepia buildings and muted greens on white
neon Teal roads, violet buildings and pink markers on white

Use page.layout="poster" for a centred title below the map, or "guide" for a title above it. Both provide a two-column directory for up to twelve places and use the general view. The default classic layout also supports the four analytical views.

The place band has a fixed size, even when empty: adding or removing a point does not move the map frame. Neon uses vector fills and strokes, keeping the SVG and PDF editable. See the poster guide for layout details.

Create a poster in Python

from umap_art import MapSpec, render

spec = MapSpec(
    area={"center": [29.025, 40.985], "scale_denominator": 5000},
    page={"size": "A4", "orientation": "portrait", "layout": "poster", "dpi": 300},
    style={"theme": "vintage", "accent": "#913E2B"},
    title="Kadıköy",
    subtitle="Seçtiğim noktalar · İstanbul",
    places=[
        {"id": "meeting", "label": "Buluşma noktası", "coordinates": [29.025, 40.985]},
    ],
)

result = render(spec, output_dir="outputs")
print(result.recipe_path)

Coordinates are always longitude, latitude. Place IDs must be unique; numbering follows list order. Labels are your own content, and rendering does not search for or invent locations.

To find coordinates by name:

umap-art locations "Kadıköy, İstanbul"

Choose the intended candidate and use its coordinates. Python and CLI recipes also accept area.place; ambiguous results return candidates for you to choose from.

To change… Set…
Overall palette style.theme
One layer's colour or line width style.layers
Features matching a property, such as primary roads style.rules
Text and marker colours style.ink, style.accent
Title and subtitle size page.title_size_pt, page.subtitle_size_pt
Place names, positions or order places

See the recipe/API reference for field limits, filters and errors. Version 0.3 reads earlier v1 recipes. Pocket guides, field cards and page.png_resolution require Umap 0.3 or newer.

Edit without downloading again

Continue from the Python example above, using its result:

from pathlib import Path
from umap_art import MapSpec, render

recipe = Path(result.recipe_path)
edited = MapSpec.model_validate_json(recipe.read_text(encoding="utf-8"))
edited.source.snapshot = str(recipe.parent / edited.source.snapshot)
edited.style.theme = "blueprint"
edited.style.accent = "#FFE09A"
edited.places[0].label = "Burada buluşalım"

revised = render(edited, output_dir="outputs")
print(revised.recipe_path)

Saved recipes set source.offline=true. The CLI resolves a saved recipe's relative snapshot path automatically; constructing a model from JSON yourself requires resolving it as shown above.

Use umap-art refresh with your recipe when you explicitly want fresh data. Changing providers or expanding the map beyond its pinned snapshot also requires a refresh. Each render writes a new output directory and preserves earlier outputs.

What travels with an export

A default single-view export contains:

general.png          Raster image at the requested DPI
general.svg          Editable vector artwork
general.pdf          Vector PDF with embedded font
recipe.json          Design settings and selected places
snapshot.json        Hash-verified geographic data
manifest.json        Sources, versions, diagnostics and artifact hashes
assets/              Bundled font and its license
DATA-LICENSES.txt     Source attribution and license notices
project.zip          Portable copy of the project

Keep the whole output directory or project.zip to reproduce a design. Analytical exports use their view names, such as figure_ground.svg, instead of general. For SVG text editing, install the delivered Space Grotesk faces and DejaVu Sans fallback; page.text_mode="outline" converts text to paths when font independence matters.

Connect your MCP client

Install the optional MCP adapter, then start a local workspace:

python -m pip install "umap-art[mcp]==0.3.0"
umap-art mcp --workspace ./map-workspace

Register the command in your client's server configuration, with an absolute workspace path and an executable the client can find. Example for Windows:

{
  "mcpServers": {
    "umap": {
      "command": "umap-art",
      "args": ["mcp", "--workspace", "C:/maps/umap-workspace"]
    }
  }
}

Example request to your connected assistant:

Create an A4 portrait poster of Kadıköy in the vintage theme. Use the title “Benim Kadıköy’üm” and mark the three coordinates I provide. Then change only the theme to blueprint and export SVG and PDF.

The server exposes ten tools for location search, styles, map creation, inspection, edits, refresh, rendering, job status/cancellation and artifacts. Long operations return a job_id; poll get_job for the result. Edits use base_revision, and restoring an earlier version creates a new revision.

Colour, text and place edits use pinned data. For a larger page needing more coverage, refresh_map_data accepts the intended changes and commits them only after a successful refresh without a revision conflict. See the MCP contract for tool arguments, previews and artifact access.

Data, scale and boundaries

Data Provider How Umap uses it
Place search Photon Cached, user-initiated searches with explicit candidate selection
Buildings, roads, green and inland water OpenStreetMap / Overpass Bounded queries assembled with Pyosmium
Ocean polygons Overture Anonymous STAC/GeoParquet reads for the selected area
  • A3/A4/A5 pages, portrait or landscape, fixed centre/scale or bbox fitting, up to 25 km². Choosing a place name does not select its entire administrative area.
  • PNG at 72–600 DPI, editable SVG and RGB vector PDF. CMYK/PDF-X, routing, GPX, 3D, a web editor and remote MCP are outside this release.
  • Out-of-frame points and overflowing text produce explicit errors. Crowded numbers get leader lines. Isolated markers clipped at the frame edge produce a warning.
  • Source dates can differ, and successful downloads do not establish geographic completeness. OSM building data is not a cadastral survey.

Umap owns its source adapters, geometry pipeline, declarative styles and scene model. Shapely, pyproj and Matplotlib provide infrastructure; Prettymaps, OSMnx, QGIS and GDAL are not runtime dependencies. Python calls within one process are serialized; MCP uses isolated render workers. See the architecture.

Development and verification

To install the source checkout, including the optional MCP adapter:

git clone https://github.com/U-C4N/Umap.git
cd Umap
python -m pip install ".[mcp]"
umap-art demo

Use python -m pip install . if you only need the core package. The checkout also contains the additional example recipes and the showcase scripts. For development checks, install uv, then run from the repository:

uv sync --frozen --all-extras --dev
uv run pytest -m "not live"
uv run ruff check src tests scripts
uv run python scripts/benchmark.py
uv run python scripts/poster_gallery.py
uv run python scripts/release_showcase.py --output outputs/release-showcase

The benchmark and default gallery generator use synthetic snapshots. The release showcase uses the bundled real Kadıköy snapshot, creates the six themes, a guide, four analytical pages and a before/after comparison, and verifies an extracted ZIP can reproduce the edited result. All three disable network connections. Choose a new showcase output directory on every run to preserve its evidence. Its index.json records dataset, geometry, marker, scene and artifact checks; this does not replace manual SVG editing acceptance. To test public providers:

uv run pytest --live -m live

For v0.3.0, 331 offline tests passed locally on Windows with Python 3.14. The candidate was also installed from its wheel and used to produce a 4K field card. The release owner waived three manual checks for v0.3.0: editing and reopening an SVG in Inkscape, a three-user pilot and three benchmark runs on a physical 4-core, 16 GB machine. The evidence records these checks as waived alongside the nine-environment CI result and distribution hashes. v0.3.0 release evidence.

For bug reports, include the output of umap-art --version, the error code and a minimal recipe. Open an issue.

Documentation

I want to… Read
Get started in Turkish Türkçe hızlı başlangıç
Design a poster or guide Poster workflow and gallery
Understand recipe fields and errors Python/API reference
Connect an assistant Local MCP workflow
Understand the implementation Architecture and data ownership
Check what changed and what was verified Release notes · Validation
Publish a release GitHub/PyPI publishing guide

License and attribution

Umap's application code is MIT licensed. Geographic data retains its source licenses: OpenStreetMap and Overture Base water use ODbL. Bundled fonts include Space Grotesk and the DejaVu Sans fallback. Preserve the source attribution when sharing artwork; source and font notices travel with each default export.

OpenStreetMap attribution · Overture attribution

Metadata

Release files for umap-art 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for umap-art 0.3.0
File Size Uploaded Provenance Actions
umap_art-0.3.0.tar.gz 24.1 MB With provenance Details for umap_art-0.3.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for umap-art 0.3.0
File Interpreter ABI Platform Actions
umap_art-0.3.0-py3-none-any.whl Python 3 none any Details for umap_art-0.3.0-py3-none-any.whl

Total release size: 28.6 MB

Release files / umap_art-0.3.0.tar.gz

Download URL umap_art-0.3.0.tar.gz
Size 24.1 MB
Tags Source
SHA-256 checksum
How to use checksums
9587ea41f92b336b45733e2933802b4dee62ea0ca773ca7d17754e73a5f7def1
BLAKE2b-256 checksum
How to use checksums
e483a1134d9ac3441ce244204d8dd5dbc4b22b93f7fb6440aa212c37b3497185
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Release files / umap_art-0.3.0-py3-none-any.whl

Download URL umap_art-0.3.0-py3-none-any.whl
Size 4.5 MB
Tags Python 3
SHA-256 checksum
How to use checksums
b6016c48083f8e13cca7758d84cf82fadfdf08d1001493494b9f44ee8c36629b
BLAKE2b-256 checksum
How to use checksums
effbbf113912f54e4cdcf0c045d67765c7b03ed812cf4a26dfd000387b2390ad
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

Security for umap-art 0.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for umap_art-0.3.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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