sfでShapefileの読み書きをするときの文字コードの指定方法

背景については前回をご参照ください。

まとめ

結論としては、

  • デフォルトだと変な変換が起こるので、文字コードは必ず指定する
  • 読み込むときは読み込むデータの文字コードに合わせて
  • 書き出すときは常にUTF-8

という方針でよさそうです。

読み込み

Shapefileを読み込む際の文字コードは、options引数にENCODING=<文字コード>という形式で指定します。<文字コード>には、読み込むデータがUTF-8ならUTF-8Shift_JISならCP932を指定します。

具体的には以下のようになります。

st_read("path/to/dsn.shp", options = "ENCODING=CP932", stringsAsFactors=FALSE)

read_sf()

余談ですが、stringsAsFactors=FALSEを付けないと文字列がfactorになってしまいます。sfパッケージはこのあたり古き良き(?)Rの慣行に従っているようで、st_as_sf()とかも同じ挙動です。

read_sf()を使えば、デフォルトでstringsAsFactors=FALSEになっているのでタイプする量が減ります。

st_read("path/to/dsn.shp", options = "ENCODING=CP932")

read_sf()は、もっとナウい感じにしようぜ、という提案がHadleyからあってできたst_read()のラッパー関数です。

書き込み

Shapefileを書き込む際の文字コードは、layer_options引数に、同じくENCODING=<文字コード>という形式で指定します。<文字コード>は好きなものを選べますが、GDAL内部ではUTF-8が前提になっているのでUTF-8を指定しておくのがいいでしょう。

具体的には以下のようになります。

st_write("path/to/dsn.shp", layer_options = "ENCODING=UTF-8")

st_write()にも同様にwrite_sf()というラッパー関数があります。これは今のところ*1そんなに違いはないのでどちらでもよさそうです。

Windowsを使ってる人への注意

ちなみに、今のCRAN版(バージョン 0.5-4)では、Windows上での書き出しにバグがあります。どうやら以下のissueに関連して挙動が修正されているようなので、リリースを待ちましょう。

リリースを待てない!、という人は、書き出し前にいちどすべての文字列カラムをUTF-8に変換しましょう。詳しい説明は省略しますが、これで大丈夫なはずです。

sf_obj_utf8 <- dplyr::mutate_if(sf_obj, is.character, enc2utf8)

*1:delete_layerというレイヤーを上書きするとき用?のオプションが違うんですが、「not yet implemented」となっています。