R 语言地理距离计算:中国各市的邻接权重矩阵距离权重矩阵和反距离权重矩
Posted RStata
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R 语言地理距离计算:中国各市的邻接权重矩阵距离权重矩阵和反距离权重矩相关的知识,希望对你有一定的参考价值。
今天要给大家分享的是使用 R 语言计算中国各市的邻接权重矩阵、距离权重矩阵和反距离权重矩阵的方法。
首先加载相关的 R 包:
library(sf)
library(tidyverse)
读取中国市级地图数据:
read_sf('china_city_full_map_long.json') -> city
ggplot(city) +
geom_sf(aes(fill = 类型), color = "white", size = 0.01) +
geom_sf(data = subset(city, 市 == "国界线"),
color = "white", size = 0.1) +
theme_modern_rc(base_family = cnfont,
caption_family = cnfont) +
scale_fill_viridis_d(option = "D") +
labs(title = "中国市级行政区划",
caption = "数据:搜集自网路")
去掉国界线和台湾省:
read_sf('china_city_full_map_long.json') %>%
dplyr::filter(市 != "国界线" & 市 != "台湾省") -> city
两个城市的邻接权重矩阵,也就是两个市接壤取 1,不接壤取 0:
st_touches(city, city) %>%
as.matrix() -> touchmat
touchmat %>%
as_tibble() %>%
mutate_all(as.numeric) %>%
set_names(city$市) %>%
mutate(city = city$市) %>%
select(城市 = city, everything()) -> touchdf
touchdf %>%
writexl::write_xlsx("邻近矩阵.xlsx")
计算各个市的质心:
city %>%
st_centroid() -> citypoint
计算各个市质心之间的距离权重矩阵:
st_distance(citypoint) -> distmat
dim(distmat)
将距离的单位设置为 km:
library(units)
set_units(distmat, km) -> distmat
distmat %>%
as_tibble() %>%
set_names(city$市) %>%
mutate(city = city$市) %>%
select(城市 = city, everything()) %>%
writexl::write_xlsx("距离矩阵.xlsx")
反距离权重矩阵:
reversefun <- function(x){
1/x
}
distmat %>%
as_tibble() %>%
set_names(city$市) %>%
mutate_all(reversefun) %>%
mutate(city = city$市) %>%
select(城市 = city, everything()) %>%
writexl::write_xlsx("距离倒数矩阵.xlsx")
范围权重矩阵,以 200km 为例:
# 200 权重矩阵
ifelse(distmat <= set_units(200, km), 1, 0) %>%
as_tibble() %>%
set_names(city$市) %>%
mutate(city = city$市) %>%
select(城市 = city, everything()) %>%
writexl::write_xlsx("距离200矩阵.xlsx")
❝作业:试着计算下 400km,600km,800km 和 1000 km 的权重矩阵
❞
获取本文的数据和代码
如何获取本文的代码呢?很简单:
-
关注本公众号 RStata
,这样你能够第一时间获取课程预告和我提供的学习资源; -
转发本文至朋友圈(加上一句推荐语:“这个公众号好棒呀!推荐关注!”)集齐 12 个赞或者转发至超过 200 人的大群; -
截图发给公众号后台或私信发给我,我就会把本文的代码和数据分享给你啦!