はじめに
Rで空間解析に挑戦中の羊です。
shapefileの読み込みという初歩の初歩でつまづいたので忘備録も兼ねて回避方法に関する考察をば。
ソフトとか
- R (ver. 3.3.3)
- sfパッケージ
- QGIS (ver. 2.18.9)
- OpenLayersPlugin
サンプルの準備【QGIS】
大阪駅(135.495951E, 34.70249N)にしました。このポイントを"samplePoint.shp"として保存しておきます。
なお背景地図はOpenStreetMapです。
前準備【R】
今回shapefileの読み込みに用いるパッケージはsfパッケージです。これまで使ってきたのはspパッケージなのですが、今後は「RでGISをやるときにはsfパッケージ、という世の中になるらしい。」です。
他に参考にしたのは以下の公式ドキュメント及び記事です。
shapefileの読み込みからプロットまで【R】
sfパッケージを読み込み、サンプルデータの存在するフォルダを指定してshapefileを読み込みます。
library(sf)
samplePoint = sf::st_read(dsn = "input/data/")
ここまではうまくいきました、そう__ここまでは__
次にサンプルポイントをプロットします。sfパッケージでは特別な指定なしにプロットできて便利らしいです。
> plot(samplePoint)
if (xsize * ysize * n > prod(total_size)) { でエラー:
TRUE/FALSE が必要なところが欠損値です
はい、エラーですね。
(何でや… plot()で簡単にプロットできるんじゃなかったんですか…!)
エラーの原因を考察する
はじめは妖怪全角の仕業かと思いデータを洗い直しましたが、見つからず。
うまくプロットすることを優先して簡単なポイントを生成してプロットを試してみるテスト
x <- c(135.495951, 34.702485)
testPoint <- st_point(x)
plot(testPoint)
あれ?できますやん(色気のないプロット結果で申し訳ないです)
ここでようやくデータのクラスに注目する発想にいたり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)
> 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で分析してみたいと思います。