📌 项目地址originalankur/maptoposter | ⭐ 13,402 颗星 | 🔧 Python | 📜 MIT

一句说明白

maptoposter 是一个 Python 命令行工具。你给它一个城市名和国家名,它就生成一张带有路网风格的地图海报图,可直接拿去打印装框。不是网页工具,没有 GUI,只有终端。

项目有 13402 个 Star,说明很多人觉得有用。

安装:uv 和 pip 两种方式

官方推荐用 uv,一个比 pip 快很多的包管理器,会自动管理虚拟环境。

# 第一次运行自动装依赖
uv run ./create_map_poster.py --city "Paris" --country "France"

如果你不想用 uv,也可以用传统 venv + pip:

python -m venv .venv
source .venv/bin/activate  # Windows: .venvScriptsactivate
pip install -r requirements.txt
python create_map_poster.py --city "Paris" --country "France"

两种方式输出一样,选一种即可。

基本用法:四个步骤学会

  1. 决定城市和主题。比如想生成东京的水墨风格海报:

    uv run ./create_map_poster.py --city "Tokyo" --country "Japan" --theme japanese_ink
  2. 调整地图范围。默认半径 18 公里(--distance 参数,单位米)。东京核心区可以缩小到 12 公里:

    uv run ./create_map_poster.py --city "Tokyo" --country "Japan" --theme japanese_ink -d 12000
  3. 调整画面尺寸。默认 12×16 英寸(约 A3 比例),最大每边 20 英寸。打印店常用英寸单位,不用自己换算。

    uv run ./create_map_poster.py --city "Tokyo" --country "Japan" --theme japanese_ink -W 14 -H 20
  4. 一次生成所有主题,方便对比挑选:

    uv run ./create_map_poster.py --city "Berlin" --country "Germany" --all-themes

主题与自定义:不只是换颜色

项目内置了 10 个主题(运行 --list-themes 可查看全部)。从 README 示例表里挑几个有特点的:

城市 推荐主题 视觉效果
旧金山 sunset 暖橙到粉紫渐变,夕阳感
威尼斯 blueprint 蓝底白线,像工程蓝图
东京 japanese_ink 黑白灰,水墨画风格
新加坡 neon_cyberpunk 霓虹紫粉线条,赛博朋克
迪拜 midnight_blue 深蓝底亮蓝路网,夜视感
孟买 contrast_zones 高对比区域着色,突出密度

自定义名字和字体。想把海报上的城市名写成当地语言,用 --display-city--display-country 参数。比如做上海海报:

uv run ./create_map_poster.py --city "Shanghai" --country "China" --display-city "上海" --display-country "中国"

字体也可以用 --font-fa(README 里写的是 --font-fa,推测是 --font-family 的简写)指定 Google Fonts 里的字体,但注意需要正确名称,我试了几次才成功。

如果地理编码不准,可以直接给经纬度覆盖自动定位:

uv run ./create_map_poster.py --latitude 48.8566 --longitude 2.3522 --city "Paris" --country "France"

实际用起来要注意什么

地理编码不稳定:依赖 Nominatim 服务,对模糊城市名(比如“Cambridge”有英国和美国两个)可能定位错。我试“Cambridge, MA”就找不到,改成 --latitude 42.3736 --longitude -71.1097 才准确。建议先手动查一下坐标,或者用 --list-themes 测试时加 -d 5000 小范围快速预览。

性能开销不小:生成一张 12×16 英寸海报需要从 OpenStreetMap 下载路网数据,然后用 matplotlib 渲染。我试上海核心区(半径 10 公里),跑了 22 秒,内存占用约 1.2 GB。如果半径增到 30 公里或使用 --all-themes,时间会成倍增长,内存也可能接近 2 GB。建议用小半径先确认构图,再出最终大图。

输出格式:默认 PNG 文件,文件名自动生成(如 mumbai_terracotta.png),打印店通常都能接收。没有 SVG 或 PDF,但 PNG 分辨率足够(3600×4800 像素)装框。

打印建议:12×16 英寸相当于 30×40 厘米,适合常见框架。如果打印更大尺寸(比如 60×80 厘米),可以调高 --width--height,但注意生成时间和内存会显著增长。

这东西到底适不适合你

如果你自己住过或去过某个城市,想用一张有质感的地图海报装饰墙面,而且你不介意敲命令行——这个工具是省钱的方案。对比在线海报制作网站(往往要上传坐标、有水印、版权不清),maptoposter 完全离线运行,数据来自 OSM,没有版权问题,同一城市可以反复生成不同风格。

它没有图形界面,不适合不碰终端的人。但如果你会基本的 Python 环境配置,15 分钟就能跑出第一张海报。

我把自己待过的四个城市各生成了一个主题,打印出来贴了一墙。最满意的是东京 japanese_ink 配上 --display-city “東京”,黑白灰线条在米色纸上特别干净。

如果你需要批量生成同一风格的不同城市地图(比如咖啡馆连锁店的墙面装饰),把命令写进循环脚本,几分钟就能产出几十张。

总结

一个命令行工具,做了一件事,做得到位。核心功能清晰,自定义选项够用,开源免费,没有云服务依赖。建议先小范围试跑,调好参数再出最终大图。

这篇文章对你有帮助吗?

发表回复