緯度・経度などの位置情報を利用したサービスを個人的に作ろうかと思いまして。
どうやってデータを集めようかと考えていると、いいサイトが見つかりました。
街区レベル位置参照情報ダウンロードサービス
http://nlftp.mlit.go.jp/isj/index.html
とりあえず全てのcsvファイルはダウンロードしたものの、データが膨大すぎてちょっと大変。
というわけで、簡単なスクリプト書いてみました。
ダウンロードしたcsvファイルまでスクリプトでutf8にエンコードすると面倒なので、
$ find ~/areas/csv/ -name '*.csv' | xargs nkf --overwrite -w
って感じで事前にエンコードしておきます。
create_areas.rb
class CreateAreas < ActiveRecord::Migration
def self.up
create_table :areas do |t|
t.integer :prefecture_id
t.string :area
t.string :town
t.string :county
t.string :number
t.string :coordinate_num
t.string :x
t.string :y
t.string :lat
t.string :lon
t.string :dwelling_flg
t.string :represent_flg
t.integer :h18_flg
t.integer :h19_code
t.datetime :created_at
t.datetime :updated_at
end
add_index :areas, :prefecture_id
end
def self.down
drop_table :areas
end
end
area.rb
require 'rubygems'
require 'active_record'
require 'fastercsv'
@db_file = '/home/rails_app/db/development.sqlite3'
@csv_path = '/home/areas/csv/'
@year = '2007'
# Model
class Area < ActiveRecord::Base
end
ActiveRecord::Base.establish_connection(
:adapter => 'sqlite3',
:database => @db_file
)
def get_csv
datas = FasterCSV.read( @csv_path + @file_name )
datas.delete_at(0)
return datas
end
i = 1
while 48 > i
if 10 > i
j = "0#{i}"
else
j = i
end
@file_name = "#{j}_#{@year}.csv"
datas = get_csv
p "#{@file_name}: #{datas.size}"
k = 0
begin
datas.each do |row|
area = Area.new(
:prefecture_id => i,
:area => row[0],
:town => row[1],
:county => row[2],
:number => row[3],
:coordinate_num => row[4],
:x => row[5],
:y => row[6],
:lat => row[7],
:lon => row[8],
:dwelling_flg => row[9],
:represent_flg => row[10],
:h18_flg => row[11],
:h19_code => row[12]
)
area.save!
k = k + 1
p "#{@file_name}: #{k}/#{datas.size}"
end
i = i + 1
p "Insert:#{k}"
rescue Exception => e
p "Error Message: #{e} << #{i}"
end
end
これを実行すると以下のように出力されます。
$ ruby area.rb
$ 01_2007.csv: 367128
$ 01_2007.csv: 1/367128
$ 01_2007.csv: 2/367128
・
・
・
と進捗がわかるようにしたのですが、北海道が全て入るのに半日かかりました。。。
ものすごいレコード数なので、個人で利用するのは断念。
別な手を考えねば。。。
高橋 征義 後藤 裕蔵
ソフトバンククリエイティブ
売り上げランキング: 2101
おすすめ度の平均:


Ruby入門書としてはこれが一番お薦め。

プログラミング初心者にとっては少し難易度が高いかも

変数のスコープと寿命について詳しく書いて欲しかった

練習問題の内容にやや難あり

Rubyをこれから覚える方は必読かも