在之前的课程中我分享过使用 Stata 绘制长三角 26 个城市的地图的数据和代码。
使用 Stata 绘制长三角地图城市地图(带指北针和比例尺):https://rstata.duanshu.com/#/brief/course/04578a56fede4d2d91a74ae8b92d442b
在使用本数据前请确保你已经学习过下面两个课程:
- 使用 Stata 绘制历年中国省级行政区划(小地图版本 + 长版):https://rstata.duanshu.com/#/brief/course/e194d75fe1674f7c8921daec1ece7f7d
- 使用 Stata 绘制历年中国市级行政区划(小地图版本 + 长版):https://rstata.duanshu.com/#/brief/course/0e9d78633ae64fefa684d6aad89633bc
在这些课程的基础上,今天我们继续讲解如何使用 Stata 绘制长三角城市群高程地图。
由于 Stata 没法处理栅格数据,所以我们还是需要先使用 R 语言初步处理下。处理的目标就是得到每个坐标点的高程数据。
附件中的 dem_500m 文件夹里面存放了 500m 分辨率的全国 DEM 数据。本来想把这个数据直接转换成 dta 格式的,不过转换结果太大了,反而没办法使用了。
下面我们使用 R 语言提取长三角城市群的高程数据并转换成 dta 格式的。
如果没办法理解这部分代码可以联系李老师帮忙提取。
加在所需 R 包:
library(tidyverse) library(terra)
|
读取 DEM 栅格数据:
rast("dem_500m/w001001.adf") -> rst rst
#> class : SpatRaster #> dimensions : 10085, 17763, 1 (nrow, ncol, nlyr) #> resolution : 0.004031287, 0.004031287 (x, y) #> extent : 66.39632, 138.0041, 14.90839, 55.56392 (xmin, xmax, ymin, ymax) #> coord. ref. : lon/lat WGS 84 (EPSG:4326) #> source : w001001.adf #> name : w001001 #> min value : -268 #> max value : 8405
|
为了提取长三角地区的,我们需要准备一份长三角矢量数据:
library(sf) read_sf("2021行政区划/市.shp") -> city
mycrs <- "+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"
city %>% st_transform(mycrs) -> cityaea
readxl::read_xlsx("长三角.xlsx", sheet = 2) %>% pull(城市) -> csjcitylist
csjcitylist
cityaea %>% filter(市 %in% csjcitylist) -> csjcity
csjcity
csjcity %>% st_union() -> csjcityall
|
然后我们就可以把刚刚读取的 rst 转换成 mycrs 坐标系,然后再裁减出 csjcityall 区域的部分:
rst %>% project(mycrs) %>% terra::crop(vect(csjcityall)) %>% terra::mask(vect(csjcityall)) -> rst2
plot(rst2)
|

最后我们再把这个数据转换成 dta 格式的:
library(raster) raster(rst2) %>% rasterToPoints(spatial = T) %>% st_as_sf() -> rst2sf
bind_cols( rst2sf %>% st_drop_geometry(), rst2sf %>% st_coordinates() %>% as_tibble() %>% set_names("x", "y") ) %>% as_tibble() %>% rename(dem = w001001) -> rstdf
rstdf
rstdf %>% haven::write_dta("dempoint.dta", label = "数据处理:微信公众号 RStata")
|
下面我们就可以把这个数据绘制到地图上了。
为了让不同高程的点显示不同的颜色,我们需要对高程变量进行分组:
use dempoint.dta, clear
egen group = cut(dem), group(9) save pointdata, replace
|
对于文本标签,我们希望城市标签使用灰色、指北针和比例尺标签使用黑色,所以也需要生成一个分组变量:
use csjcity_label, clear gen group = !inlist(cname, "N", "200km") save csjcity_label2, replace
|
然后就可以绘制地图了:
use csjcity_db.dta, clear grmap using csjcity_coord.dta, id(ID) osize(thin ...) ocolor(white ...) fcolor("white") leg(off) graphr(margin(medium)) polygon(data(csjpolygon) fcolor(black) osize(vvthin)) line(data(csjcity_line_coord.dta) size(*0.5) pattern(solid) color(black)) label(data(csjcity_label2) x(X) y(Y) by(group) label(cname) length(20) size(*0.7 *0.7) color(black gs12)) point(data(pointdata) x(x) y(y) by(group) size(vtiny ...) fcolor("252 251 253" "239 237 245" "218 218 235" "188 189 220" "158 154 200" "128 125 186" "106 81 163" "84 39 143" "63 0 125")) ti("使用 Stata 绘制长三角地区地形图") subti("绘制:微信公众号 RStata") gr export pic1a.png, replace width(4800)
|

这种渐变色的颜色可以从这里获取:
https://tidyfriday.cn/colors/#type=sequential&scheme=BuGn&n=9

点击这里跳转到 RStata 短书平台获取附件:使用 Stata 绘制长三角城市群高程地图
评论