你有没有过这种念头:把自己生活过、或者特别喜欢的城市,做成一张海报挂墙上?
我前阵子翻 GitHub 的时候撞见一个叫 MapToPoster 的小工具,试了一把,确实挺对味——它干的事很简单:你给它一个城市名,它从开源地图里把路网抠出来,画成一张极简风格的海报。巴黎、东京、纽约,各有各的"路纹",像 fingerprints 一样。

一句话先说结论
如果你想要的是"一张好看、独特、能打印的城市地图海报",又不想学设计软件、也不想付地图 API 的钱,这个项目基本能对上需求。它基于 OpenStreetMap(一个免费的、由全球网友共同维护的开放式地图数据库,相当于"地图界的维基百科"),纯 Python 实现,命令行敲一行就出图。
社区规模不算小(GitHub 上 9k+ 收藏、15 位贡献者在持续维护),协议是 MIT(最宽松的开源协议,随便用、改、商用都行,只要保留版权声明),可以放心玩。
它到底是怎么把地图变成海报的?
我扒了一下它的源码,流程其实不复杂,理清了就很好懂:

拆开来看就五步:
打个比方:OSMnx 负责"去图书馆把这座城市的道路图纸借出来",matplotlib 负责"按你选的画风把它临摹成一张画",Nominatim 就是那个"告诉你图书馆在哪一排书架"的管理员。
17 套主题,挑花眼
这项目最让我意外的是主题数量——足足 17 套,从极简黑白到霓虹赛博朋克都有。每套本质就是一个 JSON 文件(一种轻量的配置文件格式,用大括号存键值对,人能直接读),里面写好了背景色、道路各等级的颜色。
我跑了几个真实输出,给你看效果(都是同一类"城市路网"母题,区别全在配色):
| noir | 纯黑底 + 白线 | 极简控、现代风房间 |
| midnight_blue | 深蓝底 + 金线 | 偏商务、沉稳 |
| blueprint | 工程蓝图风 | 建筑/工程主题 |
| neon_cyberpunk | 霓虹赛博朋克 | 科技感、年轻人房间 |
| gradient_roads | 渐变着色道路 | 艺术、创意 |
| contrast_zones | 高对比密度 | 强调城市结构 |
| warm_beige | 复古棕褐 | 怀旧、暖色调 |
| pastel_dream | 柔和粉彩 | 梦幻、少女风 |
| japanese_ink | 日式水墨 | 东方审美 |
| emerald | 翠绿调 | 自然、生态 |
| forest | 深绿 + 鼠尾草绿 | 森林、自然主题 |
| ocean | 蓝青调 | 沿海城市 |
| terracotta | 地中海暖色 | 度假风 |
| sunset | 暖橙到粉 | 浪漫、温暖 |
| autumn | 秋叶橙红 | 季节感 |
| copper_patina | 氧化铜金属感 | 工业、金属风 |
| monochrome_blue | 单色蓝系 | 统一、简洁 |
下面放几张我实际生成的图,比表格直观:

巴塞罗那,复古棕褐调,道路纹理像老地图。

迪拜,深蓝配金线,网格感很强。

旧金山,暖橙到粉的渐变,临海城市的地形一眼能看出来。

新加坡,霓虹赛博朋克,密集路网在暗底上发光的那种感觉。
看出来了吧:同样是"路网",换套配色气质完全两样。这也是我觉得它最值得玩的地方。
怎么装、怎么跑
我是在本地 macOS 上跑的,Linux / Windows 同理。
先把项目拉下来、装依赖:
# 1. 克隆项目
git clone https://github.com/originalankur/maptoposter.git
cd maptoposter
# 2. 安装依赖
pip install -r requirements.txt
# 或者走 pyproject(相当于项目的"安装说明书")
pip install -e .
主要依赖就四个:osmnx(拉地图)、matplotlib(画图)、geopy(地理编码)、requests(调 Google Fonts)。
最朴素的一行命令——生成巴黎的极简黑白海报:
python create_map_poster.py -c "Paris" -C "France" -t noir -d 10000
参数简单说一下:-c 城市、-C 国家、-t 主题、-d 半径(单位米)。这条会先查巴黎坐标,再抓周围 10km 的路网,用 noir 主题出图,存到 posters/ 目录,文件名类似 Paris_noir_20260208_143022.png。
其他常用姿势:
# 换个主题/城市
python create_map_poster.py -c "Tokyo" -C "Japan" -t neon_cyberpunk -d 15000
python create_map_poster.py -c "New York" -C "USA" -t blueprint -d 12000
# 不想写城市名,直接给经纬度(比如上海人民广场附近)
python create_map_poster.py –city "Shanghai" –country "China" \\
-lat 31.2304 -long 121.4737 -t sunset -d 10000
# 看看一共有哪些主题
python create_map_poster.py –list-themes
# 同一个城市把 17 套全跑一遍
python create_map_poster.py -c "Paris" -C "France" –all-themes -d 10000
小提醒:第一次跑某个城市会现下数据,慢一点;OSMnx 有缓存,第二次同区域就快了。
我亲测好用的几个场景
不是所有工具都"有用",但下面这几个我觉得真能落地:
1. 做旅行纪念系列
欧洲玩了一圈,回来给每个去过的城市生成一张同风格海报,打印出来一排挂墙上,比朋友圈九宫格有质感多了。写个 shell 循环就行:
#!/bin/bash
cities=("Paris:France" "London:UK" "Rome:Italy" "Barcelona:Spain")
theme="noir"
for city_country in "${cities[@]}"; do
IFS=':' read -r city country <<< "$city_country"
python create_map_poster.py -c "$city" -C "$country" -t "$theme" -d 10000
done
2. 给设计项目找地图素材
做品牌提案需要城市元素?–all-themes 一次出 17 张,挑最贴调性的那张,比自己用 AI 生图可控。
3. 城市规划 / 展示
规划师想对比两个片区的路网密度,直接用坐标定点、用 contrast_zones 主题,结构差异一目了然。
4. 艺术创作
艺术家做城市主题展,同一座城跑不同主题,挑最符合理念的放大输出。
想折腾?自定义主题超简单
我翻了下主题文件,就是个 JSON,所以你自己配色毫无门槛。在 themes/ 下新建一个文件就行:
{
"name": "My Custom Theme",
"description": "A custom theme with warm colors",
"bg": "#2C1810",
"text": "#F5E6D3",
"gradient_color": "#2C1810",
"water": "#1A4A5C",
"parks": "#3A5A3A",
"road_motorway": "#E8B86D",
"road_primary": "#D4A574",
"road_secondary": "#C0956A",
"road_tertiary": "#AD8560",
"road_residential": "#9A7556",
"road_default": "#AD8560"
}
存成 themes/my_custom_theme.json,然后:
python create_map_poster.py -c "Paris" -C "France" -t my_custom_theme -d 10000
配色有个小经验:道路等级越高(高速 > 主干 > 次干 > 支路),颜色越亮、线越粗,这样层次才清楚。想加铁路之类的新元素,改下 create_poster() 函数、在 JSON 里补个颜色字段就能扩。
踩过的坑(省得你再踩)
我把社区 Issues 和自己的实测凑了凑,高频问题就这几个:
- 地名查不到坐标:别写 "NYC",写 "New York";或者直接给经纬度跳过这步(见上面 -lat/-long 用法)。Nominatim 要联网。
- 下数据太慢:把 -d 从 20000 降到 10000,差距明显;用 network_type='drive'(只抓机动车路)比 'all' 快。
- 路太密或太疏:调 -d。太疏就加大,太密就减小;市中心太挤可以略微偏移中心点。
- 中文字体乱码:确保 fonts/ 里有对应字体的文件,或者让脚本从 Google Fonts 自动下(要联网)。
- 内存爆了:大城市把 -d 调小,或 DPI 从 300 降到 150 先出预览。
还有个挺贴心的细节:它会自动识别文字是不是拉丁字母。拉丁字母(Paris)会拉开字间距变成 “P A R I S” 那种海报感;中文、日文、阿拉伯文就用正常间距,不会瞎排版。
跟别的方案比,它强在哪?
| 成本 | 完全免费 | 按量收费 | 按量收费 | 免费但功能少 |
| 数据来源 | OpenStreetMap(开源) | Google 专有 | Mapbox 专有 | 多种 |
| 可定制 | 高(代码全开源) | 有限 | 中等 | 通常较低 |
| 主题 | 17 套开箱即用 | 有限 | 要自己设计 | 通常无 |
| 离线 | 缓存后支持 | 不支持 | 不支持 | 部分支持 |
简单讲:要省钱 + 要可控 + 要好看,它基本是唯一解。代价是你得会跑命令行、自己调参数,不是开箱即用的网页工具。
最后
MapToPoster 不是什么黑科技,但它把一个"想做城市海报"的小需求做得又轻又好看。纯 Python、代码能读、主题能改,对我来说这种"能完全掌控输出"的工具比闭源 SaaS 舒服得多。
如果你也想要一张属于自己的城市海报,花十分钟跑一下,大概率会像我一样,顺手把去过的地方都出了一遍。
- 项目地址:https://github.com/originalankur/maptoposter
- 协议:MIT(放心用)


