image

  • フォト Amazonギフト券
    ※この時計の時刻は、閲覧しているパソコンのものであり、必ずしも正確な時間とは限りません

検索

最近のトラックバック

無料ブログはココログ

« 2009年1月2日 | トップページ | 2009年1月4日 »

2009年1月3日

2009-01-03

郵便番号と緯度経度情報

google や yahoo には 郵便番号/緯度経度情報/住所 の変換サービスがある。
でも 書籍 "ビジュアライジング・データ —Processingによる情報視覚化手法" 中にある例の
  郵便番号の分布を地図上に配置してみる
といった用途には、これらのサービスは使えない。
(何万という件数のデータ変換を web サービス経由で行うのは無理)

郵便番号データ、住所と緯度経度データは以下にある。

- http://www.post.japanpost.jp/zipcode/download.html
> 郵便番号データダウンロード - 日本郵便

- http://nlftp.mlit.go.jp/isj/
> 位置参照情報ダウンロードサービス

これらを合体させたデータをつくろうと思ったが、簡単にはできない。orz...
俺が半日かけて行ったことを示そう。
1.  郵便番号 (全国) を download し、UTF8 に変換 (zipcode.csv)
2. 位置参照情報 (47 都道府県全部) を download し、UTF8 に変換( *_2007.csv)

2 の作業では、download できるデータは zip である。download は手動でおこなったが、それを解凍、文字コード変換するのは次の shell script を使った。

# ! /bin/sh
rm -r ../*.csv
rm -f *.csv

for i in *.zip
do
  unzip -o $i
  for j in *.csv
  do
    nkf -w $j > 1.txt
    mv -f 1.txt ../$j
  done
  rm -f *.csv *.xml
done

さて、これらのデータに次の操作をしようとした。
3. zipcode.csv に 緯度経度情報を追加する。
4. *_2007.csv に 郵便番号情報を追加する。

3 を行うための実験として次の ruby スクリプトを作ってみた。
そして、わかったのは 単純な突き合わせでは、郵便番号 に 緯度経度を追加することができないと
いうこと。

実験 ruby script と その出力結果の一部を示す。

$ cat addgeo.rb
$KCODE = 'utf8'

require 'rubygems'
require 'fastercsv'
require 'pp'

KEN_TO_GEOCSV = {
  "北海道" => '01_2007.csv',
  "青森県" => '02_2007.csv',
  "岩手県" => '03_2007.csv',
  "宮城県" => '04_2007.csv',
  "秋田県" => '05_2007.csv',
  "山形県" => '06_2007.csv',
  "福島県" => '07_2007.csv',
  "茨城県" => '08_2007.csv',
  "栃木県" => '09_2007.csv',
  "群馬県" => '10_2007.csv',
  "埼玉県" => '11_2007.csv',
  "千葉県" => '12_2007.csv',
  "東京都" => '13_2007.csv',
  "神奈川県" => '14_2007.csv',
  "新潟県" => '15_2007.csv',
  "富山県" => '16_2007.csv',
  "石川県" => '17_2007.csv',
  "福井県" => '18_2007.csv',
  "山梨県" => '19_2007.csv',
  "長野県" => '20_2007.csv',
  "岐阜県" => '21_2007.csv',
  "静岡県" => '22_2007.csv',
  "愛知県" => '23_2007.csv',
  "三重県" => '24_2007.csv',
  "滋賀県" => '25_2007.csv',
  "京都府" => '26_2007.csv',
  "大阪府" => '27_2007.csv',
  "兵庫県" => '28_2007.csv',
  "奈良県" => '29_2007.csv',
  "和歌山県" => '30_2007.csv',
  "鳥取県" => '31_2007.csv',
  "島根県" => '32_2007.csv',
  "岡山県" => '33_2007.csv',
  "広島県" => '34_2007.csv',
  "山口県" => '35_2007.csv',
  "徳島県" => '36_2007.csv',
  "香川県" => '37_2007.csv',
  "愛媛県" => '38_2007.csv',
  "高知県" => '39_2007.csv',
  "福岡県" => '40_2007.csv',
  "佐賀県" => '41_2007.csv',
  "長崎県" => '42_2007.csv',
  "熊本県" => '43_2007.csv',
  "大分県" => '44_2007.csv',
  "宮崎県" => '45_2007.csv',
  "鹿児島県" => '46_2007.csv',
  "沖縄県" => '47_2007.csv',
}

def read_gio_csv(file)

  puts "read ... #{file}"

  gios = []
  open(file) { |f|
    while l = f.gets
      gios << l
    end
  }
  puts "end."

  gios
end

current_gio = ''
gios = []

FasterCSV.foreach("zipcode.csv") do |row|

  gio_file = KEN_TO_GEOCSV[row[6]]
  if current_gio != gio_file
    gios = read_gio_csv(gio_file)
    current_gio =gio_file
  end

  address = '"' + row[7] + '","' + row[8]
  pattern = Regexp.new(address)

  find = ''
  gios.each do |g|
    if pattern =~ g
      find = g
      break;
    end
  end

  if find == ''
    puts "--------------- not found " + ( row * ",")
  else
    # puts find
  end
#  puts row * ","
end

走らせてみる。
$ ruby addgeo.rb >1.txt

1 時間経過しても終わらないので、別端末で進み具合いなどをしらべてみる。
$ wc -l zipcode.cvs
  122535 zipcode.csv

$ head 1.txt
ntsitm157187:gio-data youichikato$ head 1.txt
read ... 01_2007.csv
end.
--------------- not found 01101,060  ,0600000,ホッカイドウ,サッポロシチュウオウク,イカニケイサイガナイバアイ,北海道,札幌市中央区,以下に掲載がない場合,0,0,0,0,0,0
--------------- not found 01101,060  ,0600042,ホッカイドウ,サッポロシチュウオウク,オオドオリニシ(1-19チョウメ),北海道,札幌市中央区,大通西(1〜19丁目),1,0,1,0,0,0
--------------- not found 01101,064  ,0640820,ホッカイドウ,サッポロシチュウオウク,オオドオリニシ(20-28チョウメ),北海道,札幌市中央区,大通西(20〜28丁目),1,0,1,0,0,0
--------------- not found 01101,060  ,0600001,ホッカイドウ,サッポロシチュウオウク,キタ1ジョウニシ(1-19チョウメ),北海道,札幌市中央区,北一条西(1〜19丁目),1,0,1,0,0,0
--------------- not found 01101,064  ,0640821,ホッカイドウ,サッポロシチュウオウク,キタ1ジョウニシ(20-28チョウメ),北海道,札幌市中央区,北一条西(20〜28丁目),1,0,1,0,0,0
--------------- not found 01101,060  ,0600002,ホッカイドウ,サッポロシチュウオウク,キタ2ジョウニシ(1-19チョウメ),北海道,札幌市中央区,北二条西(1〜19丁目),1,0,1,0,0,0
--------------- not found 01101,064  ,0640822,ホッカイドウ,サッポロシチュウオウク,キタ2ジョウニシ(20-28チョウメ),北海道,札幌市中央区,北二条西(20〜28丁目),1,0,1,0,0,0
--------------- not found 01101,060  ,0600003,ホッカイドウ,サッポロシチュウオウク,キタ3ジョウニシ(1-19チョウメ),北海道,札幌市中央区,北三条西(1〜19丁目),1,0,1,0,0,0

上のようなパターン以外にも
--------------- not found 01102,002  ,0028091,ホッカイドウ,サッポロシキタク,ミナミアイノサト,北海道,札幌市北区,南あいの里,0,0,1,0,0,0
なんて、郵便番号データにある住所がヒットしていないケースもある!

$ grep read 1.txt
read ... 01_2007.csv
read ... 02_2007.csv
read ... 03_2007.csv
read ... 04_2007.csv
read ... 05_2007.csv
read ... 06_2007.csv
read ... 07_2007.csv

$ wc -l 1.txt
   11271 1.txt
7 ファイル分を処理した段階で、 1 万以上のマッチしなかったパターンがある!

"以下に掲載がない場合" と "xx 丁目ーxx丁目" パターンの対処をして、どこまで減らせるかなぁ...

« 2009年1月2日 | トップページ | 2009年1月4日 »

mokuji

2013年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

google

  • twitter
  • __
  • _
    Googleボットチェッカー

合わせて読む

  • 合わせて読む
    フィードメーター - katoy: cocolog あわせて読みたい

リンク