Windowsで日本語名のshpファイルを読み込む

↓これをWindowsでやってみると、unzipは問題ないんですが、そのあと日本語名のレイヤーを読み込むところでつまづきました。

notchained.hatenablog.com

いろいろ試してたらなんかできたのでメモ。

ファイルをダウンロード

tmp_dir <- tempdir()
zip_file <- file.path(tmp_dir, "24kuikishape.zip")
zip_dir  <- file.path(tmp_dir, "24kuikishape")

download.file("http://www.city.osaka.lg.jp/contents/wdu090/opendata/mapinfo/24kuikishape.zip",
              destfile = zip_file)
#> trying URL 'http://www.city.osaka.lg.jp/contents/wdu090/opendata/mapinfo/24kuikishape.zip'
#> Content type 'application/zip' length 166803 bytes (162 KB)
#> downloaded 162 KB

unzip(zip_file, exdir = zip_dir)
list.files(zip_dir)
#> [1] "24区画像.dbf"     "24区画像.prj"     "24区画像.sbn"     "24区画像.sbx"     "24区画像.shp"     "24区画像.shp.xml" "24区画像.shx"

普通に読み込んでみる

library(rgdal)

layers <- ogrListLayers(zip_dir)
layers
#> [1] "24蛹コ逕サ蜒\x8f"
#> attr(,"driver")
#> [1] "ESRI Shapefile"
#> attr(,"nlayers")
#> [1] 1

文字化け。なんかあやしげな雰囲気。

o <- readOGR(zip_dir, layer = layers[1])
#> Error in nchar(layer) : invalid multibyte string 1

やっぱだめでした。ですよねー。。

エンコーディングを変えてみる

これを読んで、characterにはEncodingというのがあるのを知りました。やってみます。

stackoverflow.com

Encoding(layers[1])
#> [1] "unknown"

Encoding(layers[1]) <- "UTF-8"

layers
#> [1] "24区画像"
#> attr(,"driver")
#> [1] "ESRI Shapefile"
#> attr(,"nlayers")
#> [1] 1

おっ、文字化けしてない。これは期待できるかも...?

o <- readOGR(zip_dir, layer = layers[1])
#> OGR data source with driver: ESRI Shapefile 
#> Source: "C:\windows\TEMP\RtmpKeV3r1/24kuikishape", layer: "24区画像"
#> with 24 features
#> It has 5 fields
#> Error in make.names(fldnms, unique = TRUE) : invalid multibyte string 3

やっぱだめです。。

iconvしてみる

o <- readOGR(zip_dir, layer = iconv(layers[1], from = "UTF-8", to = "Shift_JIS"))
#> Error in ogrInfo(zip_dir, layer = iconv(layers[1], from = "UTF-8", to = "Shift_JIS")) : 
#> Cannot open layer

だめでした。

ロケールを変えてみる

ちょっと前にこんな記事がありました。やってみます。

id.fnshr.info

Sys.setlocale(locale="C")
layers <- ogrListLayers(zip_dir)
layers
#> [1] "24蛹コ逕サ蜒・
#> attr(,"driver")
#> [1] "ESRI Shapefile"
#> attr(,"nlayers")
#> [1] 1

さっきとは違う化け方。謎です。

Encoding(layers[1]) <- "UTF-8"

o <- readOGR(zip_dir, layer = layers[1])
#> OGR data source with driver: ESRI Shapefile 
#> Source: "C:\windows\TEMP\RtmpKeV3r1/24kuikishape", layer: "24区画像"
#> with 24 features
#> It has 5 fields

なんかよく分かりませんが読み込めました。。

ただし、これではまだ読み込めたものの文字化けしています。

head(o@data)
#>   ATTR1     ATTR2 X............... X................1 X............
#> 0 27104 豁、闃ア蛹コ                0               <NA>             0
#> 1 27118 蝓取擲蛹コ                0               <NA>             0
#> 2 27116 逕滄㍽蛹コ                0               <NA>             0
#> 3 27106    隘ソ蛹コ                0               <NA>             0
#> 4 27122 隘ソ謌仙玄                0               <NA>             0
#> 5 27124 鮓エ隕句玄                0               <NA>             0

さらにエンコーディングを指定しないといけないみたいです。

o <- readOGR(zip_dir, layer = layers[1], encoding = "Shift_JIS")

head(o@data)
#>   ATTR1  ATTR2 X.Z...R...h X.......... X...R...h
#> 0 27104 此花区           0        <NA>         0
#> 1 27118 城東区           0        <NA>         0
#> 2 27116 生野区           0        <NA>         0
#> 3 27106   西区           0        <NA>         0
#> 4 27122 西成区           0        <NA>         0
#> 5 27124 鶴見区           0        <NA>         0

うーん。いじれるポイントは分かってきた気もしますが、めんどくさすぎる。