0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

教你们如何用 Python 快速制作海报级地图附代码

Linux爱好者 来源:CSDN技术社区 作者:笼中小夜莺 2021-10-09 11:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1 简介

基于Python中诸如matplotlib等功能丰富、自由度极高的绘图库,我们可以完成各种极富艺术感的可视化作品,关于这一点我在系列文章在模仿中精进数据可视化中已经带大家学习过很多案例了。

而今天我要给大家介绍的这个Pythonprettymaps非常的有趣,基于它,我们只需要简单的代码就可以对地球上给定坐标和范围的任意地区进行地图可视化。

2 利用prettymaps快速制作海报级地图

遗憾的是,prettymaps暂时还不能通过pipconda直接进行安装,但可以利用pip配合git从源码仓库进行安装,对于国内的用户来说,可以使用下面的语句从github的镜像地址快速安装:

pipinstallgit+https://hub.fastgit.org/marceloprates/prettymaps.git

安装完成后,如果下面的语句执行无误,那么恭喜你已经安装完成:

fromprettymapsimport*

2.1 prettymaps的几种使用方式

prettymaps无需用户自行准备数据,会根据用户设定的坐标和范围大小来自动从OpenStreetMap上获取相应范围内的矢量数据作为绘图素材,主要有以下几种使用方式:

2.1.1 圆形模式

prettymaps中最简单的绘图模式为「圆形模式」,我们只需要传入中心点经纬度坐标,以及半径范围(单位:米)即可,下面的例子来自官方示例程序,我将其地点换成以上海外滩为中心向外2500米范围:

fromprettymapsimport*
frommatplotlibimportpyplotasplt

#创建图床
fig,ax=plt.subplots(figsize=(12,12),constrained_layout=True)

layers=plot(
(31.23346,121.492154),#圆心坐标,格式:(纬度, 经度)
radius=2500,#半径
ax=ax,#绑定图床
layers={
'perimeter':{},#控制绘图模式,{}即相当于圆形绘图模式
#下面的参数用于定义从OsmStreetMap选择获取的矢量图层要素,不了解的无需改动照搬即可
'streets':{
'custom_filter':'["highway"~"motorway|trunk|primary|secondary|tertiary|residential|service|unclassified|pedestrian|footway"]',
'width':{
'motorway':5,
'trunk':5,
'primary':4.5,
'secondary':4,
'tertiary':3.5,
'residential':3,
'service':2,
'unclassified':2,
'pedestrian':2,
'footway':1,
}
},
'building':{'tags':{'building':True,'landuse':'construction'},'union':False},
'water':{'tags':{'natural':['water','bay']}},
'green':{'tags':{'landuse':'grass','natural':['island','wood'],'leisure':'park'}},
'forest':{'tags':{'landuse':'forest'}},
'parking':{'tags':{'amenity':'parking','highway':'pedestrian','man_made':'pier'}}
},
#下面的参数用于定义OpenStreetMap中不同矢量图层的样式,嫌麻烦的直接照抄下面的官方示例即可
drawing_kwargs={
'background':{'fc':'#F2F4CB','ec':'#dadbc1','hatch':'ooo...','zorder':-1},
'perimeter':{'fc':'#F2F4CB','ec':'#dadbc1','lw':0,'hatch':'ooo...','zorder':0},
'green':{'fc':'#D0F1BF','ec':'#2F3737','lw':1,'zorder':1},
'forest':{'fc':'#64B96A','ec':'#2F3737','lw':1,'zorder':1},
'water':{'fc':'#a1e3ff','ec':'#2F3737','hatch':'ooo...','hatch_c':'#85c9e6','lw':1,'zorder':2},
'parking':{'fc':'#F2F4CB','ec':'#2F3737','lw':1,'zorder':3},
'streets':{'fc':'#2F3737','ec':'#475657','alpha':1,'lw':0,'zorder':3},
'building':{'palette':['#FFC857','#E9724C','#C5283D'],'ec':'#2F3737','lw':.5,'zorder':4},
},

osm_credit={'color':'#2F3737'}
)

#导出图片文件
plt.savefig('上海外滩-圆形模式.png',dpi=500)

2.1.2 圆角矩形模式

除了上述的「圆形模式」之外,prettymaps中还可以使用「圆角矩形模式」,同样需要定义中心点坐标和半径,接着为参数layers下的每个键值对添加键值对{'circle': False, 'dilate': 圆角半径}即可,其中圆角半径为数值型,这次我们换一个地方,以故宫为例,半径选择600米:

#创建图床
fig,ax=plt.subplots(figsize=(12,12),constrained_layout=True)

dilate=100

layers=plot(
(39.91645697864148,116.39077532493388),#圆心坐标,格式:(纬度, 经度)
radius=600,#半径
ax=ax,#绑定图床
layers={
'perimeter':{'circle':False,'dilate':dilate},#控制绘图模式,{}即相当于圆形绘图模式
#下面的参数用于定义从OsmStreetMap选择获取的矢量图层要素,不了解的无需改动照搬即可
'streets':{
'custom_filter':'["highway"~"motorway|trunk|primary|secondary|tertiary|residential|service|unclassified|pedestrian|footway"]',
'width':{
'motorway':5,
'trunk':5,
'primary':4.5,
'secondary':4,
'tertiary':3.5,
'residential':3,
'service':2,
'unclassified':2,
'pedestrian':2,
'footway':1,
},
'circle':False,'dilate':dilate
},
'building':{'tags':{'building':True,'landuse':'construction'},'union':False,'circle':False,'dilate':dilate},
'water':{'tags':{'natural':['water','bay']},'circle':False,'dilate':dilate},
'green':{'tags':{'landuse':'grass','natural':['island','wood'],'leisure':'park'},'circle':False,'dilate':dilate},
'forest':{'tags':{'landuse':'forest'},'circle':False,'dilate':dilate},
'parking':{'tags':{'amenity':'parking','highway':'pedestrian','man_made':'pier'},'circle':False,'dilate':dilate}
},
#下面的参数用于定义OpenStreetMap中不同矢量图层的样式,嫌麻烦的直接照抄下面的官方示例即可
drawing_kwargs={
'background':{'fc':'#F2F4CB','ec':'#dadbc1','hatch':'ooo...','zorder':-1},
'perimeter':{'fc':'#F2F4CB','ec':'#dadbc1','lw':0,'hatch':'ooo...','zorder':0},
'green':{'fc':'#D0F1BF','ec':'#2F3737','lw':1,'zorder':1},
'forest':{'fc':'#64B96A','ec':'#2F3737','lw':1,'zorder':1},
'water':{'fc':'#a1e3ff','ec':'#2F3737','hatch':'ooo...','hatch_c':'#85c9e6','lw':1,'zorder':2},
'parking':{'fc':'#F2F4CB','ec':'#2F3737','lw':1,'zorder':3},
'streets':{'fc':'#2F3737','ec':'#475657','alpha':1,'lw':0,'zorder':3},
'building':{'palette':['#FFC857','#E9724C','#C5283D'],'ec':'#2F3737','lw':.5,'zorder':4},
},

osm_credit={'color':'#2F3737'}
)

#导出图片文件
plt.savefig('北京故宫-圆角矩形模式.png',dpi=500)

2.1.3 添加文字内容

有了这样美观大方的艺术地图,我们还可以基于matplotlib中自定义字体的方法,在地图上添加标注信息,仍然以上海外滩为例,我们利用外部的书法字体,在正中心绘制文字标注信息:

importmatplotlib.font_managerasfm

#创建图床
fig,ax=plt.subplots(figsize=(12,12),constrained_layout=True)

layers=plot(
(31.23346,121.492154),#圆心坐标,格式:(纬度, 经度)
radius=2500,#半径
ax=ax,#绑定图床
layers={
'perimeter':{},#控制绘图模式,{}即相当于圆形绘图模式
#下面的参数用于定义从OsmStreetMap选择获取的矢量图层要素,不了解的无需改动照搬即可
'streets':{
'custom_filter':'["highway"~"motorway|trunk|primary|secondary|tertiary|residential|service|unclassified|pedestrian|footway"]',
'width':{
'motorway':5,
'trunk':5,
'primary':4.5,
'secondary':4,
'tertiary':3.5,
'residential':3,
'service':2,
'unclassified':2,
'pedestrian':2,
'footway':1,
}
},
'building':{'tags':{'building':True,'landuse':'construction'},'union':False},
'water':{'tags':{'natural':['water','bay']}},
'green':{'tags':{'landuse':'grass','natural':['island','wood'],'leisure':'park'}},
'forest':{'tags':{'landuse':'forest'}},
'parking':{'tags':{'amenity':'parking','highway':'pedestrian','man_made':'pier'}}
},
#下面的参数用于定义OpenStreetMap中不同矢量图层的样式,嫌麻烦的直接照抄下面的官方示例即可
drawing_kwargs={
'background':{'fc':'#F2F4CB','ec':'#dadbc1','hatch':'ooo...','zorder':-1},
'perimeter':{'fc':'#F2F4CB','ec':'#dadbc1','lw':0,'hatch':'ooo...','zorder':0},
'green':{'fc':'#D0F1BF','ec':'#2F3737','lw':1,'zorder':1},
'forest':{'fc':'#64B96A','ec':'#2F3737','lw':1,'zorder':1},
'water':{'fc':'#a1e3ff','ec':'#2F3737','hatch':'ooo...','hatch_c':'#85c9e6','lw':1,'zorder':2},
'parking':{'fc':'#F2F4CB','ec':'#2F3737','lw':1,'zorder':3},
'streets':{'fc':'#2F3737','ec':'#475657','alpha':1,'lw':0,'zorder':3},
'building':{'palette':['#FFC857','#E9724C','#C5283D'],'ec':'#2F3737','lw':.5,'zorder':4},
},

osm_credit={'color':'#2F373700'}
)

#添加文字标注
ax.text(
0.5,0.5,
'外滩,上海',
zorder=6,
ha='center',
va='center',
fontsize=120,
fontproperties=fm.FontProperties(fname='FZZJ-HLYHXSJW.TTF'),
transform=ax.transAxes
)

#导出图片文件
plt.savefig('上海外滩-添加文字标注.png',dpi=500)

你可以找到你关注地点的经纬度坐标,尽情地绘制出各种艺术地图作品,譬如下面这些地标:

编辑:jq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73145
  • python
    +关注

    关注

    57

    文章

    4857

    浏览量

    89579

原文标题:用 Python 快速制作海报级地图

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    从高精地图到轻地图,再到“无图”,谁才是真需求?

    [首发于智驾最前沿微信公众号]如果将自动驾驶发展以时间轴拉开,地图的应用可以分为高精地图、轻地图,以及所谓的“无图”或“模型化地图”三个阶段。高精
    的头像 发表于 11-10 09:50 656次阅读
    从高精<b class='flag-5'>地图</b>到轻<b class='flag-5'>地图</b>,再到“无图”,谁才是真需求?

    淘宝商品详情接口(item_get)企业全解析:参数配置、签名机制与 Python 代码实战

    本文详解淘宝开放平台taobao.item_get接口对接全流程,涵盖参数配置、MD5签名生成、Python企业代码实现及高频问题排查,提供可落地的实战方案,助你高效稳定获取商品数据。
    的头像 发表于 09-26 09:13 465次阅读
    淘宝商品详情接口(item_get)企业<b class='flag-5'>级</b>全解析:参数配置、签名机制与 <b class='flag-5'>Python</b> <b class='flag-5'>代码</b>实战

    如何制作一张自动驾驶高精度地图

    厘米的精确参考。那么一份能够满足自动驾驶需求的高精度地图到底是如何生成的?其背后又依赖了哪些关键技术? 想要生成一张合格的高精度地图,需要“眼睛”先看懂路,这个“眼睛”来自于多传感器的数据采集平台。常见的做法是借助
    的头像 发表于 07-18 09:08 590次阅读
    如何<b class='flag-5'>制作</b>一张自动驾驶高精度<b class='flag-5'>地图</b>?

    高德地图携手华为推出长隧道车道导航

    高德地图携手华为Pura80系列,支持超长隧道全程车道导航,为行车安全与效率带来全新升级。
    的头像 发表于 07-02 16:44 1042次阅读

    鸿蒙地图功能开发【3. 代码开发】##地图开发##

    ​ 在完成了前期准备工作之后,就可以正式进入到代码开发的工作中,在官方文档中,相关的代码是很全的,从支持的功能上来看,相比于三方SDK更加全面。 基本项目中包含的地图展示、marker、路径规划等
    发表于 06-29 22:59

    鸿蒙地图功能开发【1. 开发准备】##地图开发##

    证书(能否模拟器还没测试过),但是问题在于,文档不全,示例代码有问题,如果一定要用三方的SDK的,目前推荐使用高德地图,百度的直接代码就会有报错 Web组件这里涉及到的就是ArkWeb(方舟web
    发表于 06-29 22:52

    鸿蒙5开发宝藏案例分享---一多开发实例(地图导航)

    ? 鸿蒙开发隐藏宝藏大公开!手把手教你玩转\"一多\"地图导航案例 ? 大家好呀!我是你们的老朋友,今天要给大家扒一扒鸿蒙官方文档里那些\"藏得深\"的实战
    发表于 06-03 16:17

    基于STM32的卫星GPS路径记录仪(完整源代码)实例项目下载

    基于STM32的卫星GPS路径记录仪(完整源代码)实例项目推荐下载!
    发表于 05-29 21:35

    基于STM32的卫星GPS路径记录仪(完整源代码

    基于STM32的卫星GPS路径记录仪(完整源代码) 项目实例下载! 纯分享帖,需要者可点击附件免费获取完整资料~~~【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第一时间告知,删除内容!
    发表于 05-23 20:48

    何用FastMCP快速开发自己的MCP Server?

    作者:算力魔方创始人/英特尔创新大使刘力很多读者反馈:通过 《用MCP将百度地图能力轻松接入DeepSeek》 和 《如何用DeepSeek+MCP实现AutoGLM沉思的能力?》 的实战,真真切切
    的头像 发表于 05-07 16:07 2445次阅读
    如<b class='flag-5'>何用</b>FastMCP<b class='flag-5'>快速</b>开发自己的MCP Server?

    创建了用于OpenVINO™推理的自定义C++和Python代码,从C++代码中获得的结果与Python代码不同是为什么?

    创建了用于OpenVINO™推理的自定义 C++ 和 Python* 代码。 在两个推理过程中使用相同的图像和模型。 从 C++ 代码中获得的结果与 Python*
    发表于 03-06 06:22

    何用QGIS下载天地图影像图

    无论是城市交通规划中的道路拓宽,还是交通仿真中的场景构建,卫星影像图都是不可或缺的工具。今天,就让我们一起探索如何在QGIS中轻松下载带坐标系的天地图影像图,为我们的项目添砖加瓦!
    的头像 发表于 02-20 13:52 5245次阅读
    如<b class='flag-5'>何用</b>QGIS下载天<b class='flag-5'>地图</b>影像图

    Python绘图Matplotlib快速参考手册

     PYTHON
    发表于 02-07 14:04 0次下载

    使用Python实现xgboost教程

    装: bash复制代码conda install -c conda-forge xgboost 2. 导入必要的库 在你的Python脚本或Jupyter Notebook中,导入必要的库: python复制
    的头像 发表于 01-19 11:21 2214次阅读

    从《自动驾驶地图数据规范》聊高精地图在自动驾驶中的重要性

    自动驾驶地图作为L3及以上自动驾驶技术的核心基础设施,其重要性随着智能驾驶技术的发展愈发显著。《自动驾驶地图数据规范》(DB11/T 2041-2022)由北京市规划和自然资源委员会制定,旨在
    的头像 发表于 01-05 19:24 2865次阅读
    从《自动驾驶<b class='flag-5'>地图</b>数据规范》聊高精<b class='flag-5'>地图</b>在自动驾驶中的重要性