先需要下载中国地图的GIS数据,GIS 地图有很多种存储格式,其中 shapefile 格式(.shp)可以通过 R 的 maptools 包打开。
(http://bbs.pinggu.org/thread-4831599-1-1.html人大经济论坛上有一个链接可下载)
(https://cosx.org/2009/07/drawing-china-map-using-r统计之都上这篇文章也有下载地址)
(https://gadm.org/download_country.html这个简介里可下载任何国家的shap文件)
(中国地图 GIS 数据的官方数据可以在国家基础地理信息中心的网站(http://nfgis.nsdi.gov.cn) 里面可以免费下载。官方公开的数据包括:地图数据,及居住地、交通、河流等辅助数据)
下图这是下载解压后的情况:
地图数据有 4 个压缩文件:bou1_4m.zip、bou2_4m.zip、bou3_4m.zip 和 bou4_4m.zip。bou 代表边界的意思,数字 1~4 代表国家、省、市、县的 4 级行政划分;4m 代表比例是 400 万分之一,这个比例的图形是公开的。每个文件解压缩后含有两类文件:以字母 p 结尾的表示多边形数据,用来绘制区域;以字母 l 结尾的文件是线形数据,用来绘制边界。但是老版数据中,市级数据中缺少绘制区域的多边形数据,让市级分布图的绘制稍麻烦一些,新版中也许会有改进。
举一个小例子:
自己代码实现:
setwd("E:/中国GIS地图/国家基础地理数据")
library("maptools")plot(china_map)
plot(china_map,col=gray(924:0/924))#在地图上绘上颜色plot(china_map, col = getColor(china_map, provname, provcol, "white"))
或者直接plot(china_map,col=rgetColor(china_map,c("广东省","四川省","重庆市"),c("red","blue","black"),"white"))
plot(china_map, col = getColor(china_map, provname, provcol, "white"), xlab = "", ylab = "");
library(maptools)
x=readShapePoly("bou2_4m/bou2_4p.shp")
getColor=function(mapdata,provname,provcol,othercol)
{
f=function(x,y) ifelse(x %in% y,which(y==x),0);
colIndex=sapply(iconv(x@data$NAME,from="CP936", to="UTF-8"),f,provname);
col=c(othercol,provcol)[colIndex+1];
return(col);
} #编制函数,类似于上边那个函数
provname=c("黑龙江省", "江苏省", "浙江省", "江西省", "山东省", "湖北省", "四川省", "甘肃省")
provcol=c("grey","grey","grey","grey","grey","grey","grey","grey")
plot(x, col = getColor(x,provname,provcol,"white"), xlab = "", ylab = "")
title("Map of China")
但是,可以看出这样绘制的地图的形状有些扁平。这是因为,在绘图的过程中,默认把经度和纬度作为普通数据,均匀平等对待,绘制在笛卡尔坐标系上造成的。其实,地球的球面图形如何映射到平面图上,在地理学上是有一系列不同的专业算法的。地图不应该画在普通的笛卡尔坐标系上,而是要画在地理学专业的坐标系上。在这一点上,R 的 ggplot2 包提供了专门的coord_map()
函数。所以推荐 R 的 ggplot2 包来绘制地图。
setwd("E:/中国GIS地图/国家基础地理数据")
china_map=readShapePoly("bou2_4m/bou2_4p.shp")
library(ggplot2)
mymap = ggplot(data = fortify(china_map)) +
geom_polygon(aes(x = long, y = lat, group = id), colour = "black",
fill = NA) +
theme_grey()
print(mymap + coord_map())
或者
library(maptools)
x=readShapePoly("bou2_4m/bou2_4p.shp")
library(ggplot2)
library(mapproj)
mymap=ggplot(data = fortify(x))+geom_polygon(aes(x=long,y=lat,group=id),colour="black",fill=NA)+theme_grey()
print(mymap+coord_map())【这两段代码一模一样】