2022 年中国各省市级行政区划矢量数据(附带邻近区域)

今天给大家分享一套超级实用的 2022 年中国各省、市、区县的行政区划地理数据,数据来源于民政部。数据包含如下内容:

根据这份数据,我们可以绘制出非常标准的中国省级、市级和县级的行政区划图。图示如下:

利用这份数据,我们还可以具体展现各省市自治区的行政区划。在绘制各省市自治区的行政区划图时,为了避免图片单调的问题,我们将该省附近的区域也简单标示出来,使得图片内容更加丰富。

各个省的预览图如下(31个各省市自治区,不含港澳台):

安徽省 北京市
重庆市 福建省
甘肃省 广东省
广西壮族自治区 贵州省
海南省 河北省
河南省 黑龙江省
湖北省 湖南省
吉林省 江苏省
江西省 辽宁省
内蒙古自治区 宁夏回族自治区
青海省 山东省
山西省 陕西省
上海市 四川省
天津市 西藏自治区
新疆维吾尔自治区 云南省
浙江省 全国

下面详细介绍如何使用 R 语言获取并整理中国各省、市、区县的行政区划地理数据,并对该份数据进行绘图展示。

数据处理

首先从2020年中国县以上行政区划代码中爬取省代码列表。

# 加载包
library(tidyverse)
library(rvest)
library(fs)

# 爬取省代码列表
read_html('http://www.mca.gov.cn/article/sj/xzqh/2020/20201201.html') %>%
html_nodes(xpath = "/html/body/div/table") %>%
html_table() -> codedf

codedf[[1]] %>%
as_tibble(.name_repair = "minimal") %>%
slice(-3:-1) %>%
select(code = X2, name = X3) %>%
dplyr::filter(str_sub(code, 3, 6) == "0000") -> codedf

# 港澳台无数据
codedf %>%
dplyr::filter(!name %in% c("台湾省", "香港特别行政区", "澳门特别行政区")) -> codedf

创建 provjson 文件夹和各省的子文件夹,用于下载并存放中国各省行政区划地理数据,每个子文件夹里面包含 2 个 JSON 和 1 个 GEOJSON 文件。

dir.create("provjson")

for (i in 1:nrow(codedf)) {
dir.create(paste0("provjson/", codedf$name[i]))
try({
download.file(paste0("http://xzqh.mca.gov.cn/data/", codedf$code[i], "_Line.geojson"),
paste0("provjson/", codedf$name[i], "/", codedf$code[i], "_Line.geojson"))
download.file(paste0("http://xzqh.mca.gov.cn/data/", codedf$code[i], "_Point.geojson"),
paste0("provjson/", codedf$name[i], "/", codedf$code[i], "_Point.geojson"))
download.file(paste0("http://xzqh.mca.gov.cn/data/", codedf$code[i], ".json"),
paste0("provjson/", codedf$name[i], "/", codedf$code[i], ".json"))
})
}

绘图代码

接下来我们具体介绍这份数据在 R 语言中如何使用(其实 GIS 软件也可以使用 GEOJSON 文件)。

中国各省行政区划图

根据 provjson 文件夹中各省的行政区划地理数据,我们可以分别绘制中国各省行政区划图,这里以山东省为例进行演示:

library(tidyverse)
library(sf)
library(hrbrthemes)
library(ggplot2)

# 字体设置
library(showtext)
showtext_auto(enable = TRUE)
font_add("songti", regular = "song.otf")
cnfont <- "songti"

# 读取山东省地理数据
read_sf("provjson/山东省/370000.json")
%>% st_set_crs(4326) -> df
read_sf("provjson/山东省/370000_Point.geojson") -> dfpoint
read_sf("provjson/山东省/370000_Line.geojson") -> dfline

# 绘图
ggplot() +
geom_sf(data = subset(df, FillColor == "" & QUHUADAIMA != "hai"),
fill = "gray", size = 0.2, alpha = 0.6) +
geom_sf(data = subset(df, FillColor == "" & QUHUADAIMA == "hai"),
fill = "#6AA7DF", alpha = 0.6, size = 0.2) +
geom_sf(data = subset(df, FillColor != ""),
aes(fill = I(FillColor)), color = "white", size = 0.3) +
geom_sf(data = dfpoint,
shape = 1) +
geom_sf_text(data = dfpoint,
aes(label = paste0('\n\n', NAME)),
family = cnfont, size = 2,
check_overlap = TRUE) +
geom_sf_text(data = subset(dfline, QUHUADAIMA != "other"),
aes(label = NAME), family = cnfont, size = 3) +
theme_ipsum(base_family = cnfont) +
labs(title = "山东省行政区划",
subtitle = "地图数据来源于中华人民共和国民政部",
caption = "绘制:微信公众号 RStata") +
theme(legend.title = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank())

这样就得到了山东省的行政区划图,其他省市自治区的行政区划图也是类似的方法,此处不再赘述。

中国行政区划图(市级)

合并各省全部的 JSON 文件,能够得到中国各市的地理矢量数据,从而可以绘制中国市级行政区划图。

# 合并全部的
dir_ls("provjson", recurse = T, regexp = "\\.json") %>%
lapply(function(x){
read_sf(x)
}) %>%
bind_rows() %>%
st_set_crs(4326) -> citydf

# 绘图
boundary <- read_sf("全国/quanguo_Line.geojson")
provboundary <- read_sf("全国/quanguo.json") %>%
st_set_crs(4326)
point <- read_sf("全国/quanguo_Point.geojson")

ggplot() +
geom_sf(data = subset(citydf, FillColor != "" & FillColor != "#0000c0"),
aes(fill = I(FillColor)),
color = "white", size = 0.08) +
geom_sf(data = subset(provboundary, FillColor == ""),
color = "gray", size = 0.5) +
geom_sf(data = subset(provboundary, QUHUADAIMA == "710000"),
aes(fill = I(FillColor)), color = "white") +
geom_sf(data = subset(boundary, NAME == ""),
color = "gray", size = 0.5) +
geom_sf_text(data = subset(boundary, NAME != "" &
str_length(QUHUADAIMA) != 7 &
!str_detect(QUHUADAIMA, "hai") &
NAME != "jiantou"),
aes(label = NAME),
color = "black", size = 2, family = cnfont) +
geom_sf_text(data = subset(boundary, NAME != "" &
str_length(QUHUADAIMA) != 7 &
str_detect(QUHUADAIMA, "hai") &
NAME != "jiantou"),
aes(label = NAME),
color = "#6AA7DF", size = 3, family = cnfont) +
geom_sf(data = point, color = "black", shape = 1, size = 1) +
geom_sf_text(data = point,
aes(label = paste0("\n\n", NAME)),
color = "black",
check_overlap = TRUE,
size = 2, family = cnfont) +
theme_ipsum(base_family = cnfont) +
coord_sf(crs = "+proj=aea +lat_0=0 +lon_0=105 +lat_1=25 +lat_2=47 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs") +
labs(title = "中华人民共和国行政区划(市级)",
subtitle = "绘制:微信公众号 RStata",
caption = "地图数据来源:民政部") +
theme(legend.title = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank())

中国行政区划图(省级)

中国省级行政区划图和中国市级行政区划图绘制方法类似。

ggplot() +
geom_sf(data = subset(provboundary, FillColor == ""),
color = "gray", size = 0.5) +
geom_sf(data = subset(provboundary, FillColor != ""),
aes(fill = I(FillColor)), color = "white", size = 0.08) +
geom_sf(data = subset(boundary, NAME == ""),
color = "gray", size = 0.5) +
geom_sf_text(data = subset(boundary, NAME != "" &
str_length(QUHUADAIMA) != 7 &
!str_detect(QUHUADAIMA, "hai") &
NAME != "jiantou"),
aes(label = NAME),
color = "black", size = 2, family = cnfont) +
geom_sf_text(data = subset(boundary, NAME != "" &
str_length(QUHUADAIMA) != 7 &
str_detect(QUHUADAIMA, "hai") &
NAME != "jiantou"),
aes(label = NAME),
color = "#6AA7DF", size = 3, family = cnfont) +
geom_sf(data = point, color = "black", shape = 1, size = 1) +
geom_sf_text(data = point,
aes(label = paste0("\n\n", NAME)),
color = "black",
check_overlap = TRUE,
size = 2, family = cnfont) +
geom_sf_text(data = subset(boundary, NAME != "" &
str_length(QUHUADAIMA) == 7),
aes(label = NAME),
color = "#E31A1C", size = 2.5,
family = cnfont) +
theme_ipsum(base_family = cnfont) +
coord_sf(crs = "+proj=aea +lat_0=0 +lon_0=105 +lat_1=25 +lat_2=47 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs") +
labs(title = "中华人民共和国行政区划(省级)",
subtitle = "绘制:微信公众号 RStata",
caption = "地图数据来源:民政部") +
theme(legend.title = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank())

中国行政区划图(县级)

中国县级行政区划图和中国市级行政区划图绘制方法也类似。

read_sf("全国/xian_quanguo.json") -> countydf
countydf %>%
st_set_crs(4326) -> countydf

ggplot() +
geom_sf(data = subset(countydf, FillColor != "" & FillColor != "#000033"),
aes(fill = I(FillColor)),
color = "white", size = 0.01) +
geom_sf(data = subset(provboundary, FillColor == ""),
color = "gray", size = 0.5) +
geom_sf(data = subset(provboundary, QUHUADAIMA == "710000"),
aes(fill = I(FillColor)), color = "white") +
geom_sf(data = subset(boundary, NAME == ""),
color = "gray", size = 0.5) +
geom_sf_text(data = subset(boundary, NAME != "" &
str_length(QUHUADAIMA) != 7 &
!str_detect(QUHUADAIMA, "hai") &
NAME != "jiantou"),
aes(label = NAME),
color = "black", size = 2, family = cnfont) +
geom_sf_text(data = subset(boundary, NAME != "" &
str_length(QUHUADAIMA) != 7 &
str_detect(QUHUADAIMA, "hai") &
NAME != "jiantou"),
aes(label = NAME),
color = "#6AA7DF", size = 3, family = cnfont) +
geom_sf(data = point, color = "black", shape = 1, size = 1) +
geom_sf_text(data = point,
aes(label = paste0("\n\n", NAME)),
color = "black",
check_overlap = TRUE,
size = 2, family = cnfont) +
theme_ipsum(base_family = cnfont) +
coord_sf(crs = "+proj=aea +lat_0=0 +lon_0=105 +lat_1=25 +lat_2=47 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs") +
labs(title = "中华人民共和国行政区划(县级)",
subtitle = "绘制:微信公众号 RStata",
caption = "地图数据来源:民政部") +
theme(legend.title = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank())

点击这里跳转到 RStata 短书平台获取附件:2022 年中国各省市级行政区划矢量数据(附带邻近区域)

评论