相邻省份对质心与共同边界的距离及共同边界矢量数据

今天特意为大家准备了一份相邻省份对质心与共同边界的距离及共同边界矢量数据,非常适合进行省份级别政策的效应评估。

数据概览

首先我们找到了中国所有的相邻省份对(基于 2019 年中国省级行政区划),一共是 70 组:

附件中的 2019年中国相邻省对.xlsx 文件。

readxl::read_xlsx("2019年中国相邻省对.xlsx")

#> # A tibble: 70 × 2
#> 省代码 相邻省
#> <dbl> <dbl>
#> 1 120000 110000
#> 2 130000 110000
#> 3 130000 120000
#> 4 140000 130000
#> 5 150000 130000
#> 6 210000 130000
#> 7 370000 130000
#> 8 410000 130000
#> 9 150000 140000
#> 10 410000 140000
#> # … with 60 more rows

附件中的 commonline-shp 文件夹为相邻省份对的共同边界矢量数据,据此我们可以绘制不同省份间的共同边界:

通过计算每个相邻省份对的质心与共同边界的距离就可以得到这个数据包了:

  • 相邻省份对质心与共同边界的距离_km.dta

数据中的距离单位是 km。

例如河南省与山西省质心与共同边界的最小距离:

图中的散点表示各省份质心,散点越小表示距离共同边界越近,图中的蓝色粗线表示两个省的共同省界。

希望这份数据包能够帮助大家发论文~

绘图展示

附件中的 main.R 文件是用来绘制质心与共同边界距离的,使用类似下面的绘图语句就可以绘制了:

library(tidyverse)
library(sf)

# 读取区省
read_sf("2019行政区划/省.shp") %>%
st_transform(4326) %>%
dplyr::filter(!is.na(省) & 省 != "中朝共有") %>%
st_make_valid() -> prov

# 获取所有的相邻省对
st_intersects(st_make_valid(prov), st_make_valid(prov), sparse = F) -> touchmat
touchmat %>%
as_tibble() %>%
mutate_all(as.numeric) %>%
mutate(省代码 = prov$省代码) %>%
select(省代码, everything()) %>%
set_names(c("省代码", prov$省代码)) %>%
gather(2:ncol(.), key = "key", value = "value") %>%
dplyr::filter(省代码 != key & value == 1) -> pairdf

pairdf

# 去除反向重复的(比较大小,仅仅保留前面的大于后面的)
pairdf %>%
mutate(key = as.numeric(key)) %>%
dplyr::filter(省代码 > key) %>%
rename(相邻省 = key) %>%
select(-value) -> pairdf

pairdf %>%
slice(10) -> pair1

prov %>%
dplyr::filter(省代码 == pair1$省代码) -> mainprov
prov %>%
dplyr::filter(省代码 == pair1$相邻省) -> touchprov

# 共同省界
st_intersection(st_cast(mainprov$geometry, "MULTILINESTRING"),
st_cast(touchprov$geometry, "MULTILINESTRING")) %>%
st_collection_extract("LINESTRING") -> commonline

# 两个城省的质心
bind_rows(mainprov, touchprov) %>%
select(-contains("类型")) %>%
st_centroid() -> twoprov

# twoprov 距离这条共同边界的距离
twoprov %>%
mutate(
距离相邻省对共同边界的最小距离 = twoprov %>%
st_distance(commonline) %>%
units::set_units("km")
) %>%
mutate(距离相邻省对共同边界的最小距离 = as.numeric(距离相邻省对共同边界的最小距离)) -> provcentroid

provcentroid %>%
st_drop_geometry() %>%
mutate(pair = paste0(省代码[1], "-", 省代码[2]))

# 绘图
ggplot() +
geom_sf(data = mainprov, aes(fill = 省), alpha = 0.3) +
geom_sf(data = touchprov, aes(fill = 省), alpha = 0.5) +
geom_sf(data = commonline, color = "#709ae1", size = 2) +
geom_sf(data = provcentroid,
aes(size = 距离相邻省对共同边界的最小距离),
color = "gray20", shape = 16) +
scale_fill_manual(values = c("#ff847c", "#99b898"), name = "") +
scale_size_continuous(range = c(1, 4),
name = "距离相邻省对共同边界\n的最小距离(km)") +
labs(title = paste0(mainprov$省, "与", touchprov$省,
"质心与共同边界的最小距离"),
subtitle = "数据计算&绘图:微信公众号 RStata",
caption = "注:散点大小表示质心距离两个共同省界的最小距离,图中的蓝色粗线表示两个省的共同省界") +
scale_x_continuous(limits = c(110, 123)) +
theme(legend.position.inside = c(0.9, 0.5),
legend.position = "inside")

点击这里跳转到 RStata 短书平台获取附件:相邻省份对质心与共同边界的距离及共同边界矢量数据

评论