でたぁっ 感動と失敗の備忘録

データ解析を担当することになったサラリーマンの備忘録

Ruby Geocoderを使う

 Tableauをちょいちょい使うことがあり地図表示用に緯度経度データを準備することにした。(Tableauは県名などから緯度経度情報に変換してくれる機能があるが、保有しているデータの市町村名だと結構厳しい場合がある ○船橋 ×船橋市RubyでGeocoderってのが便利そうなので早速使ってみた。※数年前は東大CSVアドレスマッチングサービスを使用していた。

準備したRubyコード(郵便番号から住所と緯度経度を取得する)

 開発した環境はWin7Rubyは1.9.3p448

# -*- encoding: Shift_JIS -*-
require 'geocoder'
Geocoder.configure(:language  => :ja,  :units => :km, :lookup => :google) # 設定
open("./zip.txt" ) {|fin|
  fin.each {|zip|
    res_ad = Geocoder.search(zip.chomp.encode('utf-8')) # 一応utf8にしとく
    res = [zip.chomp]
    res << res_ad[0].address_components.map{|ad| ad['long_name']}[1..-1].reverse.join(' ').encode('Shift_JIS')
    res << res_ad[0].geometry['location'].values.join("\t").encode('Shift_JIS')
    puts res.join("\t")
  }
}

 geocoderは地名やIPアドレス、緯度経度などを与えて検索することも出来る。また様々なAPIに対応している。デフォルトはGoogle Geocoding APIでGeocoder.configureで変更することができる。Google Geocoding APIの場合は1日あたりの位置情報リクエストが 2,500回に制限されているらしいので、その場合は他API用にコードを書き換える。

proxy環境の場合は、設定にproxyサーバー情報を追加する。こんな感じ。

Geocoder.configure(:language  => :ja,  :units => :km, :lookup => :google, :http_proxy => 'ユーザーID:パスワード@xxx.yyy.zzz:8080', :timeout => 10 )

取得する郵便番号のリスト(zip.txt)

103-0001
103-0002
103-0003
103-0004
103-0005

結果

103-0001	日本 東京都 中央区 日本橋小伝馬町	35.691126,139.7788326
103-0002	日本 東京都 中央区 日本橋馬喰町	35.6936397,139.7819296
103-0003	日本 東京都 中央区 日本橋横山町	35.6931621,139.7835989
103-0004	日本 東京都 中央区 東日本橋	35.6918428,139.7854238
103-0005	日本 東京都 中央区 日本橋久松町	35.6897153,139.7841379


参考