10分钟学会用Python绘制手绘风格城市地图
本教程教你用Python的prettymaps库从OpenStreetMap获取真实地理数据,通过简洁代码生成可定制配色、道路层级和高分辨率输出的艺术地图。学完可直接应用于项目汇报封面、个人壁纸或印刷海报制作。

10分钟学会用Python绘制手绘风格城市地图
项目汇报时,普通的地图截图往往显得呆板无趣。借助Python的prettymaps开源库,你可以将真实的地理数据转化为手绘艺术风格的地图,效果媲美专业设计软件。整个过程只需几行代码,成品可直接用作PPT封面、手机壁纸或印刷海报。
环境安装与依赖说明
运行教程代码需要Python 3.8及以上版本。终端中执行以下命令安装三个核心依赖包:
bash
pip install prettymaps osmnx matplotlib
这三个库各自承担不同职责:osmnx专门负责从OpenStreetMap平台获取道路网络、建筑轮廓、河流边界等真实地理矢量数据;prettymaps作为中间层,将原始地理数据转换为Matplotlib可识别的图形配置对象;matplotlib则提供底层渲染能力,最终输出高质量图像。
Windows用户在安装过程中如果遇到geopandas相关的编译错误,推荐使用conda环境。先执行conda install -c conda-forge geopandas解决依赖问题,再重新运行pip安装命令即可顺利配置。
五行代码生成基础地图
导入plot函数后,只需指定位置名称、搜索半径和预设风格,就能立刻看到效果:
python
from prettymaps import plot
plot(
location='Shanghai, China',
circle=10000,
style='poster'
)
location参数接受任意可被识别的地址,库会自动调用地理编码服务获取经纬度。circle参数以米为单位划定圆形搜索区域,数值设置越大包含的细节反而越少,因为系统会自动抽稀数据以保持渲染性能。style参数提供三种内置模板:default呈现标准地图样式,watercolor模拟水彩笔触,poster则采用高对比度的海报设计风格。
代码执行后会弹出预览窗口。注意第一次指定某个区域时,系统需要联网下载该区域的OpenStreetMap数据并建立本地缓存,后续调用同一位置会直接读取缓存文件,速度明显提升。
进阶定制打造专属地图
内置风格模板往往不够满足个性化需求。通过presets模块加载默认配置后,你可以逐项调整视觉元素的呈现方式:
python
from prettymaps import plot, presets
config = presets.get('default')
config['building_colors'] = {
'residential': '#f5e6d3',
'commercial': '#a8d8ea',
}
config['road_widths']['primary'] = 3.0
config['road_colors']['primary'] = '#7f8c8d'
config['show_water'] = False
plot(
location='Kyoto, Japan',
circle=8000,
style=config,
output='kyoto_artmap.png',
dpi=300
)
building_colors是一个字典结构,键名对应OpenStreetMap中的建筑分类标签,键值使用十六进制颜色码。调整建筑配色时建议选用低饱和度的柔和色调,避免视觉疲劳。
道路系统通过road_widths和road_colors两个字典控制。primary指城市主干道,建议将其宽度值设为次干道的1.5倍以上,形成清晰的视觉层级。颜色选择中性灰调能让建筑主体更加突出。
show_water参数控制河流湖泊等水系的显示开关。某些场景下水系会干扰主体表达,关闭后画面更简洁。
output参数指定输出文件路径,设置后程序不会弹出预览窗口,直接保存图片到本地。配合dpi=300参数,输出图像达到印刷级清晰度,满足实体海报制作需求。
常见报错与解决方案
处理大范围地理数据时,半径参数超过15000米容易触发MemoryError内存溢出。此时添加timeout=60参数限制超时时间,或缩小搜索半径重试。
部分系统运行后地图标注出现方框乱码,属于字体缺失问题。在配置字典中添加font_family='sans-serif'可切换为系统默认无衬线字体。Windows环境还需执行matplotlib.font_manager._rebuild()重建字体缓存。
偏远乡镇或新建开发区可能因OpenStreetMap志愿者贡献不足导致数据空白。调用osmnx.geocode()函数预先验证地址能否成功解析,避免无效请求浪费时间。
扩展学习路径
presets模块内置多个预设配置模板,通过组合调用可以创造独特风格。研究shapely库的几何运算方法,能够实现不规则边界裁剪、多区域拼接等高级操作。项目官方examples目录提供30余种风格示例代码,涵盖极简线条、复古版画、霓虹夜景等视觉效果。
打开命令行工具,输入你所在城市的名称,即刻体验数据转化为艺术的过程。