用 Python 快速制作海报级地图
作者:费弗里
来源:Python大数据分析
1 简介
基于Python
中诸如matplotlib
等功能丰富、自由度极高的绘图库,我们可以完成各种极富艺术感的可视化作品,关于这一点我在系列文章在模仿中精进数据可视化中已经带大家学习过很多案例了。
而今天我要给大家介绍的这个Python
库prettymaps
非常的有趣,基于它,我们只需要简单的代码就可以对地球上给定坐标和范围的任意地区进行地图可视化????。

2 利用prettymaps快速制作海报级地图
遗憾的是,prettymaps
暂时还不能通过pip
或conda
直接进行安装,但可以利用pip
配合git
从源码仓库进行安装,对于国内的用户来说,可以使用下面的语句从github
的镜像地址快速安装:
pip install git+https://hub.fastgit.org/marceloprates/prettymaps.git
安装完成后,如果下面的语句执行无误,那么恭喜你已经安装完成:
from prettymaps import *
2.1 prettymaps的几种使用方式
prettymaps
无需用户自行准备数据,会根据用户设定的坐标和范围大小来自动从OpenStreetMap
上获取相应范围内的矢量数据作为绘图素材,主要有以下几种使用方式:
2.1.1 圆形模式
prettymaps
中最简单的绘图模式为「圆形模式」,我们只需要传入中心点经纬度坐标,以及半径范围(单位:米)即可,下面的例子来自官方示例程序,我将其地点换成以上海外滩为中心向外2500米范围:
from prettymaps import *
from matplotlib import pyplot as plt# 创建图床
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 = 100layers = 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
中自定义字体的方法,在地图上添加标注信息,仍然以上海外滩为例,我们利用外部的书法字体,在正中心绘制文字标注信息:
import matplotlib.font_manager as fm# 创建图床
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)
你可以找到你关注地点的经纬度坐标,尽情地绘制出各种艺术地图作品,譬如下面这些地标:
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
相关文章:

关于VS2012如何安装Windows Phone Toolkit
最近也是碰到很多问题,在编程的时候。这个问题是我遇到的比较棘手的一个,问了一堆人都说得很是模糊,最后还是琢磨出来了,深感欣慰。写下来以防以后忘记了怎么操作的,也期望能帮助到遇到同样问题的你。 首先让我先说了几…

论Oracle 11g数据库备份与恢复策略
11G中有个新特性,当表无数据时,不分配segment,以节省空间解决方案:1、insert一行,再roolback就会产生segment了该方法是在空表中插入一行数据,再删除,就会产生segment。则在数据库导出时可以导出…

使Apache实现gzip压缩
众所周知,在HTTP1.1中支持gzip压缩,这样可以缩小页面的容量从而加快页面的显示速度。可以使用常用HTTP抓包工具来检测一下你的站点是否开始了gzip压缩。 Apache默认的http.conf配置文件中没有开启gzip压缩,apache1.3.x可以用mod_gzip进行优化…

脸书 AI 识别误将黑人标记为「灵长类动物」
整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 最近,Facebook用户在观看一段以黑人为主角的视频时,会看到一个自动生成的提示,询问他们是否愿意“继续观看灵长类动物的视频”。 视频的内容其实是几个黑人和警察发…

Forefront for OCS2007之部署
1. 前提准备①OCS服务器②创建一个域账户,用于Forefront IM通告。帐户还将用于运行 ForefrontRTCProxy 服务用来截取来自 Office Communications Server SIP 通信进行扫描。此帐户必须满足以下要求:该帐户必须被为ForefrontRTCProxy服务授予 “ 运行为服…

Memcached在大型网站中应用
memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采…

iOS开发-照片选择
本来想做个注册登录的表单的,想想还是先做个简单的头像选择,一般情况下不管是内部管理系统还是面向公众的互联网公司,注册登录是免不了的,用户头像上传是免不了的,尤其是企业用户,上传了自己的图片才感觉自…

打造一流创新环境:协作、开放、可持续
作者 | 微软亚洲研究院院长 周礼栋 毋庸置疑,人类是群居物种。早在两千多年前,亚里士多德便在其著述《政治学》里揭示了人类群居共利协作的趋向:个体组成家庭,家庭组成村落,村落组成城池,城池组成国家和社会…

Ansible源码解析 Inventory组概念
group.py 作者 煮酒品茶 一个组的Class,包含对外方法以及属性如下。 组做为inventory的子节点,会有嵌套组,组变量,组内主机,子组,父组的一些概念 [ name, hosts, vars, child_groups, parent_groups, depth…

Hadoop简要介绍
本文大部分内容都是从官网Hadoop上来的。其中有一篇介绍HDFS的pdf文档,里面对Hadoop介绍的比较全面了。我的这一个系列的Hadoop学习笔记也是从这里一步一步进行下来的,同时又参考了网上的很多文章,对学习Hadoop中遇到的问题进行了归纳总结。 …

超 40W 奖金池等你来战!第二届“长沙银行杯”腾讯云启创新大赛火热来袭!...
HEY!你在等待一个机会提升自己的能力吗?现在机会来啦!第二届“长沙银行杯”腾讯云启创新大赛如约而至!现在,让更多人见证你的创新能力和新鲜想法第二届“长沙银行杯”腾讯云启创新大赛由长沙银行联合腾讯云、腾讯云启共…

(转)AppCan中调用系统浏览器打开网页
<!DOCTYPE html> <html> <head> <style>body{ background:#fff; font-size:30px;}</style> <meta charset"utf-8"> <script> function openUrl(url){if(uexWidgetOne.getPlatform()0){//IOS设备uexWidget.loadApp(url,,);…

Python optionParser模块的使用方法
Python 有两个内建的模块用于处理命令行参数: 一个是 getopt,《Deep in python》一书中也有提到,只能简单处理 命令行参数; 另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的、…

squid命中率分析参数注释
默认squid配置文件里面已经加上acl all src 0.0.0.0/0.0.0.0acl manager proto cache_objecthttp_access allow all#cachemgr_passwd pass allhttp_access allow Manager all 3.0直接看这里基本的使用方法*取得squid运行状态信息: squidclient -p 80 mgr:info //注…

库克退休前的最后一战:不是苹果汽车而是……
整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 上个月库克迎来了他担任苹果 CEO 十周年的日子,我们也为此统计了一份成绩单;而下一个十年,库克可能不会再陪苹果完整走过了:今年 4 月库克在采访中表示…

VIM技巧:显示行号
在vi的命令模式下输入":set nu",就有行号了,取消行号输入":set nonu"。 命令只对当前文档有效,如果想使vi打开文档时默认显示行号,可以修改vi的配置文件。 # vi ~/.vimrc 在这个文件中,添加 set n…

Python 自动化运维 pycurl
1.探测web服务质量(HTTP状态码,请求延时,HTTP头信息,下载速度等) web服务质量:1.服务可用性 2.服务响应速度 2.实例 12345678910111213141516171819202122232425262728293031323334353637383940414243impor…

Squid3反向代理安装与配置
一、编译安装 下载 #wget http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE25.tar.gz //找到地址#tar zxvf squid-3.0.STABLE25.tar.gz //稳定版#cd squid-3.0.STABLE25 #./configure --prefix/usr/local/squid / //必须 //以下几步可选 --enable-arp-ac…

ServiceStack OrmLite 数据库查询 几个实用方法 (继承表格式化集合等)
执行SQL语句:int result db.SqlScalar<int>("SELECT OBJECT_ID(name)", new { name "SomeName" });继承表的实现 (存储于同一个表中)[Alias("Table")] public abstract class MyBaseClass {public…

Deepsort + Yolo 实现行人检测和轨迹追踪
作者 | 李秋键 出品 | AI科技大本营(ID:rgznai100) 引言 行人检测是近年来计算机视觉领域的研究热点,同时也是目标检测领域中的难点。其目的是识别和定位图像中存在的行人,在许多领域中都有广泛的应用。交通安全方面,无人驾驶汽车通过提前…

推荐15个国外使用 CSS3 制作的漂亮网站
今天分享的作品集网站有些特别,因为他们都是使用 CSS3 技术制作的。对于设计师来说,为了吸引注意力,作品集必须展示出你的能力,这有点像制作简历,要让人们看到你所擅长的,突出的部分,这是一次推…
7_2判断两个单链表是否相交,若相交,求出第一个交点
转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4251372.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,…

对抗软件系统复杂性①:如无必要,勿增实体
作者 | 袁进辉 我们经常面临如何评价一个大型软件系统质量的问题。首要的评价指标肯定是功能,软件是否满足主要的需求(do right things)。如果有多条技术路径可以实现同样的功能,人们倾向于选择更简单的办法。奥卡姆剃刀准则“如无必要,勿增实…

修改squid的Header中的X-Cache为Powered-By-LinuxTone
今天分析别人网站的时候,注意到国内的chinacache服务商的CDN加速,把squid默认的X-Cache修改为Powered-By-ChinaCache,如下图:以前注意了但是没去研究过,今天刚好有点空挡自己就来研究看看。我的squid版本:s…

NginxApachePHP参数汇总
1、Nginx vim /etc/nginx/conf.d/www.cmdschool.org.conf 12345678910111213client_max_body_size 30m; //上传文件大小改30M upstream www.cmdschool.org { server 10.168.82.25:87; ip_hash; } server { listen 80; server_name www.cmdschool.org; location / { proxy_pass …

android Intent PendingIntent的区别
含义:intent英文意思是意图,pending表示即将发生或来临的事情。 PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。 Intent 是及时启动,intent 随所在的activity 消失而消失。…

Squid如何提高命中率
缓存命中1.缓存时间设置,顾名思义,缓存时间设置的越长那么命中率也会相对较高。缓存与更新是一对矛盾的概念,既要做到高命中又要做到快速更新这个就需要自己对自己网站内容的了解然后指定合适的缓存策略。2.缓存能缓存的内容,什么…

海量秋招面试资料等你来拿!你离大厂也许并不远
秋招在即,你还在为秋招如何准备而发愁吗?你还在为拿不到大厂offer而苦恼吗?工欲善其事,必先利其器。金秋开学季,CSDN助力你的技术学习与成长,为你免费提供海量大厂面试资料,让你的秋招不再慌乱&…

Microsoft Dynamics CRM server 2013 中业务规则,有点像C#的正则表达式
Microsoft Dynamics CRM server 2013 中业务规则,我的理解就是有点像C#的正则表达式, 如方某个字段,必须输入什么范围的数值,其它字符不能乱输入。 打开方式有二种: 1. 种像上篇文章中写的那样, 在系统视图…

cCodeforces Round #286 (Div. 2)
A题。。暴力枚举在每个位置添加字符,然后检查一下是不是回文串 1 #include <iostream>2 #include <cstdio>3 #include <cstring>4 #include <algorithm>5 #include <cmath>6 #include <vector>7 8 using namespace std;9 10 #…