世界の測量

Sibling of "Relevant, Timely, and Accurate, " but much lighter and shorter ※自らの所属する組織の見解を示すものでない

GeoRubyによるShapefileの文字コードのShapefileからUTF-8への変換(Late 2013)

GeoRuby(Late 2013)によるShapefile文字コード変換方法は、基盤地図情報Shapefileの文字コードをShift_JISからUTF-8に変換するコード - 世界の測量 で示した方法とは変わっていたので記録しておく。

最近のGeoRuby

GeoRuby は nofxx/georuby · GitHub でホストされている。require するファイルのパスなども含めて、デザインが変わっている。また、ShapefileDBFデータの扱いを dbf.rb に移譲しているようである。本エントリの記述は、GeoRuby 2.2.1 ベースである。

2.0.0-p353 :004 > require 'geo_ruby/version'
 => true 
2.0.0-p353 :005 > GeoRuby::VERSION
 => "2.2.1" 

dbf.rb 内部で文字コードをシステムエンコーディングに変換するらしい

dbf.rb の設計に従ってAPIなども変わっている。スクリプトを作って試行錯誤してみたところ、DBFデータの文字コード記述を意識するのか、Ruby上ではシステムエンコーディング(MacではUTF-8)に変換されたあとのデータが出てくるようである。
よって、MacでGeoRubyによってShapefile文字コードShapefileからUTF-8へ変換するコードは、次のようになる。

require 'rubygems'
require 'geo_ruby'
require 'geo_ruby/shp'

include GeoRuby::Shp4r
path = "P11-10_26-jgd-g_BusStop.shp"
ShpFile.open(path) do |src|
  ShpFile.create(path.sub('.shp', '_utf8.shp'), 
    src.shp_type, src.fields) do |dst|
    dst.transaction do |tr|
      src.each do |r|
        tr.add(ShpRecord.new(r.geometry, r.data))
      end
    end
  end
end