1. 程式人生 > >R語言 地圖漫談

R語言 地圖漫談

   由於R語言所帶的中國地圖過於老舊,因此我們通過尋找外部地圖資料檔案,並在R中載入並展示地圖。

    我們所用的地圖資料檔案是Shapefile格式的檔案,它可以儲存地理要素的幾何位置和屬性資訊,Shapefile中的地理要素可通過點、線、面來表示。一個完整的shape檔案由一組檔案組成,其中必要的基本檔案包括座標檔案(.shp),索引檔案(.shx),屬性檔案(.dbf)三個檔案,有時候還會出現特徵空間索引檔案(.sbn和.sbx)。地圖資料檔案下載地址)(http://cos.name/wpcontent/uploads/2009/07/chinaprovinceborderdata_tar_gz.zip),下載解壓縮後,可以看到有三個檔案,分別是bou2_4p.dbf,dou2_4p.shp,bou2_4p.shx,數字1~4分別代表國家、省、市、縣的4級行政劃分,字母p結尾的表示多邊形資料,用來繪製區域,bou2表示是省級行政劃分的邊界。這份資料並不是最新的資料,最新的資料在國家基礎地理資訊中心找不到,大概要購買才能得到,不過對於一般的繪圖而言,這份資料已經可以滿足要求。

   這篇文章繪製地圖用到了3個包:sp,maptools,ggplot2。Sp包主要提供了操作地理資訊資料的一些方。Maptools包提供了讀入和操作地理資訊資料的一些工具。ggplot2提供了資料視覺化的功能。具體功能請檢視各包附帶文件。

> library(sp)

>library(maptools)#windows系統載入時都會提示以下資訊,對繪製影響不大。

Checking rgeos availability:FALSE

Note: when rgeos is not available,polygon geometry     computationsin maptools depend on gpclib,

which has a restricted licence. It isdisabled by default;

to enable gpclib, typegpclibPermit()

> library(ggplot2)

地圖資料基本可以分為點、線、面三種資料,在maptools包內分別有對應的函式來讀取(readShapePoints、readShapeLines和readShapePoly),這裡我們採用readShapePoly函式。

> x <-readShapePoly(file.choose()) #讀入bou2_4p.shp檔案

> class(x) #x是sp包的資料框

[1] "SpatialPolygonsDataFrame"

attr(,"package")

[1] "sp"

> names(x)

[1] "AREA"      "PERIMETER" "BOU2_4M_"   "BOU2_4M_ID""ADCODE93"

[6] "ADCODE99"  "NAME"

   我們發現x包含了7類資訊,其中AREA是地區,PERIMEIER是周長,NAME是中文名稱。其他的是一些編碼。我們採用ggplot2進行地圖繪製,ggplot2繪製的物件格式為資料框,而x的格式為地理資訊類資料框(class(x)),我們對其格式進行轉換以滿足ggplot2的繪製要求。

> china <-fortify(x)#將地理資訊檔案轉換為data.frame格式資料

Regions defined for each Polygons

> head(china)

long     lat order hole piece group id

1 121.4884 53.33265    1 FALSE    1   0.1  0

2 121.4995 53.33601    2 FALSE    1   0.1  0

3 121.5184 53.33919    3 FALSE    1   0.1  0

4 121.5391 53.34172    4 FALSE    1   0.1  0

5 121.5738 53.34818    5 FALSE    1   0.1  0

6 121.5840 53.34964    6 FALSE    1   0.1  0

轉換後china資料包含7列資料,long表示精度,lat表示緯度。

現在我們就可以繪製原始的地圖了。

> p <-ggplot(china,aes(x=long,y=lat))+geom_polygon(aes(group=id),fill=I("red"))

R語言 <wbr> <wbr>地圖漫談(一)

> p1 <-p+theme(panel.background=element_rect(fill="lightblue"))+coord_map()

> p2 <-p1+theme(panel.grid=element_blank())

> p3 <-p2+theme(axis.title=element_blank())

> p4 <-p3+theme(axis.ticks=element_blank())

> p5 <-p4+theme(axis.text=element_blank())

> p6 <- p5 +theme(plot.background=element_rect(fill="lightblue"))+theme(legend.background=element_rect(fill="lightblue"))

> p6

   最後,加個標題吧!

   >p6+ggtitle(" 中國地圖 ")

R語言 <wbr> <wbr>地圖漫談(一)

參考資料