python分分钟绘制精美地图海报


Posted in Python onFebruary 15, 2022

1 简介

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

python分分钟绘制精美地图海报

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

遗憾的是prettymaps暂时还不能通过pipconda直接进行安装,但可以利用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)

python分分钟绘制精美地图海报

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)

python分分钟绘制精美地图海报

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)

python分分钟绘制精美地图海报

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

python分分钟绘制精美地图海报

python分分钟绘制精美地图海报

python分分钟绘制精美地图海报

结尾: 

最后完整代码已经打包整理好了,有需要的小伙伴,可以点击这行字体,要么私信小编!

以上就是本文的全部内容,欢迎在评论区与我进行讨论~

到此这篇关于python分分钟绘制精美地图海报的文章就介绍到这了,更多相关Python 地图海报内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python爬取NUS-WIDE数据库图片
Oct 05 Python
利用python获取某年中每个月的第一天和最后一天
Dec 15 Python
Python中第三方库Requests库的高级用法详解
Mar 12 Python
Python排序搜索基本算法之冒泡排序实例分析
Dec 09 Python
python与sqlite3实现解密chrome cookie实例代码
Jan 20 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
May 03 Python
详解python深浅拷贝区别
Jun 24 Python
python:按行读入,排序然后输出的方法
Jul 20 Python
python使用html2text库实现从HTML转markdown的方法详解
Feb 21 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
Mar 13 Python
python字典的值可以修改吗
Jun 29 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
基于PyQT5制作一个桌面摸鱼工具
Feb 15 #Python
python接口测试返回数据为字典取值方式
Feb 12 #Python
Python socket如何解析HTTP请求内容
Feb 12 #Python
python全面解析接口返回数据
Feb 12 #Python
http通过StreamingHttpResponse完成连续的数据传输长链接方式
Feb 12 #Python
python中出现invalid syntax报错的几种原因分析
Feb 12 #Python
python ConfigParser库的使用及遇到的坑
Feb 12 #Python
You might like
PHP中4个加速、缓存扩展的区别和选用建议
2014/03/12 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
PHP数组array类常见操作示例
2020/05/15 PHP
javascript延时重复执行函数 lLoopRun.js
2007/06/29 Javascript
javascript vvorld 在线加密破解方法
2008/11/13 Javascript
几个比较经典常用的jQuery小技巧
2010/03/01 Javascript
用JS控制回车事件的代码
2011/02/20 Javascript
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
2012/10/12 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
js淡入淡出的图片轮播效果代码分享
2015/08/24 Javascript
js对象浅拷贝和深拷贝详解
2016/09/05 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
jQuery实现点击关注和取消功能
2017/07/03 jQuery
浅谈vuex之mutation和action的基本使用
2017/08/29 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
使用nodejs+express实现简单的文件上传功能
2017/12/27 NodeJs
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
2018/12/16 Javascript
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
python中使用urllib2获取http请求状态码的代码例子
2014/07/07 Python
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
python脚本开机自启的实现方法
2019/06/28 Python
django 类视图的使用方法详解
2019/07/24 Python
详解Django配置优化方法
2019/11/18 Python
通过python连接Linux命令行代码实例
2020/02/18 Python
python由已知数组快速生成新数组的方法
2020/04/08 Python
奇怪的鱼:Weird Fish
2018/03/18 全球购物
西班牙床垫网上商店:Colchones.es
2018/05/06 全球购物
请介绍一下WSDL的文档结构
2013/03/17 面试题
2016年区委书记抓基层党建工作公开承诺书
2016/03/25 职场文书
导游词之江苏同里古镇
2019/11/18 职场文书
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL