用Python快速制作海报级地图

简说Python

共 16943字,需浏览 34分钟

 · 2021-09-05

↑↑↑关注后"星标"简说Python

人人都可以简单入门Python、爬虫、数据分析
 简说Python推荐 

来源:Python大数据分析

作者:费弗里

1 简介

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

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

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 = (1212), constrained_layout = True)

layers = plot(
    (31.23346121.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 = (1212), constrained_layout = True)

dilate = 100

layers = plot(
    (39.91645697864148116.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 = (1212), constrained_layout = True)

layers = plot(
    (31.23346121.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.50.5,
    '外滩, 上海',
    zorder = 6,
    ha='center',
    va='center',
    fontsize=120,
    fontproperties = fm.FontProperties(fname='FZZJ-HLYHXSJW.TTF'),
    transform=ax.transAxes
)

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

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


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

--END--

老表赠书

图书介绍Python+Tableau数据可视化之美

采用方法+实战案例的编写方式,首先讲解Python和Tableau的基本编程和使用方法,然后再结合销售数据分析、财务数据分析、HR数据分析、企业运营数据分析、统计调查报告等大量实战案例,讲解实际工作中各种职场人士常用的专业、漂亮图表的制作方法。

赠送规则:留言说说你都有哪些可视化技巧,留言点赞top2可以获得赠书一本,另外我还会选一个走心留言赠送一本《Python+Tableau数据可视化之美》。



扫码即可加我微信

老表朋友圈经常有赠书/红包福利活动

1)近一个月内获得赠书的读者将无法再次获得赠书想要多次获得赠书,可以查看下面的投稿规则及激励;

2)同时已经获得赠书的读者想要再次获得赠书,必须先写一篇已获得赠书的读后感(1000字+),才有机会再次获得赠书。

希望每一位读者都能获得赠书,只有有付出,就会有回报,就会有进步。


新玩法,以后每篇技术文章,点赞超过100+,我将在个人视频号直播带大家一起进行项目实战复现,快嘎嘎点赞吧!!!

直播将在我的视频号:老表Max 中开展,扫上方二维码添加我微信即可查看我的视频号。


大家的 点赞、留言、转发是对号主的最大支持。



学习更多:
整理了我开始分享学习笔记到现在超过250篇优质文章,涵盖数据分析、爬虫、机器学习等方面,别再说不知道该从哪开始,实战哪里找了

点赞”就是对博主最大的支持 

浏览 8
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报