如何绘制一幅漂亮的路网地图?网页文本提取、地理编码与可视化(更新版)

如何绘制一幅漂亮的路网地图?网页文本提取、地理编码与可视化(更新版)

之前发现过一个很有意思的网站:Draw all roads in a city at once,可以绘制一个城市的路网地图,而且还绘制的很漂亮,就想用 R 画一下。另外我还从一则微信推文里面爬取了阜阳市新冠肺炎确诊病例的分布情况并将他们绘制在路网地图上。

视频讲解

准备工作

  1. 下载地图数据:ECharts Gallery - 地图GEOJSON下载
  2. 高德地图密钥并把密钥存放为环境变量。

绘制路网地图

首先导入我们需要的 R 包:

1
2
3
4
library(osmdata)
library(dodgr)
library(tidyverse)
library(sf)

osmdata 包可以用来把 OpenStreetMap 数据导入 R 中。dodgr 包中的 dodgr_streetnet() 函数可以用来从 sf 表单中提取路网数据。

设定 ggplot2 绘图主题:

1
2
3
4
5
6
7
8
9
10
11
12
13
theme_set(
theme_ipsum(base_family = cnfont) +
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank()) +
theme(plot.background = element_rect(fill = "#F7F2F2",
color = "#F7F2F2"),
panel.background = element_rect(fill = "#F7F2F2",
color = "#F7F2F2"))
)

这里的绘图主题主要是将经纬网去除和设置背景色为:#F7F2F2。

读入阜阳市的地图数据:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

st_make_valid() 可以用于矫正 sf 对象中 invalid 的 geometry。

获取安徽省阜阳市的经纬度范围:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

之前的旧版本的教程中我是使用的下面的方法获取阜阳市的经纬度,但是获取的不准,不再建议使用:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

提取这个经纬度范围内的街道路线:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

把这个数据保存下来:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

这样再次运行代码的时候只需读取这个数据即可:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

需要注意,这里的 streets_raw 里面包含的路网实际上是 estimate_box 这个经纬度网络包含的路网,我们可以从其中再提取和 fy 相交的部分,也就是阜阳市的路网了:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

然后我们就可以绘图展示下了:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

可以把阜阳地图放在下面作为底图:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

我发现这个路网数据里面有个变量是道路的类型,所以我们可以对不同的路使用不同的颜色:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

我们再回顾一下之前关于地区分组聚合的知识,计算阜阳市各个区县的道路总里程(我就不分道路的类型了)。

crs = 3055 对应 UTM Zone 27(EPSG:3055)坐标系,单位为“米”,更适合距离的计算,所以首先把 streets 的坐标系转换成 UTM Zone 27(EPSG:3055)坐标系,然后再计算道路长度:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

新冠肺炎确诊病例在阜阳市的分布

今天早上看到阜阳发布公众号里面的推文枚举了阜阳所有病例的分布:https://mp.weixin.qq.com/s/K-wbnK6sXHW-E0vmNmyECQ ,下面爬取这个页面的数据并整理:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

下面再使用高德地图接口解析每个患者地址的经纬度:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

绘制患者的分布图:

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

如果你的电脑是 Mac 系统,你可以使用特殊字体 FontAwesome :

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

如果你没法使用这些特殊字体,可以使用图片!

下载这种小图片可以从这里:https://www.iconfont.cn/

代码去哪了?

代码可以加入我的知识星球后从知识星球下载附件获取~
要了解如何加入我的知识星球,可以阅读关于界面或者添加我的微信咨询。

作业

大家可以找找自己所在市的确诊病例分布,然后绘制一幅类似的路网+确诊病例分布图。

知识星球附件链接:https://t.zsxq.com/EyB2rvv

#

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×