R-如何用语言画中国地图(含南海诸岛和九段线)

目标:用R绘制标准的中国地图,并且分省给图片上色(分别生成中文版和英文版)。

用到的分省数据如图1所示。

图1 本文用到的分省市自治区数据

在自然资源部的标准地图服务中,可以找到很规范的中国地图、世界地图。标准地图服务系统 (mnr.gov.cn)。利用该网站的自助地图服务,可以绘制精美的中国地图,如图2所示:

图2 利用自助上色服务生成的中国地图(我自己添加了指北针和比例尺)

用该网站绘制中国地图的好处是准确简单高效,缺点是无法绘制英文版的地图。我们可以利用R语言绘制更加符合个性化需要的中国地图。我们要用到的中国地图GIS数据如下(如果大家需要地图压缩包,我可以在评论区给出网盘地址):

bou2_4p.shp:中国政区的面文件

bou2_4l.shp:中国政区的线文件,在这个线文件里包含了南海的九段线

九段线.shp:南海九段线的线文件。我自己数过,我们中国地图的下方有十段线,那为什么会多出来一段线呢?原因是南海断续线之外,又在台湾岛与琉球群岛之间增加了一段线,形成了南海九段线、台湾岛东侧一段线的“海疆十段线”基本格局。

#####本文需要的包

library(rgdal)

library(sf)

#####导入本文需要的中国地图、中国边界数据和南海九段线,并分别画图。rgdal包的readOGR函数或sf包的st_read函数都可以读shp文件。大家导入了三张基础地图后,可以打开数据文件,看一下数据的基本结构。

china_map<-rgdal::readOGR('F:\\地图\\bou2_4p.shp')#引号内为bou2_4p.shp文件路径

plot(china_map)

图3 利用bou2_4p文件绘制的基础中国地图数据(用于给省市数据填色)

bianjing<-rgdal::readOGR('F:\\地图\\中国省市县\\中国国界与省界-含九段线\\bou2_4l.shp')

plot(bianjing,color='grey30')


图4 利用bou2_4l文件绘制的中国地图边界数据

nine<-st_read('F:\\地图\\R中国地图模板\\SouthSea\\九段线.shp')

plot(nine)

图5 利用九段线文件单独展示南疆十段线

#绘制中国地图数据

unique(china_map@data$NAME)

图6 china_map中的省市名

#读取china_map中的行政信息,并引入id信息,方便后面与china_map1合并,-1为了与china_map1一致同为从0开始

x <-china_map@data

xs <-data.frame(x,id=seq(1:925)-1)

#将china_map转化为数据框,合并xs和china_map1 这两个数据框,joining by id

china_map1 <-fortify(china_map)

china_map_data <-plyr::join(china_map1, xs,by="id", type = "full")

#引入南海九段线。结合南海九段线的经纬度,在边界信息中只选择九段线相关的数据。合并china_map_data和china_map2这两个数据框,joining by id

china_map2<-fortify(bianjing)

china_map2<-subset(china_map2,id==1087|id==1336|id==1377|id==1475|id==1481|id==1784|id==1769|id==1764|id==1508|id==1488)

china_map_data <-plyr::join(china_map_data ,china_map2,by="id", type = "full")

#引入各省市自治区的数据,合并china_map_data和mydata这两个数据框,joining by NAME

mydata<- read_xlsx('F:\\地图\\地图尝试1.xlsx',sheet= 'Sheet1')

windowsFonts(A=windowsFont("Times New Roman"),B=windowsFont("Arial"))

china_data<-join(china_map_data,mydata,type='full')

#合并中国地图和九段线+东海中日领海分界线

china_data1<-merge(china_data,china_map2,by=c("order","piece","id","group"),all=TRUE)

china_data1$long<-ifelse(is.na(china_data1$long.x)==TRUE,china_data1$long.y,china_data1$long.x)#china_data和china_map2的经纬度

china_data1$lat<-ifelse(is.na(china_data1$lat.x)==TRUE,china_data1$lat.y,china_data1$lat.x)

midpos <- function(x) mean(range(x,na.rm=TRUE))

#找出各省市自治区地理位置的中心点,为了图片美观,我们调整了图中部分文字的位置。

centres <- ddply(china_data,.(eng),colwise(midpos,.(long,lat)))

centres<-mutate(centres,long=ifelse(eng=="Hainan",110.1,

                                    ifelse(eng=="Hebei",115.2,

                                          ifelse(eng=="Gansu",104,

                                                  ifelse(eng=="Inner Mongoria",107,long)))))

centres<-mutate(centres,lat=ifelse(eng=="Hainan",19.32,

                                  ifelse(eng=="Sichuan",30.8,

                                          ifelse(eng=="Shaanxi",34.8,

                                                ifelse(eng=="Gansu",36,

                                                        ifelse(eng=="Guangdong",23.2,

                                                              ifelse(eng=="Guangxi",24,

                                                                      ifelse(eng=="Guangxi",24,

                                                                            ifelse(eng=="Hebei",38.1,

                                                                                    ifelse(eng=="Tianjin",39.1,

                                                                                          ifelse(eng=="Inner Mongoria",41,lat)))))))))))

##绘制地图

ggplot(china_data1,aes(long,lat))+

geom_polygon(aes(group=group,fill=count),colour='grey41')+#以人口的值区分各省份的颜色,col即colour缩写,为边界颜色

scale_fill_gradient(low='white',high='aquamarine3')+

coord_map('polyconic') +

geom_text(aes(label=eng),family="A",data=centres )+#横坐标x对应经度,纵坐标y对应维度,经纬度确认的坐标为标签显示的位置,label即标签为图中显示的值

theme(panel.grid = element_blank(),

      panel.background = element_blank(),

      axis.text = element_blank(),

      axis.ticks = element_blank(),

      axis.title = element_blank(),

      legend.position = c(0.85,0.45)#调整图例位置

      )


属于我们中国的领土一点不能少!


图7 利用R语言绘制的中国地图(含南海诸岛和国界九段线
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容