MapToPoster:用 Python 创建极简城市海报

MapToPoster:用 Python 创建极简城市海报

如果您曾想为最爱城市制作一幅干净、艺术化的地图,MapToPoster 就是您的利器。它是一个 纯 Python 的开源项目,利用 Matplotlib 将 OpenStreetMap (OSM) 数据拼接成精致海报。无论您是业余制图师、寻找独特背景的设计师,还是需要可视化辅助的数据科学家,本仓库都能为您提供一站式解决方案。


1. MapToPoster 为您提供的功能

功能 描述
零配置生成 单条 CLI 调用即可生成聚焦在您所选半径的城市 PNG。
18 款现成主题 从经典黑白到未来霓虹赛博朋克,每个主题会自动调整背景、道路颜色和渐变。
可定制主题 JSON 通过编辑 themes/{name}.json 文件,您可以控制每一条颜色通道,打造专属主题。
灵活距离 根据需求可选 4 km(市中心)至 20 km(全城)半径。
可移植 代码仅依赖完善维护的库:osmnxnetworkxmatplotlib。您只需 Python 3.9+。
MIT 许可证 免费使用、修改与再发布。

2. 快速开始

  1. 克隆仓库

    git clone https://github.com/originalankur/maptoposter.git
    cd maptoposter
    

  2. 创建虚拟环境(推荐)

    python -m venv .venv
    source .venv/bin/activate   # Windows: .venv\Scripts\activate
    

  3. 安装依赖

    pip install -r requirements.txt
    

  4. 生成海报

    python create_map_poster.py -c "Barcelona" -C "Spain" -t warm_beige -d 8000
    

    *结果:posters/barcelona_warm_beige_20260108_172924.png 已创建。

您可以用任意城市/国家对与主题名替换参数。执行 python create_map_poster.py --list-themes 查看全部可用选项。


3. 主题一览

主题 风格 理想用例
feature_based 经典黑白配道路层级 文本密集地图图例
gradient_roads 平滑渐变道路 科学可视化
noir 纯黑背景,白色道路 电影/网站海报艺术
midnight_blue 海军蓝背景,金色道路 夜间城市氛围
blueprint 建筑蓝图 建筑项目
neon_cyberpunk 暗色配电光粉/青色 未来游戏背景
warm_beige 胶片棕色调 复古城市氛围
pastel_dream 柔和粉彩 轻松婚礼请柬
japanese_ink 极简墨色 文化作品
forest 深绿 自然主题
ocean 蓝色与青绿色 海滨城市布局
terracotta 地中海温暖 温暖旅行海报
sunset 温暖橙色 日落城市艺术
autumn 烧焦红 秋季主题
copper_patina 氧化铜 工业或复古美学
monochrome_blue 单色蓝 企业品牌

4. 进一步扩展 MapToPoster

4.1 添加新主题

  1. themes/ 目录下创建 JSON 文件,例如 my_fantasy.json
    {
      "name": "Fantasy",
      "description": "A whimsical map theme",
      "bg": "#111111",
      "text": "#AAFFAA",
      "gradient_color": "#22AA22",
      "water": "#004400",
      "parks": "#006600",
      "road_motorway": "#FF0044",
      "road_primary": "#FF8844",
      "road_secondary": "#FFCC44",
      "road_tertiary": "#FFF444",
      "road_residential": "#999999",
      "road_default": "#666666"
    }
    
  2. 使用 -t fantasy 运行海报生成器。

4.2 添加新地图图层

若想在道路之前绘制铁路:

# 在 create_map_poster.py 的 parks 获取后插入
try:
    railways = ox.features_from_point(point, tags={"railway": "rail"}, dist=dist)
except Exception:
    railways = None
if railways is not None and not railways.empty:
    railways.plot(ax=ax, color=THEME["railway"], linewidth=0.5, zorder=2.5)
请确认在主题 JSON 中为 railway 定义颜色。


5. 性能注意事项

  • 距离限制:大半径会拖慢 OSM 数据下载速度。保持 -d ≤ 20 km 可快速完成。
  • 缓存:OSMnx 自动本地缓存 OSM 数据,重复使用同一城市会明显加快。
  • 网络类型:默认 drive;切换到 walkbike 可降低数据量。
  • DPI:默认 300 dpi;视预览需改为 150 dpi。

6. 为什么选择 MapToPoster?

  • 零额外开销:不需要账号或 API 密钥;所有数据直接从 OSM 拉取。
  • 创意控制:主题模块化,设计师可随意调整颜色、渐变与排版。
  • 可复现:脚本确定性——相同输入每次都会渲染相同图片。
  • 社区驱动:拥有近 5 k 星标与 394 fork,项目得到了活跃社区支持。

7. 今日立刻上手

  1. Fork 或克隆仓库。
  2. 浏览现有主题并运行数个示例。
  3. 构建自己的海报并分享至社交媒体,或嵌入博客。
  4. 贡献:若发现 bug 或建议新主题,提交 issue;若已有改进,提交 pull request。

MapToPoster 将城市街道网络转化为视觉叙事。不论是制作旅游指南、背景艺术还是学术插图,本项目都为您提供一种快速、可扩展且美观的地图海报生成方式——全靠开源技术驱动。

祝绘图愉快!

原创文章: 查看原文

分享本文