R-怎样用语言画中国舆图(含南海诸岛和九段线)

分享
开发者 2024-9-28 00:50:13 120 0 来自 中国
目标:用R绘制标准的中国舆图,而且分省给图片上色(分别天生中文版和英文版)。
用到的分省数据如图1所示。
1.png 在天然资源部的标准舆图服务中,可以找到很规范的中国舆图、天下舆图。标准舆图服务体系 (mnr.gov.cn)。利用该网站的自助舆图服务,可以绘制精致的中国舆图,如图2所示:
2.jpg 用该网站绘制中国舆图的利益是准确简朴高效,缺点是无法绘制英文版的舆图。我们可以利用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)
bianjing<-rgdal::readOGR('F:\\舆图\\中国省市县\\中国国界与省界-含九段线\\bou2_4l.shp')
plot(bianjing,color='grey30')


4.png nine<-st_read('F:\\舆图\\R中国舆图模板\\SouthSea\\九段线.shp')
plot(nine)
#绘制中国舆图数据
unique(china_map@data$NAME)
#读取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.png
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-22 10:02, Processed in 0.167903 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表