使用 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)。 - circle、radius 和 dilate 控制画布边界。你可以把地图裁剪成指定半径(米)的完美圆形,也可以保留矩形区域。
- preset 加载现成的样式配置(例如
default、minimal、macao或tijuca),无需从头构建配色方案。
配置特定位置的示例:
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 的 fig 和 ax 对象引用。如果你想用标准 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 可靠地获取数据,结果可预测。
相关项目