2014年7月1日火曜日

e-Stat(統計局)で公開されているShapeファイルを、Rで表示する

まずはShapeファイルを入手するところから。

総務省統計局がe-Statというサイトを運営していて、そこに全国各地域のShapeファイルが公開されています。

地図で見る統計(統計GIS)


(1) 「平成22年国勢調査(小地域) 2010/10/01」を選択
(2) 「男女別人口総数及び世帯総数」にチェック
(3) 「統計表各種データダウンロードへ」ボタンをクリック



(1) 「都道府県」を選択
(2) 「市区町村」を選択
(3) 「検索」ボタンをクリック
(4) 境界データの欄に表示されている
    「世界測地系緯度経度・Shape形式」のデータをクリック

ダウンロードしたzipファイルを展開すると、

 xxx.shp
 xxx.dbf
 xxx.shx
 xxx.prj

という、拡張子だけが違うファイルが4つできるんですが、これがshapeデータの1セットになります。

それぞれのファイルの中身は、シェープファイルとは? | 用語集とGISの使い方 | 株式会社パスコによると、


 shp:    図形の座標が保存
 dbf:    属性の情報が保存
 shx:    shpの図形とdbfの属性の対応関係が保存

だそうです。あと、「.prj」は測地系の情報が入っています。(テキストとして開くとそれっぽい文言が入っている)

では単純にshapeファイルをRで表示させてみましょう。

境界情報だけをプロット
# GIS関係のパッケージ
library(maptools)
 
# 座標系の情報を持つオブジェクトを作る
# longlatは緯度経度指定、WGS84は世界測地系であることを表す
pj <- CRS("+proj=longlat +datum=WGS84")
 
# シェープファイルの読み込み
x  <- readShapePoly("h22ka14137.shp", proj4string=pj)
 
# 表示
plot(x)


あら簡単。実質4行で表示できました。

じゃあ、いろいろやってみましょう。

coordinates()という関数は、ポリゴンの重心の位置を返してくれます。

> coordinates(x)
        [,1]     [,2]
0   139.4639 35.62169
1   139.5178 35.62177
2   139.5138 35.62332
3   139.5057 35.62163
4   139.4617 35.61308
         ...      ...

そのままプロットすると↓こんな感じですね。

重心の位置をプロット
plot(x)
points(coordinates(x))

このshapeを読み込んだオブジェクト(SpatialPolygonsDataFrame)には、境界のポリゴンだけでなく、属性情報も入っています。

> head(x@data)
        AREA PERIMETER ... KEN_NAME ... MOJI           ...
0  206286.40  2421.068 ... 神奈川県 ... はるひ野5丁目 ...
1   67760.92  1765.906 ... 神奈川県 ... 細山6丁目     ...
2  119563.80  1457.849 ... 神奈川県 ... 細山7丁目     ...
3  225729.80  2633.794 ... 神奈川県 ... 細山           ...
4 2017504.00 11135.110 ... 神奈川県 ... 黒川           ...
5   95170.74  1569.407 ... 神奈川県 ... 細山8丁目     ...
         ...       ... ... ...      ... ...            ...


どうやら、この「MOJI」というカラムにそのポリゴンに対応する地名が入っているようです。これを地図上にプロットしてみましょう。プロット位置はさっきのやり方で求めた重心の位置にしてみます。あと、MOJIは因子型で入っているので、as.character()で文字列に変換してやる必要がありました。

地名を表示させたが、文字サイズが大きすぎた
plot(x)
text(coordinates(x), as.character(x@data$MOJI))

うわ、ぐちゃぐちゃ。

字を小さくしてみよう↓

文字サイズが小さいと見にくい・・・
plot(x)
text(coordinates(x), as.character(x@data$MOJI), cex=0.5)

今度は、字が小さくて見づらいですね。

画面に出すだけのときは、描画用のウィンドウをググッと広げると、ポリゴンは大きく、文字はそのままで表示される、見やすくなります。

直接、画像ファイルとして出力し、その際に解像度を高めに指定するというやり方もあります。


高解像度のpngに出力(拡大してみればいい感じです)
library(png) # png出力のためのパッケージ
 
# 今から出力先はpngファイルだぞ、という指示
png("output.png", width=2000, height=2000)
 
plot(x)
text(coordinates(x), as.character(x@data$MOJI))
 
# pngファイルを忘れずに閉じる
dev.off()


解像度やら文字の大きさやらは、お好みで調整してみてください。

他にもいろいろと遊べるのですが、長くなったので、今回はここまで。■

[2016年3月30日追記]
広いエリアの行政界シェープファイルのようなものを画像ファイルに出力するのは、けっこう無理があります。そのようなときはPDFファイルに出力すると、いい感じになります↓
Rでshapeを出力するときはPDFファイルにすると便利 - Rプログラミングの小ネタ




0 件のコメント:

コメントを投稿