使用 R 语言提取西部大开发边界及计算各城市与该边界的距离

「Place-based policies, state-led industrialisation, and regional development: Evidence from China’s Great Western Development Programme」一文中使用到了西部大开发边界相关的距离数据:

今天我们一起来看下如何使用 R 语言提取西部大开发边界并计算各城市质心与该边界的距离。

西部大开发主要针对 12 个省份:新疆维吾尔自治区、甘肃省、内蒙古自治区、西藏自治区、青海省、宁夏回族自治区、陕西省、四川省、重庆市、云南省、贵州省和广西壮族自治区,以及在此之外的 3 个地级市:湘西土家族苗族自治州、延边朝鲜族自治州、恩施土家族苗族自治州。

首先我们读取中国市级行政区划:

library(tidyverse)
library(sf)
read_sf("2019行政区划/市.shp") %>%
select(-contains("类型")) %>%
st_transform(4326) -> city

city
#> Simple feature collection with 371 features and 4 fields
#> Geometry type: MULTIPOLYGON
#> Dimension: XY
#> Bounding box: xmin: 73.50114 ymin: 6.323421 xmax: 135.0885 ymax: 53.5609
#> Geodetic CRS: WGS 84
#> # A tibble: 371 × 5
#> 省代码 省 市代码 市 geometry
#> * <dbl> <chr> <dbl> <chr> <MULTIPOLYGON [°]>
#> 1 110000 北京市 110000 北京市 (((116.6753 41.0401, 116.6762 41.04006, 116.67…
#> 2 120000 天津市 120000 天津市 (((117.4438 40.25101, 117.4561 40.24615, 117.4…
#> 3 130000 河北省 130100 石家庄市 (((113.8242 38.75805, 113.8312 38.74815, 113.8…
#> 4 130000 河北省 130200 唐山市 (((118.8539 39.10692, 118.8493 39.10679, 118.8…
#> 5 130000 河北省 130300 秦皇岛市 (((119.1521 40.6128, 119.1517 40.60917, 119.15…
#> 6 130000 河北省 130400 邯郸市 (((113.8711 37.01219, 113.8724 37.01182, 113.8…
#> 7 130000 河北省 130500 邢台市 (((115.1259 37.79847, 115.1287 37.79843, 115.1…
#> 8 130000 河北省 130600 保定市 (((115.4378 39.95016, 115.4435 39.9472, 115.44…
#> 9 130000 河北省 130700 张家口市 (((114.8005 42.14749, 114.8045 42.14733, 114.8…
#> 10 130000 河北省 130800 承德市 (((117.7998 42.6137, 117.8 42.61273, 117.7997 …
#> # ℹ 361 more rows

然后我们筛选出西部大开发政策的地区:

city %>%
filter(省 %in% c("新疆维吾尔自治区", "甘肃省", "内蒙古自治区",
"西藏自治区", "青海省", "宁夏回族自治区",
"陕西省", "四川省", "重庆市",
"云南省", "贵州省", "广西壮族自治区") |
市 %in% c("湘西土家族苗族自治州", "延边朝鲜族自治州",
"恩施土家族苗族自治州")) -> city1
mapview::mapview(city1)

然后我们把这部分区域融合起来:

city1 %>%
st_make_valid() %>%
nngeo::st_remove_holes() %>%
st_union() %>%
st_sf() -> city1_union
mapview::mapview(city1_union)

提取该部分的边界保存成 geojson 文件:

city1_union %>%
st_cast("MULTILINESTRING") %>%
st_simplify(dTolerance = 5000) %>%
write_sf("line1.geojson", overwrite = T)

下面我们再借助一个在线应用提取边界:https://tidyfriday.cn/geojson/

删除 line1 的线条:

然后把右侧的内容保存到 polygon.geojson 文件里面。

这样我们就可以根据这个多边形提取西部大开发的边界了:

read_sf("polygon.geojson") -> polygon

st_union(
city %>%
filter(市 == "延边朝鲜族自治州") %>%
st_cast("MULTILINESTRING") %>%
pull(geometry),
city1_union %>%
st_cast("MULTILINESTRING") %>%
st_intersection(polygon)
) %>%
st_sf() -> lineall

mapview::mapview(lineall)

lineall %>%
mutate(name = "西部大开发边界") %>%
write_sf("西部大开发边界.geojson", overwrite = T)

最后我们再计算各城市质心到西部大开发边界的距离:

read_sf("西部大开发边界.geojson") -> lineall
read_sf("2019行政区划/市.shp") %>%
select(-contains("类型")) %>%
st_transform(4326) -> city

city %>%
st_make_valid() %>%
st_centroid() %>%
st_distance(lineall) -> distmat

(distmat/1000) %>%
as.numeric() %>%
as_tibble() %>%
bind_cols(
city %>% st_drop_geometry(), .
) %>%
rename(各城市质心到西部大开发边界的距离 = value) %>%
writexl::write_xlsx("各城市质心到西部大开发边界的距离_km.xlsx")

这样就完成了这项工作。

点击这里跳转到 RStata 短书平台获取附件:使用 R 语言提取西部大开发边界及计算各城市与该边界的距离

评论