地理距离与新型冠状病毒的传播——一个简单的相关分析

地理距离与新型冠状病毒的传播——一个简单的相关分析

首先,我们导入今天的教程中我们需要用到的一些 R 包:

视频讲解

1
2
3
4
5
6
7
library(maps)
library(sf)
library(tidyverse)
library(units)
library(stringr)
library(ggplot2)
library(hrbrthemes)

测度

在进入本文的正式内容前面,我们先介绍一下 R 里面的测度。

长度

1
2
l <- set_units(1:10, m)
l
1
2
#> Units: [m]
#> [1] 1 2 3 4 5 6 7 8 9 10

我们再把米转换成厘米:

1
set_units(l, cm)
1
2
#> Units: [cm]
#> [1] 100 200 300 400 500 600 700 800 900 1000

还可以进行计算:

1
set_units(l, cm) + l
1
2
#> Units: [cm]
#> [1] 200 400 600 800 1000 1200 1400 1600 1800 2000

面积

例如 400 公顷等于 4 平方千米:

1
2
3
a <- set_units(400, ha)
# 等于 4 平方千米
set_units(a, km2)
1
#> 4 [km2]

矢量

例如速度的定义和转换:

1
2
vel <- set_units(seq(20, 50, 10), km/h)
set_units(vel, m/s)
1
2
#> Units: [m/s]
#> [1] 5.555556 8.333333 11.111111 13.888889

计算每个城市到武汉的距离

首先我们读入全国各个城市的位置数据:

代码去哪了?

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

我们再单独把武汉筛选出来:

代码去哪了?

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

下面计算每个城市距离武汉的距离。city_distribution.csv 文件里面的数据是今天上午九点的时候的各个市的新型冠状病毒肺炎病例的确诊数量,使用两个数据绘制一幅散点图(仅供演示)。

代码去哪了?

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

看起来离武汉越近确诊病例数量越多,离武汉越远确诊病例数量越少。下面我们再计算并绘制一幅图,这幅图展示了中国各个地方距离武汉的距离。

中国各个地方距离武汉的距离

首先我们需要中国地图的数据,我使用的是省界:

代码去哪了?

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

prov 是个 sf 对象,sf 对象中会预置一个投影坐标系:

代码去哪了?

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

prov 使用的是 lcc 投影,对于距离,我们使用“米”更方便,下面我们将投影转换为 UTM Zone 27(EPSG:3055)。

代码去哪了?

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

接下来我们基于 prov 生成一个网格(由排列均匀的格点组成,这些格点组成的矩形网格恰好覆盖中国地图):

代码去哪了?

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

再找到这个网格中位于中国内部的格点:

代码去哪了?

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

武汉的位置也要进行一下坐标系转换(距离计算的两个点必须使用同一坐标系):

代码去哪了?

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

计算 grid 中的每个格点距离武汉的距离:

代码去哪了?

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

我们基于上面的计算构建一个数据框以便于接下来的绘图:

代码去哪了?

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

把 df 转换为一个 sf 对象会方便绘制地图:

代码去哪了?

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

要绘制一幅完整的中国地图,我们还需要一些额外的地图数据:

代码去哪了?

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

这里面的颜色都是散点的,我可以把散点的大小调小:

代码去哪了?

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

补充案例:每个省会城市距离最近的省会城市的距离

代码去哪了?

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

例如计算台北市和杭州的距离:

代码去哪了?

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

为了寻找每个省会城市距离最近的省会城市的距离,我们首先需要计算每两个省会城市之间的距离(这会得到一个距离矩阵),然后我们从这个矩阵里面找最小距离和这个最小距离对应的索引(可以通过这个索引知道这个距离最近的城市是哪个城市):

代码去哪了?

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

下面我们再绘制地图:

代码去哪了?

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

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

#

评论

Your browser is out-of-date!

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

×