152007

天费了半天劲,才一点点从GIS数据中把中国各省市的多边形“抠”出来。问题缘起于COS论坛上的这个帖子:http://cos.name/bbs/read.php?tid=785,其实我后面的回复基本都跑题了,跑着跑着突然想起上学期上课的时候Prof. Peng, F曾经提到他当年是如何辛辛苦苦用作图软件去搞定地图图示的,我当时听着觉得不应该太困难,于是下课之后去告诉他用R可以很容易做出地图来,他当时问我是不是S-Plus(看来在他们脑子里还是S-Plus的名气大一点),我说类似但不完全一样,云云,最后他问能否作出重庆市的地图,我当时也没仔细注意这个问题,回来一看,map("china")还真没有重庆市。

之后我又花了很长时间找地理数据,其间联系过Victoria University of Wellington的Ray Brownrigg(mapsmapdata等包的作者),他说没有他也没有数据,告诉我要是我能搞到数据他也许可以给我一点Hints,不过我后来死活也没找到;于是开始打另一个注意,就是活生生去读一幅空白中国地图,从中获得线条(实际上是点)的坐标,然后再用坐标结合plot()把图形还原出来,后来发现这种方法做出来的地图太粗糙,而且面临最大的困难是很不容易把各省的坐标数据分开,这样对于地理信息展示是没有意义的。

今天再次找数据的时候,却鬼使神差地发现了国家基础地理信息中心的网站:http://nfgis.nsdi.gov.cn/,里面可以免费下载GIS数据,我今天一眼就看见了国界与省界数据,各种数据都是一个zip压缩包,里面是*.dbf*.shp*.shx文件,这是shapefile的通用格式,R里面有maptools包可以读取(read.shape()函数),事实上作图的时候作出来是925个多边形(polygon),我到现在也没明白为什么会有那么多,不过顺利的是我已经知道哪34个多边形是我想要的了。下面这个PDF文件是我的一个示例:

文件下载链接

下面的PNG文件当然就不如PDF清晰了:

中国分省市地图(借助R的maptools包实现)

爷还想看:

40 Responses to “终于搞定了中国分省市地图”

Comments (39) Pingbacks (1)
  1. 五脚星 说:

    每个省中间的圆圈是什么东西?肯定不是省会…

  2. forcode 说:

    多谢你的线索,最近想要在报告中加入一些结合统计数据的地理图片,弄了个arcgis,结果会了一点基本操作,发现却没有想要的数据,朋友介绍到了你这里,多谢了。

  3. huaru 说:

    这样的图使用GIS应该可以做啊

  4. zhang 说:

    没必要吧,现在GIS的开源软件那么多。
    一物有一物的用处,干嘛搞得那么复杂。

    • 谢益辉 说:

      主要是地理数据的问题,不是软件问题,并不复杂,我用R做的,刚才搜"Open Source GIS"的时候发现R也被列在其中了。

  5. Bo 说:

    你好,请问你能不能分享数据和程序?国家基础地理信息中心的数据好像不能下载了。我正在写博士论文,需要用R做一张中国分省地图。 期待你的回复。 我的邮箱是 fin_zhang2000@yahoo.com.

    非常感谢!

  6. Bo 说:

    我是英文系统,但把language for non-unicode program改成中文了,系统可以显示中文菜单。下面R的sessionInfo. 谢谢。

    sessionInfo()
    
    R version 2.9.0 (2009-04-17)
    i386-pc-mingw32 
    
    locale:
    LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;
    LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     
    
    other attached packages:
    [1] maptools_0.7-25 sp_0.9-43       mapproj_1.1-7.2 mapdata_2.1-0
    [5] maps_2.1-0      Hmisc_3.6-0     foreign_0.8-35 
    
    loaded via a namespace (and not attached):
    [1] cluster_1.12.0  grid_2.9.0      lattice_0.17-25 tools_2.9.0
    • 谢益辉 说:

      编码问题我不太熟悉,我的系统是:
      > Sys.getlocale()
      [1] "LC_COLLATE=Chinese_People's Republic of China.936;LC_CTYPE=Chinese_People's Republic of China.936;LC_MONETARY=Chinese_People's Republic of China.936;LC_NUMERIC=C;LC_TIME=Chinese_People's Republic of China.936"

      你可以用Sys.setlocale()试试看。

  7. Bo 说:

    再请教一个问题,请问怎么把GIS数据里的省名改成拼音?谢谢了!

    • 谢益辉 说:

      仍然参照我前面提到的那篇文章,对x$att.data$NAME重新赋值即可,但在乱码的情况下,你可能不知道每一行分别是哪个省份,所以最好还是先把编码问题解决了再说,或者找一台中文的计算机试试。

  8. Bo 说:

    编码问题已经解决,用你提示的Sys.setlocale()。 非常感谢!

    再问一个问题,请问如何在地图下加legend,象你的例子中展示的那样?

  9. greatzxq 说:

    您好,大师!请问如何输出贵州省某地区的地图,并在这个地区的各县境上标出某种现象出现的位置?
    还有另外一个问题:当我在输入如下命令时:

    library(maptools);x=read.shape(’bou2_4p.shp’);#
    为什么会出现如下问题:

    错误于install.packages(NULL, .libPaths()[1L], dependencies = NA, type = type) :
    没有设定程序包
    > library(maptools);x=read.shape(’bou2_4p.DBF’);#
    错误于getinfo.shape(filen) : Error opening SHP file
    此外: 警告信息:
    很高兴搜索到您的文章,但我是新人,请帮我分析与解决,谢谢了!

    • 谢益辉 说:

      第一个问题是你没有安装包:install.packages('maptools'),后面你装了包似乎又没有给对文件的位置。自己看getwd()底下有没有bou2_4p.DBF这个文件,如果没有你要把完整的路径写上。

  10. greatzxq 说:

    请问:我怎么安装包:install.packages(‘maptools’),是不是通过工具栏里的程序包的安装程序包,来安装mapstools呢?

  11. greatzxq 说:

    大师,对不起!我是新人,以前没学过这软件,现在做论文,需要用此软件标明一现象在某地域上的分布图。请您详细为我写出安装install.packages(‘maptools’)的步骤?还有,如何把完整的路径写上??麻烦您了,谢谢!

    • 谢益辉 说:

      install.packages('maptools')就是把这句话贴到R里面打回车。为了避免下一个问题,你还是贴install.packages('maptools', repos="http://cran.r-project.org")吧。

      完整路径就是完整的磁盘路径"C:/abc/def/xxx.yyy"。这样我说清楚了么?

      • greatzxq 说:

        谢谢您的真诚回复。
        我已按您给的操作方式,已把maptools程序包装好了(因为电脑显示如下:
        程序包’maptools’打开成功,MD5和检查也通过

        下载的程序包在
        C:\Documents and Settings\Administrator\Local Settings\Temp\RtmpDLAkh5\downloaded_packages里)
        同时我也按我理解的bou2_4p.shp的完整路径,进行输入操作,结果还是不行。电脑显示如下:
        > library(maptools);x=read.shape(“E:/中国地理/bou2_4p.shp”)
        Shapefile type: Polygon, (5), # of Shapes: 925
        警告信息:
        use readShapeSpatial:
        objects other than Spatial objects defined in the sp package are deprecated
        请问:如何解决?

  12. greatzxq 说:

    另外,用spss来画统计地图,我想是不是比用R更简单些??
    但是如果spss画 的话,spss有没自带中国地理信息集。并且spss里面都是用.tab的格式,而到国家基础地理信息中心下载的都是dbf或shp或shx文件格式。我在网上找了,但貌似又不能转换?

    另外,我从国家基础地理信息中心下载的文件解压后,貌似都不能打开。是不是要另外下载阅读浏览dbf,shp.shx等文件格式的软件??

    • 谢益辉 说:

      软件问题参见留言页面FAQ2。

      dbf, shp, shx都是地理信息专用文件,如果你愿意找,可以去试试GIS相关软件。

      关于R画地图问题,这篇文章比我介绍得更详细:http://cos.name/2009/07/drawing-china-map-using-r/

  13. greatzxq 说:

    为什么我操作时,总会出现问题?有没有专门介绍用r画统计地图的书籍?如果没有,建议您可以开拓这片荒漠。
    再问一个问题哦:我操作如下,有出现问题了,呵呵,请看:

    > library(maptools);x=readshapespatial(E:/中国地理/bou2_4p.shp)
    载入需要的程辑包:foreign
    载入需要的程辑包:sp
    错误: 意外的’/'在”x=readshapespatial(E:/”里

    请问:如何载入需要的这连个程序包?

  14. ming_uld 说:

    溢辉大哥,我去了国家基础地理信息中心的网站,想找边界数据,可是没有找到您在文中所提到的包含三种格式的文件包,只找到了后缀名为 .e00的文件。莫非我没找对地方?还是网站修改了内容?对于寻找地级地界数据,您还有没有什么好的办法?谢谢!

  15. 江户川柯南 说:

    刚下了ArcGIS软件,正在一点一点学~杯具啊~这个软件我一点都不清楚,要学到猴年马月了~我的paper啊~

Leave a Reply

(required)

(required)

WWW.YIHUI.NAME XIE@YIHUI.NAME © 2007 - 2010 by Yihui Xie