首都圏の鉄道駅の緯度経度を世界測地系に変換

首都圏の鉄道駅について、Google Maps で使用可能な世界測地系の緯度経度を取得することを目標とする。

1. 鉄道駅の緯度経度を取得

鉄道網の分析: 研究概要: 篠田 孝祐 から 駅情報データ を取得。篠田さん、ありがとう!

2. 世界測地系に変換

上のデータは日本測地系である。そのため世界測地系へ変換しなければならない。幸い、国土地理院が変換プログラムTKY2JGDを公開してくれている。ダウンロードして使う。1. のデータのフォーマットは「駅名・緯度・経度」の順にデータが並んでいるが、このソフトは「緯度・経度・駅名」の順にしかデータを受け付けないので、変換フィルタを Ruby で書いた。

STDIN.each do |line|
  next if line =~ /^#/
  items = line.split(/\s+/)
  print items[2].gsub('.', ''), ' ', items[3].gsub('.', ''), ' ', items[1], "\n"
end

3. 10進数表記に変換

さてこうして世界測地系に変換はできたが、問題がある。このデータは「〜度〜分〜秒」という形式のデータで、Google Maps に食わせるには、10進数に変換しなければならない。基本的には、時間と考え方は同じ。たとえば「1時間25分33秒」は何時間か?という問題を考えてみればいい。この場合 1 + 25/60 + 33/3600 = 1.42583333333333 時間ということになる。そこで作ったのが次のスクリプト。

def d60_to_d10(num_str)
  a, b = num_str.split('.')
  r = a[0, a.size - 4].to_f + a[-4, 2].to_f / 60.0 + "#{a[-2, 2]}.#{b}".to_f / 3600.0
end

STDIN.each do |line|
  items = line.split(/\s+/)
  print items[3], "\t", d60_to_d10(items[1]), "\t", d60_to_d10(items[2]), "\n"
end

これで完了。めでたしめでたし。