使用 R 语言计算各个省市区县的经纬度范围

最近有个小伙伴问了这样一个问题,他需要各个省市区县的经纬度范围,不知道如何获取,今天我们就一起来使用 R 语言计算下。

首先我们加载所需的 R 包:

library(tidyverse)
library(sf)
library(ggspatial)

下面我们会需要使用 ggplot2 绘制一副地图,设置下绘图主题,tidy_grey.R 是课程使用 R 语言绘制中国夜间灯光地图 里面的文件:

source("tidy_grey.R")

读取一份陆地国界线和九段线数据(用于等下绘图):

read_sf("九段线.geojson") -> jdx

计算各个省份的经纬度范围

prov %>%
mutate(id = row.names(.)) %>%
nest(-id) %>%
mutate(stbbox = map(data, .f = function(x){
st_bbox(x) %>%
as.numeric()
})) %>%
unnest(data) %>%
select(-id, - geometry) %>%
unnest(stbbox) %>%
mutate(kind = rep(c("最小经度", "最小纬度", "最大经度", "最大纬度"), 34)) %>%
spread(kind, stbbox) %>%
writexl::write_xlsx("2020年每个省份的经纬度范围.xlsx")

绘图展示:

prov %>%
mutate(id = row.names(.)) %>%
nest(-id) %>%
mutate(stbbox = map(data, .f = function(x){
st_bbox(x) %>%
st_as_sfc() %>%
st_cast("MULTILINESTRING")
})) %>%
unnest(data) %>%
select(-id, -geometry) %>%
rename(geometry = stbbox) %>%
mutate(geometry = map(geometry, .f = function(x){
x[[1]]
})) %>%
st_sf(crs = 4326) -> provbbox

ggplot(st_simplify(prov, dTolerance = 0.02)) +
geom_sf(fill = NA, color = "black",
size = 0.2) +
geom_sf(data = jdx, color = "black",
size = 0.5) +
geom_sf(data = provbbox, color = "#18BC9C") +
coord_sf(crs = "+proj=lcc +lat_1=30 +lat_2=62 +lat_0=0 +lon_0=105 +x_0=0 +y_0=0 +ellps=krass +units=m +no_defs") +
annotate("text", x = -3450000, y = 2800000,
label = str_wrap(paste0("这幅图展示了 2020 年中国省、自治区、直辖市的经纬度范围。"), width = 25),
family = "Songti", hjust = 0,
color = "#580000", size = 4) +
annotation_scale(
width_hint = 0.2,
text_family = "Songti",
pad_x = unit(0.5, "cm")
) +
annotation_north_arrow(
location = "bl",
which_north = "false",
pad_x = unit(0.85, "cm"),
pad_y = unit(0.5, "cm"),
width = unit(1.6, "cm"),
height = unit(2, "cm"),
style = north_arrow_fancy_orienteering(
text_family = "Songti"
)
) +
labs(caption = "绘制:微信公众号 RStata")

ggsave("2020各省份经纬度范围.png", width = 6.5, height = 6.5)
2020 年各省份经纬度范围

计算各个城市和区县的经纬度范围

方法一模一样:

# 每个城市的经纬度范围
read_sf("2020行政区划/市.shp") -> city

city %>%
mutate(id = row.names(.)) %>%
nest(-id) %>%
mutate(stbbox = map(data, .f = function(x){
st_bbox(x) %>%
as.numeric()
})) %>%
unnest(data) %>%
select(-id, - geometry) %>%
unnest(stbbox) %>%
mutate(kind = rep(c("最小经度", "最小纬度", "最大经度", "最大纬度"), 370)) %>%
spread(kind, stbbox) %>%
writexl::write_xlsx("2020年每个城市的经纬度范围.xlsx")

# 每个区县的经纬度范围
read_sf("2020行政区划/县.shp") -> county

county %>%
mutate(id = row.names(.)) %>%
nest(-id) %>%
mutate(stbbox = map(data, .f = function(x){
st_bbox(x) %>%
as.numeric()
})) %>%
unnest(data) %>%
select(-id, - geometry) %>%
unnest(stbbox) %>%
mutate(kind = rep(c("最小经度", "最小纬度", "最大经度", "最大纬度"), 2878)) %>%
spread(kind, stbbox) %>%
writexl::write_xlsx("2020年每个区县的经纬度范围.xlsx")

这样我们就得到了每个省份、城市和区县的经纬度范围:

  1. 2020年每个城市的经纬度范围.xlsx
  2. 2020年每个区县的经纬度范围.xlsx
  3. 2020年每个省份的经纬度范围.xlsx

点击这里跳转到 RStata 短书平台获取附件:使用 R 语言计算各个省市区县的经纬度范围

评论