2014年7月23日水曜日

Rでshapeを出力するときはPDFファイルにすると便利

表題は正確に言うと、shapeファイルを読み込んで、加工やいろいろな可視化を施した後、画像(的なもの)として出力するときは、PDFにすると便利ですよ、という感じの趣旨です。

shapeファイルを読み込んで、plotする方法は↓以前に書きました。

e-Stat(統計局)で公開されているShapeファイルを、Rで表示する - Rプログラミングの小ネタ

ただ、shapeファイルってものによっては、ものすごく大量のポリゴンを含んでいますよね。地名などを重畳した場合、文字サイズが大きいと互いに重なってしまう、文字サイズが小さいと読めなくなってしまう、なんて問題が起こります。

前述のエントリでは、高解像度のpngに出力するという対処法を書いたんですけど、高解像度とはいえラスタである以上、拡大すれば文字はギザギザになるし、解像度を大きくするのにも限度がある。

使っている環境(メモリとか? CPUのビット数とか?)によるんでしょうけど、あまり大きくすると、

> png("output.png", width=10000, height=10000)
 以下にエラー png("output.png", width = 10000, height = 10000) :
   デバイス png() を開始できませんでした
 追加情報:  警告メッセージ:
1: In png("output.png", width = 10000, height = 10000) :
   ビットマップを割り当てられません
2: In png("output.png", width = 10000, height = 10000) :
  opening device failed


みたいな感じにエラーになってしまいます。

で、結論としてはPDFに出力するといい感じじゃん、ってことになりました。

コードは↓こんな感じ。

# GIS関係のパッケージ
library(maptools)

# 座標系の情報を持つオブジェクトを作る
# longlatは緯度経度指定、WGS84は世界測地系であることを表す

pj <- CRS("+proj=longlat +datum=WGS84")

# シェープファイルの読み込み
x  <- readShapePoly("h22ka14137.shp", proj4string=pj)

# PDFファイルをオープン
pdf("output.pdf", family="Japan1GothicBBB")

# プロット(出力先はPDFファイルとなる)
plot(x, lwd=0.1)
text(coordinates(x), as.character(x@data$MOJI), cex=0.1)

# ファイルを閉じる
dev.off()


ちなみにPDFファイルに出力するときは、フォントを指定(family="Japan1GothicBBB"の箇所)しないと、文字化けが起きるというワナがあります。

出力されたPDFファイルは↓こんな感じ。

川崎市麻生区の町丁目境界と町丁目名称(PDFファイル)

↓全体として見ると、「字ちっちゃっ!」って感じですが。

麻生区全体のPDFファイル


こまごまとしたところでも文字が重ならないようにするにはこれくらいのサイズにする必要がありました。text関数のcexオプションで調整できます。

線もデフォルトだと拡大したときに太く感じられたので、細めにしました。plot関数のlwdオプションで調整できます。

境界も地名も画像ではなく、ベクタの情報として埋め込まれているので、拡大しても粗くなりません↓

PDFファイルなので、拡大しても線や文字は滑らかなまま


「上麻生〇丁目」に混ざって、「上麻生」というのが点在するのは、たぶんこれらの地域に対して住居表示が実施されていないからですね。こんなにちっちゃく残すくらいなら、全部住居表示にしちゃえばよかったのに、って気もします。何か事情があったのかもしれませんが。■

[2014年9月10日追記] 
PDFファイルのサイズが大きくなりすぎた場合は、↓こんな方法もお試しください。
 SkyPDFを使ってPDFファイルのサイズを圧縮する: 主張




0 件のコメント:

コメントを投稿