实用技术 | 如何用R绘制地图中的未定国界(含停火线)

由于目前市面上出版的中国地图仍以1989年的国界线为准,因此即便之后中国与周边国家陆续签订了边界协定,完成了边界划定工作,但是有些边界划定并未在现行出版的地图上进行反映或更新,所以我们迄今会看到国内出版的中国地图(无论是纸质地图还是电子地图)在与塔吉克斯坦交界处有一段未定国界(如图1所示):

图1

从本质上来说,在R中实现未定国界的绘制就是解决多边形中共享边(或共享边中的一部分)的设置问题,如果我们有现成的共享边(或共享边中的一部分)的文件,则可以在此基础上快速绘出未定国界(将其设置成虚线或其他非实线的形式即可),这当然是最理想的情况。但如果我们一时间无法拿到这些文件,则需要综合利用多种手段,最后再用Adobe Illustrator或Photoshop之类的软件加以完善。在今天推送的实用技术贴中,我们将给出两种基本解决方案,分别适合绘制标准中国地图中的未定国界和其他国家的未定国界。

首先,对于绘制标准中国地图的未定国界而言,完整通过代码处理起来手续比较复杂。因为现行出版地图中中塔两国的未定国界只占中塔全部边界的一部分,如果全部要用代码实现,那么我们必须从头到尾弄清楚未定国界的起止范围。机缘巧合的是,笔者费了很长时间终于找到了未定国界的shp,这样就为快速实现中塔边界中未定国界段的绘制奠定了基础。对此,我们在R中主要用到tidyverse和sf两个包来完成绘制,具体步骤如下:

# 载入绘制地图必备的tidyverse和sf两个包library(tidyverse)library(sf)# 载入中国地图和未定国界文件China <- read_sf("Chinaditu.json")ChinaUndeterminedBorder <- read_sf("ChinaUndeterminedBorder")# 绘制带有未定国界的标准中国地图ggplot()+ geom_sf(data = China, colour = "black", fill = "white")+ geom_sf(data = ChinaUndeterminedBorder, colour = "white", linetype = "dotted")+ coord_sf(crs = "+proj=laea +lat_0=40 +lon_0=104")+ theme(panel.background = element_blank())
图2

这里绘制未定国界的原理很简单,就是利用将交错显示的原理,通过将未定国界设色成与其他边界(黑色)不同的颜色(白色)并设置其形状为点,叠加到原来的主图层上即可。

但是如果我们没有拿到共享边(部分共享边)的文件时该怎么做呢?下面我们分别以朝鲜韩国两国以及埃及、苏丹和南苏丹三国之间的未定国界为例进行说明。众所周知,朝韩两国迄今以军事停火线(也就是著名的“三八线”)划定边界,因此两国边界不可以直接按照实线绘制,但是可以参照未定国界的表述方式进行标注,具体步骤如下:

# 载入世界地图world <- read_sf("shijieditu")# 选取世界地图中的朝鲜和韩国两国TK <- world %>% filter(country2 %in% c("South Korea", "North Korea"))# 重新设置边界borders <- st_cast(st_geometry(TK), 'MULTILINESTRING')border1 <- st_difference(borders[1], borders[2])border2 <- st_difference(borders[2], borders[1])shared <- st_intersection(borders[1], borders[2])# 将两国的多边形文件合并TKnew <- st_union(TK)# 绘制朝鲜韩国及其军事分界线ggplot()+ geom_sf(data = TKnew, colour = "black", alpha = 0)+ geom_sf(data = shared, colour = "black", linetype = "dotted")+  theme(panel.background = element_blank())

生成的效果如图3所示:

图3

值得指出的是,上述步骤中最重要的一步就是利用st_union命令将两个多边形合并。在完成这一步后,我们也可以按照下面的代码(利用ggplot绘图时层层叠加的原理)达到几乎同样甚至是更好的效果(如图4所示,但有时也可能存在细微的咬合“错位”问题):

ggplot()+ geom_sf(data = TKnew, colour = "black", alpha = 0)+ geom_sf(data = world %>% filter(country2 %in% "South Korea"), colour = "black", alpha = 0, linetype = "dotted")+ theme(panel.background = element_blank())

图4

下面我们转向本文要举例说明的第三个例子,即苏丹、南苏丹和埃及之间的边界绘制。首先我们将目光投向苏丹和南苏丹两国之间的边界。2011年,南苏丹从苏丹正式独立,并获得国际社会的普遍承认,但是两国之间仍然存在争议地区,因此边界当以未定国界表示,绘制步骤和结果如下:

# Sudan and South SudanSSS <- world %>% filter(country2 %in% c("Sudan", "South Sudan"))borders <- st_cast(st_geometry(SSS), 'MULTILINESTRING')border1 <- st_difference(borders[1], borders[2])border2 <- st_difference(borders[2], borders[1])shared <- st_intersection(borders[1], borders[2])# 将苏丹和南苏丹两国的多边形文件合并SSSnew <- st_union(SSS)ggplot()+ geom_sf(data = SSSnew, colour = "black", alpha = 0)+ geom_sf(data = shared, colour = 'black', linetype = "dotted")+ theme(panel.background = element_blank())
图5

当然这幅地图上的苏丹地图还不是完整的,如下图所示:它和埃及还存在几处争议地区,分别是下图中的瓦迪哈勒法(Wadi Halfa)尖角和哈拉伊卜(Hala’ib Triangle)三角区,这些因为英国殖民统治导致的两国之间的领土争端一直持续至今。此外还有两国都未提出主权要求的无主地——比尔泰维勒(Bi’r Tawīl)。

图6

图6底图来源:https://zh.wikipedia.org/wiki/%E5%93%88%E6%8B%89%E4%BC%8A%E5%8D%9C%E4%B8%89%E8%A7%92%E5%8C%BA#/media/File:Map_of_Halaib_Triangle-en.png

为了进行比较完整的复原,我们从GADM网站上下载了埃及和苏丹两国的地图作为补充(这里插句题外话:该网站提供了各个国家和地区比较详细的行政区划地图,但其中涉及中国的地图文件存在严重错误,如要使用请做必要的修改),具体步骤和结果如下:

# 读取从GADM上下载的苏丹和埃及地图文件Sudan <- read_sf("Sudan")Egypt <- read_sf("Egypt")# 将其叠加到原来的南北苏丹的边界图上ggplot()+ geom_sf(data = world %>% filter(country2 %in% "Egypt"), alpha = 0)+ geom_sf(data = Sudan, linetype = "dotted", alpha = 0)+ geom_sf(data = SSSnew, colour = "black", alpha = 0)+ geom_sf(data = Egypt, colour = "black", alpha = 0, linetype = "dotted")+ geom_sf(data = shared, colour = "black", linetype = "dotted", alpha = 0)+ theme(panel.background = element_blank())
图7

至此我们可以看到争议地区已经被比较完整地标注出来了。但需要坦诚的是,由于我们还没有找到两处争议领土范围的精确经纬度,因此依据手头现有的材料对瓦迪哈勒法尖角以及从比尔泰维勒到哈拉伊卜三角洲的北纬22度线按照未定国界处理比较困难,这里可以在生成图片后利用Adobe Illustrator或者Photoshop文件做灵活处理。当然如果我们有这两处的精确范围,则可以参考绘制中国地图中未定国界的方式通过交互设色的方式加以呈现。

写到这里,再跟大家分享一个提高地图送审通过率的方法,这也是业内人士告诉笔者的。如果我们写作的文章/著作中包含的需要送审的地图只是按照某种指标(如经济指标、法治指标等)填充设色的中国地图、各大洲地图或世界地图并且我们对各个国家和地区之间行政边界的把握并不确定时,可以先用R绘制出设色地图,再将R生成的设色地图中的颜色通过图片处理软件的吸管工具提取出来填充到自然资源部发布的标准地图底图中,这样可以确保各个国家和地区之间行政边界的绘制完全符合国内出版要求,从而大大提高地图的过审率。但是这种方法对需要在地图上标注包含经纬度的点在内的其他作业时不一定有效(需要考虑投影差异),因此在使用这一方法时需要具体问题具体分析。

(0)

相关推荐

  • 人工设置网络模块位置2-大尺度空间网络布局应用

    写在前面 多变形排布,将不同的模块按照多变形排布进行.模块越大的部分,其半径越大,是按照模块内节点数量判断到多变形中心的距离. 微生物网络 输入文件 #--导入所需R包#------- library ...

  • 全网最完整的中国地图

    写在前面 目前,R语言中大量的中国地图存在错误,主要包括以下几个部分: 台湾 南海诸岛 西藏南部这些问题还有一些其他的问题我们是不能出现一个错误的,一个都不能有,所以这里我将最为完整的中国地图送过大家 ...

  • 实用技术 | 如何用R绘制并填充相对正确的世界地图

    近几年来,随着负笈海外特别是美国的政治学博士陆续学成回国,R逐渐在高校从事政治学量化研究的师生群体中流行起来,形成了与Stata并驾齐驱的局面.与需要付费购买才能使用的商业统计软件Stata不同,R可 ...

  • 实用技术 | 如何用R快速计算进军距离?以汉丞相诸葛武侯南征为例

    研究国家建构的读者对如何测量国家能力.寻找合适的代理变量一定是不陌生的.我们之前在推送的(<如何测量国家能力?>)一文中也有过较为详细的介绍.但是如果从历史社会学和所谓的历史政治学角度去研 ...

  • 实用技术 | 如何用Stata将实验结果可视化——附论文复盘和R实现

    长期以来,Stata都被视为一款中规中矩的"中阶"统计应用.一方面,Stata内置了能够满足大多数统计要求的算法,控制界面的友好程度也能够接受.因此很多初学者都能平滑地完成从Exc ...

  • 用R绘制采样点地图一例

    # 绘制采样点分布图 version2 # by Jinlong Zhang # jinlongzhang01@gmail.com setwd('C:/Users/admin/Desktop/map' ...

  • 如何用AI绘制一颗钻石的形状

    如何使用AI软件来绘制一颗钻石的形状,钻石就是由三角形做成的,下面来看看操作吧. 1.首先绘制出一个正三角形,填充上粉色. 2.之后将其水平翻转为倒三角的形式. 3.然后打开网格线,调整锚点将三角形对 ...

  • R绘制多彩的森林图:基于ggplot2

    前些日子写了一篇关于R语言绘制森林图(forest plot)的帖子,不知道没有帮助到各位战友(来,挑一款你喜欢的森林图(超实用)).今天给大家带来一个新的森林图,这个森林图前些日子追加在了上一帖子的 ...

  • 中国地图中的知识

    ※江西省和哪几个省相邻?江西省是拥有邻省最多的省份吗? ※从陕西省的安康到河南省的南阳,中间隔着哪几个县? ※蜀汉定都在成都,刘备西征时真的到了昌都吗? ※历史上,吕宋岛离中国这么近,你知道明成祖设置 ...

  • 实用技术 | Github with R:不简明但是很好懂的教程

    Introduction 合适的代码管理工具能帮助同学们在编程的时候提升效率.Git是一款被普遍使用的代码软件,它主要的作用是管理我们所保存过的代码和文件. Git 举一个例子,我们在完成课程作业和论 ...

  • 行军打仗时,指挥员如何用指南针和地图确定己方的地理位置?

    兔哥回答,这个属于确定个人在图上位置,军队术语,"确立图上站立点".在没有卫星定位技术以前都是采用这种方式进行图上定位的.也是侦察兵必须掌握的基本技能的一种.属于地形学科目.这项技 ...