Edited at

sfパッケージを用いてRでshapefileを読み込む時につまづいたところ

More than 1 year has passed since last update.


はじめに

Rで空間解析に挑戦中の羊です。

shapefileの読み込みという初歩の初歩でつまづいたので忘備録も兼ねて回避方法に関する考察をば。


ソフトとか


  • R (ver. 3.3.3)


    • sfパッケージ




  • QGIS (ver. 2.18.9)


    • OpenLayersPlugin




サンプルの準備【QGIS】

大阪駅(135.495951E, 34.70249N)にしました。このポイントを"samplePoint.shp"として保存しておきます。

なお背景地図はOpenStreetMapです。

スクリーンショット 2017-11-20 22.57.26.png


前準備【R】

今回shapefileの読み込みに用いるパッケージはsfパッケージです。これまで使ってきたのはspパッケージなのですが、今後は「RでGISをやるときにはsfパッケージ、という世の中になるらしい。」です。

他に参考にしたのは以下の公式ドキュメント及び記事です。


sf.pdf

Rでシェープファイルを読み込む



shapefileの読み込みからプロットまで【R】

sfパッケージを読み込み、サンプルデータの存在するフォルダを指定してshapefileを読み込みます。


sample.R

library(sf)

samplePoint = sf::st_read(dsn = "input/data/")

ここまではうまくいきました、そうここまでは

次にサンプルポイントをプロットします。sfパッケージでは特別な指定なしにプロットできて便利らしいです。

> plot(samplePoint)

if (xsize * ysize * n > prod(total_size)) { でエラー:
TRUE/FALSE が必要なところが欠損値です

はい、エラーですね。

(何でや… plot()で簡単にプロットできるんじゃなかったんですか…!)


エラーの原因を考察する

はじめは妖怪全角の仕業かと思いデータを洗い直しましたが、見つからず。

うまくプロットすることを優先して簡単なポイントを生成してプロットを試してみるテスト


checkTest.R

x <- c(135.495951, 34.702485)

testPoint <- st_point(x)
plot(testPoint)

Rplot.png

あれ?できますやん(色気のないプロット結果で申し訳ないです)

ここでようやくデータのクラスに注目する発想にいたりclass関数によるチェック

> class(testPoint)

[1] "XY" "POINT" "sfg"

> class(samplePoint)
[1] "sf" "data.frame"

両者を比較するにどちらもうまくプロットしそうな印象。

しかし"samplePoint"がプロットできない。"sf"は明らかにsfパッケージに関するものなので"data.frame"の部分がエラーの原因かと考えられます。

"samplePoint"のデータの構造をのぞいてみると

id
X
Y
geometry

1
135.495951
34.702485
c(135.495951, 34.702485)

"id"及び"X","Y"は'samplePoint.shp'の属性テーブルに記載されていたもので、"geometry"に関しては新たに追加されたものでした。

つまりこのgeometryをプロットすれば…!

> plot(samplePoint$geometry)

Rplot.png

できました!


checkTest.R

> class(samplePoint)

[1] "sf" "data.frame"
> class(samplePoint$id)
[1] "numeric"
> class(samplePoint$X)
[1] "numeric"
> class(samplePoint$Y)
[1] "numeric"
> class(samplePoint$geometry)
[1] "sfc_POINT" "sfc"

やはり"samplePoint$geometry"がsfパッケージに関するもののようです。


終わりに

今後属性テーブルに値が入ったshapefileを用いて空間解析やってみたいと思ってるので今回のエラーはいつかぶつかりそうなので今でよかったです(前向き)

これからは脱ArcGISを目標に色々とRで分析してみたいと思います。