>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
Python

使用 prettymaps 将 OpenStreetMap 数据变成装饰画

有时候你会遇到一些让人眼前一亮的库。它们不解决复杂的企业问题,也不会让构建速度提升十倍——相反,它们把地理数据变成你想打印出来装裱挂墙的图形。

大约三年前,柔和粉彩色的矢量圆形城市地图在 Reddit 和 Hacker News 上走红。原来这种美学风格出自巴西开发者 Marcelo Prats 的一个小脚本。这个项目叫做 prettymaps

底层原理

这个库的架构很简单。它使用 osmnx 从 OpenStreetMap 获取原始地理要素,用 shapely 处理多边形几何,然后通过熟悉的 matplotlib 渲染最终组合。对于准备绘图仪用的矢量轮廓,作者还用了 vsketch

你不需要手动导出图层、过滤道路、河流和建筑标签、配置投影,也不用跟 matplotlib 的坐标轴样式较劲——只需传入一个地址或坐标,就能得到一张现成的图。

快速上手看起来就是这样:

import prettymaps

plot = prettymaps.plot('Stad van de Zon, Heerhugowaard, Netherlands')

一次函数调用就能下载指定区域的数据、切片成图层、然后生成图表。

如何自定义地图

库的完整灵活性体现在 prettymaps.plot() 函数的大量微调选项中。

以下是最常用的参数:

  • layers 定义 OpenStreetMap 图层字典。在这儿设置用于筛选对象的标签:水域(natural: water)、建筑(building: True)、公园、不同类别的街道或铁路轨道。
  • style 为每个图层设置渲染规则。接受熟悉的 matplotlib 参数:填充色(fc)、描边色(ec)、线宽(lw)以及现成的调色板(palette)。
  • circleradiusdilate 控制画布边界。你可以把地图裁剪成指定半径(米)的完美圆形,也可以保留矩形区域。
  • preset 加载现成的样式配置(例如 defaultminimalmacaotijuca),无需从头构建配色方案。

配置特定位置的示例:

plot = prettymaps.plot(
    'Praça Ferreira do Amaral, Macau',
    circle=True,
    radius=1100,
    layers={
        "water": {"tags": {"natural": ["water", "bay"]}},
        "building": {"tags": {"building": True}},
    },
    style={
        "water": {"fc": "#a1e3ff", "ec": "#2F3737"},
        "building": {"palette": ["#FFC857", "#E9724C", "#C5283D"]},
    },
)

函数返回一个 Plot 数据类对象。里面包含每个图层的地理数据框(geodataframes),以及 matplotlib 的 figax 对象引用。如果你想用标准 Python 绘图方法添加自己的注释、标记或标签,这会非常方便。

如何不写代码运行

如果你懒得写代码,或者想快速点击调色板对比不同城市的效果,仓库里包含一个用 streamlit 构建的现成网页界面。

安装包:

pip install prettymaps

启动界面:

streamlit run app.py

为了方便交互实验,作者还准备了一个 marimo(Jupyter 的现代替代品)笔记本。你可以用命令 marimo edit notebooks/tutorial.py 本地打开,或者通过文档中的链接直接在 Google Colab 运行。

实际应用场景

第一个想到的应用是生成艺术和周边商品。以极简风格呈现家乡、城市街区或难忘地点的地图,非常适合做海报、明信片和 T 恤。由于库支持导出矢量轮廓,你可以把图形发送到笔式绘图仪或雕刻机。

第二个场景是报告和演示设计。如果你在做城市研究、分析交通可达性或构建房地产仪表盘,标准地图瓦片往往看起来过于杂乱。这时你可以只保留街区和水域的轮廓,严格使用品牌配色。

许可证和重要注意事项

这个项目有几个值得了解的地方。

代码采用 GNU AGPL v3.0 许可证发布。这意味着有相应的义务:如果你在网络服务的后端使用这个库,就需要开源该服务。

导出图片时必须保留对 OpenStreetMap 和仓库本身的署名——这是地理数据许可证的明确要求。仓库作者还明确反对将生成器用于 NFT 销售,并在 README 中特别强调了这一点。

值得一试吗

这个库把活儿干得很漂亮。如果你曾经需要创建一张漂亮的城市地图,又不想在 Illustrator 或 QGIS 里手动操作,prettymaps 能帮你省下好几个小时。

入门很简单:用 pip 安装包,然后在 Colab 上跑几个示例。项目支持 Python 3.11+,通过 OSM API 可靠地获取数据,结果可预测。

相关项目