*- 把 shp 文件转换成 dta 文件 local name = "jsmap" shp2dta using `name'/`name', database(`name'_db) coordinates(`name'_coord) genid(ID) gencentroids(centroids) replace shp2dta using `name'/`name'_line, database(`name'_line_db) coordinates(`name'_line_coord) genid(ID) gencentroids(centroids) replace
这样就会得到四个文件:
jsmap_db.dta
jsmap_coord.dta
jsmap_line_coord.dta
jsmap_line_db.dta
其中前两个是底图的属性数据和坐标系数据,后面两个是线条的。
下面还需要对数据进行下调整。
首先是删除底图上的比例尺和指北针数据,因为这两个元素计划使用线条和多边形选项绘制:
use jsmap_db.dta, clear *- 删除比例尺和指北针 dropifindex(县, "_") save jsmap_db.dta, replace
再创建比例尺和指北针的多边形数据:
use jsmap_coord.dta, clear *- 保留指北针和比例尺对应的观测值 keepif _ID > 96 gen value = 1 save jsmap_polyon, replace
再对线条进行分组:
*- 线条 use jsmap_line_db.dta, clear *- 分组 gen group = 1 replace group = 2 ifindex(市, "边界") replace group = 3 ifindex(省, "边界") replace group = 4 ifindex(省, "_") keep ID group ren ID _ID save temp, replace
use jsmap_line_coord.dta, clear mergem:1 _ID using temp drop _m save jsmap_line_coord, replace
这里我把线条分为四类:
区县边界;
城市边界;
省份边界;
比例尺和指北针的线条。
后面的代码中也会根据不同的线条类型使用不同的颜色和粗细。
统计 2021 年每个区县的年均 PM2.5 浓度:
import excel using "1998~2021年中国各区县PM2_5面板数据.xlsx", clear first keepifinlist(省, "江苏省") & 年份 == 2021 drop 年份 sum min max sd renmean PM2_5 keep 县代码 PM2_5 save"PM2_5", replace
然后就可以绘制地图了:
use jsmap_db.dta, clear merge 1:1 县代码 using PM2_5 dropif _m == 2 drop _m
local name = "江苏湖泊" shp2dta using `name'/`name', database(`name'_db) coordinates(`name'_coord) genid(ID) replace
*- 把这个数据转换坐标系后再和 jsmap_polyon.dta 合并起来即可 use jsmap_polyon, clear
use 江苏湖泊_db, clear
use 江苏湖泊_coord, clear gen value = 2 geo2xy _Y _X, projection(albers, 6378137 298.257223563 25 47 0 105) replace append using jsmap_polyon save jsmap_polyon2, replace
处理河流数据:
local name = "江苏河流" shp2dta using `name'/`name', database(`name'_db) coordinates(`name'_coord) genid(ID) replace
*- 把这个数据转换坐标系后再和 jsmap_line_coord.dta 合并起来即可 use jsmap_line_coord, clear
use 江苏河流_db, clear
use 江苏河流_coord, clear gen group = 5 geo2xy _Y _X, projection(albers, 6378137 298.257223563 25 47 0 105) replace append using jsmap_line_coord save jsmap_line_coord2, replace
最后就可以江苏省区县地图上添加湖泊河流分布了:
use jsmap_db.dta, clear merge 1:1 县代码 using PM2_5 dropif _m == 2 drop _m
评论