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

作者:迢迢x 时间:2021-11-10 11:44:25 

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分分钟绘制精美地图海报

结尾: 

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

来源:https://blog.csdn.net/a55656aq/article/details/122878538

标签:Python,地图海报,绘图
0
投稿

猜你喜欢

  • oracle应用程序实现打包 的方法

    2009-03-02 10:32:00
  • js实现一个简易计算器

    2024-04-25 13:13:38
  • python如何实现从视频中提取每秒图片

    2023-10-15 11:36:25
  • SQL Server数据库连接查询和子查询实战案例

    2024-01-15 02:44:21
  • 解决PyCharm不运行脚本,而是运行单元测试的问题

    2023-04-12 01:08:53
  • Golang学习之无类型常量详解

    2024-02-14 13:41:09
  • 利用GAE&Google Gears做了一个简单的AJAX代理

    2009-04-29 12:42:00
  • python取代netcat过程分析

    2021-07-22 17:32:51
  • 详细讲解HTTP协议工作方式

    2022-01-08 11:55:59
  • SQL的常用数据类型列表详解

    2024-01-15 05:25:07
  • 用户 jb51net 登录失败。原因: 该帐户的密码必须更改

    2024-01-13 05:58:46
  • 在ASP中用“正则表达式对象”来校验数据的合法性

    2010-05-27 12:25:00
  • Django多层嵌套ManyToMany字段ORM操作详解

    2023-07-01 02:26:28
  • pd.to_datetime中时间object转换datetime实例

    2021-09-23 19:22:15
  • Python实现分割文件及合并文件的方法

    2022-01-28 00:02:02
  • 连接Python程序与MySQL的教程

    2024-01-26 15:02:57
  • Python 字符串的有关知识详解

    2022-03-14 16:54:12
  • ASP中使用Set ors=oConn.Execute()时获取记录数的方法

    2011-02-20 10:48:00
  • Python实战之能监控文件变化的神器—看门狗

    2022-01-05 22:01:28
  • Python中对象迭代与反迭代的技巧总结

    2023-06-08 04:25:33
  • asp之家 网络编程 m.aspxhome.com