写在前面
众所周知,标准地图仅有JPG、EPS两种数据格式,即便使用Arcgis等专业软件,也难以完美复刻自然资源部提供的参考地图。因为官方并未公开地图的矢量数据和投影参数。为了开发出一款使用R语言复刻标准地图的R包,本人阅读了各种公开的资料,筛选和比较网上的各种数据源和投影参数,终于在ggplot2的框架下开发了一款名为ggmapcn的R包。该包提供了一种生产标准中国地图的方法,或许仍存在一些不足之处,本人会根据大家的批评与意见持续迭代更新该R包。
本文为学习交流使用,不用于商业目的,内容仅供参考
01
1.1
国家标准地图服务系统
国家标准地图服务系统于2016年10月上线,由自然资源部地图技术审查中心承办。
访问地址为:http://bzdt.ch.mnr.gov.cn/
图1. 国家标准地图服务系统首页
标准地图是我们进行新闻宣传、书刊报纸插图、广告展示背景图等制图的权威参考,也是编制公开版地图的参考底图。社会公众可以免费浏览、下载标准地图,直接使用标准地图时需要标注审图号。
然而,标准地图仅有JPG、EPS两种数据格式。如果我们想对标准地图进行直接编辑,通常只能使用Adobe Illustrator等软件编辑EPS格式地图。对地图内容编辑(包括放大、缩小和裁切)改动的,公开使用前还需要送自然资源主管部门审核。
在科学研究中,我们有时需要展示较大范围的研究区,往往需要制作国界、边界等符合规范的中国地图。在这种情况下,基于矢量文件进行地图制作几乎是必经之路,但官方并未提供相应数据服务,需要我们自制地图并送自然资源主管部门审核,在出版前标注地图的审图号。
1.2
常用地图的比例尺及投影
在国家标准地图服务系统中,我们可以下载到地图比例尺为1:740万、1:1000万等。
图2. 不同比例尺的标准地图
通常,根据我国的地理分布以及各种投影的特点,我国使用地图投影的选择通常采用以下标准[1]:
“
Lambert投影
等角割圆锥投影,没有角度变形,两条标准纬线上没有任何变形,由于采用了分带投影,每带纬差较小,因此我国范围内的变形几乎相等,最大长度变形不超过±0.03%,最大面积变形不大于±0.06%。我国的基本比例尺地形图中1:100万地形图、大部分省区图以及大多数这一比例尺或者更小比例尺的地图多采用Lambert投影。
“
高斯克吕格投影
即等角横轴切椭圆柱投影,将中央经线投影为直线,其长度没有变形,与球面实际长度相等,其余经线为向极点收敛的弧线,距中央经线愈远,变形愈大。我国的基本比例尺地形图中1:50万、1:25万、1:10万、1:5万、1:2.5万、1:1万、1:5000通常采用采用高斯克吕格投影。
“
Albers投影
Albers投影,即双标准纬线等积割圆锥投影,没有面积变形、两条标准纬线上不变形,在图上保持正确的面积对比,适用于遥感监测中的种植面积动态监测。Albers投影和Lambert投影属于同一投影系统的(均为正轴割圆锥投影),该投影在中国,中央经线一般取105°E,两条标准纬线为25°N和47°N。
1.3
标准地图的投影选取
在参考标准地图进行制图时,大多数人选择使用前面所述的Albers投影,中央经纬为105°或者110°。然而无论怎么选择参数,制作出的地图总是不能与标准地图的参考图完美贴合。
在《标准地图,想说爱你不容易__关于标准地图投影方式的判定》一文中[2],博主认为标准地图使用的原始底图较早,在Albers投影上还可能存在一定变形。
2024年的推文《带审图号标准地图制作,如何设置中国地图的标准投影?》提到,有博主在询问过相关人士后了解到标准地图采用的是Azimuthal Equidistant投影。虽然没有官方资料证明该投影的权威性,但笔者试过后觉得效果挺好。在Arcgis中,该投影的参数设置如下:
图3. Azimuthal Equidistant投影
02
2.1
2024版标准矢量地图的获取
绘制标准地图最重要的是边界不能出错,这就需要我们拿到最准确的矢量文件。目前,天地图已经共享了中国省、市、县的边界文件,该数据来自国家基础地理信息中心。
其访问地址为:
https://cloudcenter.tianditu.gov.cn/dataSource
图4. 天地图服务中心
在下载页面中,我们可以看到在线地图的审图号为GS(2024)0650号。我们有理由相信这个底图数据是权威且符合规范的。
图5. 天地图行政区划可视化
2.2
ggmapcn的开发思路
虽然已经有一些开发者开发了绘制中国地图的R包,但这些包的出图样式并不是特别接近标准地图,并且其数据源可能来自早期的民政部网站/阿里巴巴/或者网络流传的2019版、2020版审图号文件,其权威性和时效性可能不算理想。此外,我希望开发一个R包来更好地实现下面的功能:
使用R绘制出的地图可以与标准地图的EPS文件有很好的贴合度;
地图的样式接近标准地图,国界线外有缓冲线、海岸线可以单独着色为蓝色。
R包本身的使用不需要太多代码,适合R语言的新手,但可以与ggplot很好地交互。
因此,我从这些角度出发设计了名为ggmapcn的R包。
2.3
ggmapcn的安装
本人已将该包传到github上,访问网站为:
https://github.com/Rimagination/ggmapcn
在R中,我们使用如下代码进行安装:
devtools::install_github("Rimagination/ggmapcn")
接着,我们加载该包,同时加载ggplot2包。
library(ggplot2)
library(ggmapcn)
2.4
ggmapcn的使用
(1)geom_mapcn()函数的使用
仅需使用geom_mapcn()即可调用绘制具有省份边界的中国地图。该地图默认使用 Azimuthal Equidistant投影。
ggplot() +
geom_mapcn() +
theme_minimal() #简洁的网格主题
仅需使用geom_mapcn()即可调用绘制具有省份边界的中国地图。该地图默认使用 Azimuthal Equidistant投影。
ggplot() +
geom_mapcn() +
theme_minimal() #简洁的网格主题
如果您想尝试 Albers 投影,可以更改crs参数对其进行自定义。我们还可以调节其他美学参数。
ggplot() +
geom_mapcn(crs = "+proj=aea +lat_1=25 +lat_2=47 +lat_0=0 +lon_0=105 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs",
color = "black",
fill = "white",
size = 0.7) +
theme_minimal()
(2)geom_mapcn()函数的使用
geom_boundary_cn()用于将大陆边界和海岸线添加到 地图。您可以分别设置大陆边界和海岸线的颜色和粗细:
ggplot() +
geom_mapcn(fill = NA) +
geom_boundary_cn(
mainland_color = "black",
mainland_size = 0.5,
coastline_color = "skyblue",
coastline_size = 0.5
) +
theme_minimal()
(3)geom_buffer_cn()函数的使用
geom_buffer_cn()用于指定国界的缓冲距离和颜色等。以下示例显示了在一个地图上组合不同距离的缓冲区的方法:
ggplot() +
geom_buffer_cn(mainland_dist = 50000) +
geom_buffer_cn(mainland_dist = 20000, fill = "#BBB3D8") +
theme_minimal()
(4)绘制中国地图的完整示例
以下是一个全面的示例,演示了如何绘制一张标准地图:
ggplot() +
geom_buffer_cn(mainland_dist = 40000) +
geom_buffer_cn(mainland_dist = 20000, fill = "#BBB3D8") +
geom_mapcn(fill = "white") +
geom_boundary_cn() +
theme_minimal()
点击Rstudio右下角的Plots-Save as PDF:
图片尺寸选择 25 × 25 inches,然后点击save:
为了对比图片的贴合度,这里我下载了2022年的中国地图 1:1000万 对开无邻国版的标准地图EPS文件,将其在Adobe Illustrator中打开。
将导出后的图片拉到打开的文件中,调整不透明度,并拖动图片对齐两个图层的地图,效果如下:
gif动图
近乎完美重合了,实际上更精细地微调一下图片大小会更贴合,但 25 × 25 inches这个出图尺寸比较好记,几乎直出就是可以送审的图。
我也试着和另一张彩色的标准地图重叠,效果类似:
gif动图
最后,这是笔者第一次公开发布一个R包,里面有的细节或许还能优化,某些功能或许考虑得不是很全面,欢迎大家批评指导,谢谢!
参考资料
[1] Arcgis使用教程(二)ARCGIS常用数据格式及地图投影_arcgis投影介绍-CSDN博客
[2] 标准地图,想说爱你不容易__关于标准地图投影方式的判定。微信公众号-小雷鸟的窝
[3] 带审图号标准地图制作,如何设置中国地图的标准投影?微信公众号-城市感知计算
点击“在看”,让大数据记住你的喜好