用R画地图

打算开始用R画地图,看了些关于用R画图的博文,基本原理大概是需要一个shape地图文件,shape文件中实际上是每个区域的多边形表示。这个文件现在国家基础地理信息中心已经没有了,需要到别的地方下载。

Global Administrative Areas这个地方有shape文件下载,不过其中中国的地图没有台湾和南海的,台湾被做成了一个单独的shape文件。shape的文件格式的详细介绍在这里 shapefile

官方的地图数据有4个文件:bou1_4m.zip、bou2_4m.zip、bou3_4m.zip和bou4_4m.zip。bou代表边界的意思,数字1~4代表国家、省、市、县的4级行政划分;4m代表比例是400万分之一。每个文件解压缩后含有两类文件:以字母p结尾的表示多边形数据,用来绘制区域;以字母l结尾的文件是线形数据,用来绘制边界。但是老版数据中,市级数据中缺少绘制区域的多边形数据。

我看了下gadm的中国数据,其中有4个csv文件, 也分别为国家省市地区的行政区划分。文件也都是齐的。应该可以用来画图的。粗粗看了下,除了中国的省份数据不对以外,上海的行政区划也不对,竟然还包含了嵊泗县。这里的数据太不靠谱了。估计用这个数据画出来的图会被人骂的。

还是直接用原官方的数据吧。

    mydat= readShapePoly("map\\bou2\\bou2_4p.shp")
    mymap = ggplot(data = fortify(mydat)) +
                      geom_polygon(aes(x = long, y = lat, group=group), colour = "blue",
                      fill = "green") +
                      theme_grey() + labs(title="中华人民共和国地图",x="",y="") + coord_map()
    print(mymap)

画出来的效果如下:
中国地图

另外如果要为不同的省涂上不同的颜色,可以在上面这个图上添加新的层,下面是画中国地图和添加省份图的R代码:

    chinaMap<-function()
    {
    mydat= readShapePoly("map\\bou2\\bou2_4p.shp")
    mymap = ggplot(data = fortify(mydat)) +
                      geom_polygon(aes(x = long, y = lat, group=group), colour = "blue",
                      fill = c("green") ) +
                      theme_grey() + labs(title="中华人民共和国地图",x="",y="")

    return (list(dat=mydat,map=mymap))
    }

    appendProvMap<-function(chinaDat,map,name,color)
    {
                  prov=chinaDat[which(chinaDat$NAME==name),]
                  mymap = map +
                                    geom_polygon(aes(x = long, y = lat, group=group),
                                    fill = color, data=prov )
                 return(mymap)
    }

    aa=chinaMap()
    mymap=appendProvMap(aa$dat,aa$map,"上海市","red")
    mymap=appendProvMap(aa$dat,mymap,"湖北省","red")
    mymap=appendProvMap(aa$dat,mymap,"北京市","red") + coord_map()
    print(mymap)

效果如下:

china2

最后看看在地图上添加城市,主要是添加省会城市,这里只需要找到各省会城市的坐标(经纬度)就可以了。可以在网上找到这些数据。把这些数据做成一个数据框,然后利用ggplot再添加一个图层就可以了。下面是画中国地图,然后添加个省会城市的代码

    library(ggplot2)
    library(maptools)
    library(mapproj)
    mydat=readShapePoly("bou2_4p.shp")

    mymap = ggplot(data = fortify(mydat)) +
            geom_polygon(aes(x = long, y = lat, group=group), colour = "blue", fill = c("green") ) +
            theme_grey() + labs(title="中华人民共和国地图",x="",y="")

    city=read.table("FinalCap.txt",head=T)

    mymap=mymap + geom_point(aes(x=long,y=lat),color="red",data=city)
    mymap = mymap + geom_text(aes(x=long,y=lat,label=name), data=city) + coord_map()
    png("china2.png", width=1024,height=768)
    print(mymap)
    dev.off()

结果如图:中国地图

本文中用到的数据和代码下载,点这里

注:后来我把这些东西放到一个R包中了,可以很简单的在中国地图上绘制各省的地图。详见 http://www.bagualu.net/wordpress/archives/5399

 

参考博文:

用R软件绘制中国分省市地图
如何用R实现空间数据可视化



本文地址: http://www.bagualu.net/wordpress/archives/4799 转载请注明




“用R画地图”的3个回复

  1. 遇到中文就不行了。
    read.table之后,用print()检查就是乱码。
    加设置encoding=“”UTF-8“能正确读,但是绘图print(mymap)还是乱码。而且经常对txt的names long lat也是匹配错误。

发表评论

电子邮件地址不会被公开。 必填项已用*标注