August 20, 2026 · By YasKad
originalankur/maptoposter

MapToPoster: urban cartography turned into reproducible posters

originalankur/maptoposter · 14,153★ · 1,259 forks

Everything worth knowing about originalankur/maptoposter: a Python tool that pulls the road network and other OpenStreetMap layers to render city posters from the command line.


What MapToPoster is

MapToPoster turns a city and country into a minimalist cartographic poster. The project combines geocoding, OpenStreetMap data, and Matplotlib rendering; the result is saved as an image in posters/. The repository presents itself as a programmable generator, not a hosted service or an official GUI app.

Its practical pitch is that the same command, theme, and radius produce a repeatable composition. It includes 17 themes, road hierarchies, water, parks, typography, and support for non-Latin script labels.

A neon urban map materializing from a cascade of code fragments and data nodes, with streets in cyan and magenta, water in blue, and parks in green, above a holographic terminal running the poster-generation command.

The origin: a fast launch with immediate attention

The repository was created on January 8, 2026 by Ankur Gupta (originalankur), whose public profile lists Bengaluru and links to ankur.dev. The project’s history pins the first version, 0.1.0, to January 17, 2026, with 17 themes and the basic city/country flow; the same day it was also tagged v0.2.

The post “Map To Poster – Create Art of your favourite city” hit Hacker News on January 17, 2026. It reached 296 points and 70 comments, notable early attention for a freshly created repository. The reception also revealed the project’s central tension: producing attractive images from public geographic data is simple through the interface, but geocoding, projection, and data-volume limits show up once you want precision or a large city.

Philosophy and principles

  • Code before interface: the maintainer asks not to submit web or desktop interfaces for now, and not to add Docker; the expected core is the command-line tool.
  • Declarative customization: themes are defined as JSON files in themes/, with colors for background, text, water, parks, and road categories.
  • Open data, visual output: the pipeline uses Nominatim for geocoding, OSMnx for retrieving the data, and Matplotlib for rendering.
  • Verifiable result: the contributor guide asks that any fix be visually tested and the poster compared before and after.

Dark-mode terminal with neon green and cyan text showing Python commands generating city maps, surrounded by holographic representations of JSON theme files with color palettes for background, water, parks, and roads.

How it works

The program parses arguments, resolves the city into coordinates with Nominatim, downloads the network and layers from OpenStreetMap via OSMnx, and draws them with Matplotlib. The documented order stacks background, water, parks, roads, gradients, and finally labels; roads get their width and color from OSM’s highway category.

Glowing globe made of fiber-optic threads and data points, with a neon light beam pinpointing a specific city coordinate, while data streams labeled "Nominatim" and "OSMnx" feed into a rendering pipeline.

The tool supports a radius in meters, an explicit center via latitude/longitude, a physical size in inches, a single theme, or all themes. For international text, it can separate the name used for geocoding from the text displayed on the poster, and download a Google Fonts family into fonts/cache/.

The changelog credits version 0.2.1 with local OSM data caching, a 0.3-second pause between requests, projection fixes, and a 10-second Nominatim timeout. The branch without a formally published version adds uv support, Python 3.11 or later, and coordinate overrides.

Official and semi-official status

No evidence was retrieved of acceptance into an official marketplace, endorsement from a mapping vendor, or an official registry package during this research. GitHub’s homepage field is empty, so the repository and its README are the retrievable canonical documentation.

In practice it’s a community open-source project under the MIT license, with Discussions, issues, and pull requests enabled; its numerous forks and adaptations do not amount to official certification.

Minimalist cartographic poster of a stylized city rendered in Matplotlib, with a hierarchical road network in neon orange, warm yellow, and cool white, deep blue water, and vibrant green parks, framed within a futuristic dark interface.

The ecosystem

Derivatives, ports, and interfaces

  • cedgeek/maptoposter-docker is a fork detected via the API and announces a Docker variant: 26 stars and 5 forks. It’s a community adaptation, even though the main project doesn’t accept Docker for now.
  • rramboer/OpenCartograph is another fork from the API; it’s renamed as a cartography generator, with 4 stars and 3 forks.
  • frohman04/maptoposter-rs describes itself as a Rust version of MapToPoster; and fezcode/CartoGo claims to seek aesthetic parity with the original generator, from Go. Both are ports declared by their own authors, not official components.
  • simongrossi/maptoposter-web, s4chdev/maptoposter-webui, and msamuslim101/maptopostergui describe themselves as web or desktop layers built on top of the original idea or script. The main README’s explicit restriction rules out presenting them as accepted extensions.
  • ianho7/maptoposter-online is an adjacent online app with 891 stars; dimartarmizi/map-to-poster is a client-side web app with 1,050 stars, themes, layouts, and export. The search returns them as related, but not as official GitHub forks.

No complete community translation of the repository was identified. Internationalization does exist in the product itself: the README shows examples in Japanese, Korean, Arabic, Chinese, Thai, and Khmer via display names and appropriate fonts.

Neon map of Tokyo transitioning into a display of non-Latin scripts — Japanese, Arabic, and Thai — rendered as floating, glowing typography housed in futuristic cache modules labeled "Google Fonts."

Comparable projects

ProjectVerifiable relationship
anvaka/city-roadsVisualizes a city’s roads; focused on that one layer, while MapToPoster composes a poster with themes and labels.
yousifamanuel/terrainkPresents itself as a customizable cartographic poster engine.
chrieke/prettymappA Streamlit app for creating artistic maps from OSM data.
koenderks/rcityviewsAn R and Shiny package for stylized urban maps.
dimartarmizi/map-to-posterA client-side web alternative for location posters.

The repositories and descriptions in this table were retrieved from GitHub searches; no compatibility, affiliation, or independent comparative evaluation is claimed.

Repo numbers

Measured: August 9, 2026, GitHub API.

MetricValue
Stars13,901
Forks1,249
Real subscribers45
Contributors returned by the API16
Open issues reported by the API63
Primary languagePython
LicenseMIT
CreatedJanuary 8, 2026
Last recorded pushAugust 6, 2026
Last metadata updateAugust 9, 2026
Latest changelog version0.3.0, January 27, 2026
Formal GitHub releasesnone; there is a v0.2 tag

GitHub repository dashboard in a dark cyberpunk interface, showing glowing stats: "13,901 stars," "1,249 forks," and "MIT License," surrounded by holographic graphs and contributor avatars connected by data lines.

The top contributors in the API result are originalankur (17 contributions), lorenzofratus (9), and Saibamen (4). GitHub’s open_issues_count field can include open pull requests; it should not be read as an issues-only count. watchers_count duplicates the star count in that response, which is why subscribers_count is used for the 45 real subscribers.

How to contribute

No CONTRIBUTING.md was retrieved at the root; the guidance lives in the README. It accepts bug fixes, requires visually testing the result before and after, and asks that Discussions or Issues be consulted before undertaking a large feature. It also sets as current limits: no web/desktop UI and no Docker.

The tree contains test/, and the changelog notes pull-request checks via GitHub Actions since 0.3.0.

Discussions, issues, and pull requests are visible, so the practical flow is to propose the change in the repository’s channels, implement it in a fork, and open a pull request with visual evidence.

How the community received it

The Hacker News thread 46656834 got 296 points and 70 comments. User stephenlf praised the results and called the README a great-quality example for open source; that’s an individual opinion, not proof of general quality. mft_ asked for SVG output, while Helmut10001 flagged possible projection issues in samples. Kwpolska and mvdwoord requested manual coordinates and mentioned geocoding difficulties; Footprint0521 reported extreme slowness generating PDF/SVG for a large city. These objections line up with the coordinate, cache, and projection controls added later in the changelog.

Retro-futuristic screen showing a vibrant Hacker News thread with glowing orange and white text, surrounded by holographic comment bubbles and upvote arrows in neon light, with city map silhouettes dissolving into the dark background.

As external practical material, a video from Blueprint Bytes, “How to Create Custom Map Posters with Mapbox and Python: maptoposter Guide,” was retrieved: 4 minutes 45 seconds, published on January 24, 2026, with 610 views at the time of the query. It’s an independent tutorial; its existence doesn’t constitute a technical audit.

No retrievable evidence was obtained from Reddit due to a site challenge, nor from X since it requires authentication. Product Hunt showed an anti-bot check; DEV returned an empty list for the maptoposter tag, Hashnode showed no posts in its search, and iTunes returned no exact episodes. These limitations don’t prove an absence of conversation on those platforms.

Quick-start guide

Installation and first run

Python 3.11 or later is required for the current project. The recommended path is installing uv and running from the clone:

uv run ./create_map_poster.py --city "Paris" --country "France"

On first use, uv run creates and manages the environment and installs dependencies. As a reproducible alternative, run uv sync --locked before the same command. With pip, create and activate .venv, install requirements.txt, and run python create_map_poster.py .... The first result is saved to posters/{city}_{theme}_{YYYYMMDD_HHMMSS}.png.

Common workflows

# Generate a poster with the default theme.
python create_map_poster.py -c "Paris" -C "France"

# Adjust composition and theme for a specific area.
python create_map_poster.py -c "Barcelona" -C "Spain" -t warm_beige -d 8000

# Fix ambiguous geocoding with an explicit center.
python create_map_poster.py --city "New York" --country "USA" -lat 40.776676 -long -73.971321 -t noir

# Browse or render all the visual options.
python create_map_poster.py --list-themes
python create_map_poster.py -c "Tokyo" -C "Japan" --all-themes

Essential configuration

  1. --city and --country: required, used for geocoding.
  2. --theme and themes/*.json: pick a style or let you create one with colors for layers and roads.
  3. --distance: controls the radius, defaulting to 18,000 m; the README suggests 4–6 km for small, dense areas, 8–12 km for city centers, and 15–20 km for metropolitan areas.
  4. --width and --height: measured in inches, with a maximum of 20; they help target print or screen resolution.
  5. --display-city, --display-country, and --font-family: enable local labels and download/cache the font into fonts/cache/.

Common pitfalls and fixes

  • Wrong city or an unhelpful center: keep city and country for the labels, but combine --latitude and --longitude to pin the center. The changelog notes this feature exists specifically for precise control.
  • Slow rendering or memory use: the README warns that radii above 20 km mean slower downloads and more memory. Reduce --distance, use network_type='drive' when editing the code for quick previews, and drop the DPI from 300 to 150 for previews.
  • Geocoding limits: the guide recommends local coordinate caching to avoid Nominatim limits; the project already applies OSM data caching and a pause between requests.
  • Layers hiding roads: the changelog logs a layer-order fix so roads sit above water and parks. Update to the current code if that bug shows up on an older checkout.

Integrations and migration

Native integration is with OpenStreetMap data via OSMnx, Nominatim geocoding, Matplotlib, and Google Fonts; no official integration with MCP, editors, CI, or messaging is documented.

For a containerized deployment or an interface, the community forks and interfaces in the ecosystem are starting points, but the main maintainer doesn’t accept them as contributions.

Use cases and who this repository can help

  • Designers, cartographers, and people preparing prints or wallpapers can generate the same city with an explicit radius, theme, and size, and get PNG files with a traceable name in posters/.
  • Anyone who needs local labels or samples for international cities can keep the search name in Latin script while displaying Japanese, Arabic, Chinese, Korean, Thai, or Khmer with an appropriate font.
  • Developers exploring OpenStreetMap data can modify the theme JSON files, the create_poster() layers, or the road hierarchy to add their own visualization, backed by documented architecture and key functions.
  • Teams that need a web app, Docker, or a production pipeline should evaluate the community adaptations or comparable projects first: those uses fall outside the contribution scope accepted by the main repository.

Central neon core labeled "MapToPoster" emitting branching paths toward satellite nodes representing forks and ports — Docker, Rust, a web interface — with pulsing data streams in purple, cyan, and green over a dark background of abstract digital noise.

Resources


Note: this article combines documentation, changelog, and the GitHub API, plus community sources retrieved on August 9, 2026. Figures change over time.

Comments