sfでShapefileの読み書きをするときの文字コードの指定方法
背景については前回をご参照ください。
まとめ
結論としては、
という方針でよさそうです。
読み込み
Shapefileを読み込む際の文字コードは、options
引数にENCODING=<文字コード>
という形式で指定します。<文字コード>
には、読み込むデータがUTF-8ならUTF-8
、Shift_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)