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

    文章

    4748

    浏览量

    68356
  • python
    +关注

    关注

    56

    文章

    4782

    浏览量

    84453

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

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

收藏 人收藏

    评论

    相关推荐

    使用Python进行图像处理

    下面是一个关于使用Python在几行代码中分析城市轮廓线的快速教程。
    的头像 发表于 11-07 10:14 140次阅读
    使用<b class='flag-5'>Python</b>进行图像处理

    学鸿蒙的1万个理由,北京中关村现大幅鸿蒙海报

    五一假期以来,北京中关村附近多个地铁站、公交站出现大幅鸿蒙海报。据统计,不止中关村,北京杭州两地清华、北大、浙江大学等多所高校附近也挂上了巨幅鸿蒙海报。 学鸿蒙,突破自我,Get职场”星“技能;学
    发表于 05-08 20:31

    基于Python地图绘制教程

    本文将介绍通过Python绘制地形图的方法,所需第三方Python相关模块包括 rasterio、geopandas、cartopy 等,可通过 pip 等方式安装。
    的头像 发表于 02-26 09:53 1121次阅读
    基于<b class='flag-5'>Python</b>的<b class='flag-5'>地图</b>绘制教程

    谷歌升级Bard AI聊天机器人为Gemini,新增Python代码编辑功能

     此外,谷歌表示,接下来数个月内,Gemini Advanced 计划会加入更多新功能,如支持更为详尽的上下文信息、增强多模态交互性以及完善编程功能。据谷歌公开更新,付费用户可用 Gemini 界面直接编辑和执行 Python 代码,有助于
    的头像 发表于 02-20 15:47 546次阅读

    Python智能家居系统代码介绍

    Python智能家居系统是一种基于Python编程语言开发的智能家居控制系统,在现代家庭中得到了越来越广泛的应用。本文将详细介绍Python智能家居系统的代码实现,包括系统的结构与功能
    的头像 发表于 01-25 09:46 1272次阅读

    快速制作PCB中的秘密

    快速制作PCB中的秘密
    的头像 发表于 12-14 18:27 741次阅读
    <b class='flag-5'>快速</b><b class='flag-5'>制作</b>PCB中的秘密

    何用万界星空科技低代码平台快速开发一个MES系统?

    如今,越来越多的企业选择低代码开发平台,让企业实现数字化转型。但是你好奇“低代码开发平台”能做什么吗?“低代码开发平台”是指用于快速开发应用软件的系统
    的头像 发表于 12-08 11:39 550次阅读
    如<b class='flag-5'>何用</b>万界星空科技低<b class='flag-5'>代码</b>平台<b class='flag-5'>快速</b>开发一个MES系统?

    哪些晶体、谐振器和振荡器可旋转180°使用?一招儿教你快速识别

    哪些晶体、谐振器和振荡器可旋转180°使用?一招儿教你快速识别
    的头像 发表于 12-05 16:37 374次阅读
    哪些晶体、谐振器和振荡器可旋转180°使用?一招儿<b class='flag-5'>教你</b><b class='flag-5'>快速</b>识别

    python中运算符的优先大小

    Python中运算符的优先决定了表达式中各个运算符的计算顺序。了解运算符的优先对于正确理解和编写复杂的表达式非常重要。本文将详细介绍Python中运算符的优先
    的头像 发表于 11-29 16:21 3247次阅读

    python运行指定几行

    Python是一种高级编程语言,可以用于开发各种类型的应用程序,包括网站、桌面应用程序、数据分析和人工智能等。在Python中运行指定的几行代码十分简单,它不仅能够帮助程序员快速开发软
    的头像 发表于 11-29 15:04 926次阅读

    python软件IDLE怎么打多行代码

    用于编写、编辑和运行Python代码的编辑器窗口。在IDLE中编写多行代码有几种方法可以实现。 使用括号与换行符: 在IDLE中编写多行代码的一种常见方法是使用括号来将多行
    的头像 发表于 11-29 15:00 3949次阅读

    python shell怎么用

    Python Shell是一种交互式解释器,可以通过命令行直接运行Python代码。在Shell中,可以输入一行代码并立即得到结果,非常适合于测试、尝试新
    的头像 发表于 11-29 14:36 1101次阅读

    python语言特点有哪些

    、详实和细致的描述,共计超过1500字。 简洁优雅: Python以简洁和优雅的语法而著称。相对于其他编程语言,Python代码通常看起来更加清晰易读。这得益于Python采用了面向对
    的头像 发表于 11-29 14:29 1047次阅读

    python软件怎么运行代码

    Python是一种高级编程语言,它被广泛用于开发各种类型的应用程序,从简单的脚本到复杂的网络应用和机器学习模型。要运行Python代码,您需要一个Python解释器,它可以将您的
    的头像 发表于 11-28 16:02 861次阅读

    绘制同切圆python代码怎么运行

    绘制同切圆是一个很有趣的数学问题,可以使用Python语言进行实现。在这篇文章中,我们将探讨同切圆的概念、绘制同切圆的算法和Python代码的实现。 同切圆的概念 同切圆是指具有相同圆心但半径
    的头像 发表于 11-28 15:55 1483次阅读