「国土数値情報 鉄道データ」ってのがあります。
全国の旅客鉄道・軌道の路線や駅について、形状(線)、鉄道区分(普通鉄道、鋼索鉄道、懸垂式モノレール、跨座式モノレール等)、事業者(新幹線、JR在来線、公営鉄道、民営鉄道、第三セクター)、路線名、運営会社等を整備したものである。駅は、鉄道路線の一部分として整備している。
国土数値情報 鉄道データの詳細
このデータを Webアプリなんかから使いやすいように加工するためのスクリプトを書きました。
というか、XML データをパースして DB (SQLite)にほとんどそのままの形で突っ込んでるだけです。
SQLite にデータを格納することで、いろいろなアプリケーションから利用しやすくなる思います。
そもそもこの「鉄道データ」というのがどういうデータ構造なのかというと、以下のような感じになってます。

「路線」や「駅」の「位置」が「曲線データ」によって表されています。
「曲線データ」は複数の「座標」を持っています。
ちなみに、元データ(XMLファイル)の構造は以下のようになっています。

「路線」「駅」「曲線」「座標」のそれぞれのデータがそのまんま並んでるだけです。
XML ファイル上では、「座標」は具体的な数値(ジオコード)で表されることもあれば、「座標データ」への参照で表されることもあります。
例えば以下のような感じです。
<curve>
...
<point idref="pt20743_rr" /> # 座標ID
<point>26.214740 127.679704</point> # ジオコード
<point>26.214795 127.679752</point> # ジオコード
<point>26.217280 127.682172</point> # ジオコード
<point idref="pt20737_rr" /> # 座標ID
…
</curve>
変換処理では、後々の利便性を考えて、上記の「座標ID」のところを実際の値(つまりジオコード)に置き換えるという、いわゆる非正規化的なことをやってます。
なので「座標データ」は一旦は DB に格納されますが、最終的には必要なくなります。
上記の通り「曲線データ」は配列的なデータなので、 DB にどういうかたちで格納すべきか迷ったのですが、YAML フォーマットに変換してひとつのカラムに突っ込むようにしました。
ソース
ソース類を以下に置きました。
http://github.com/jugyo/rail_data_converter/tree/master
実行手順ですが、git-clone でソース類をダウンロードした後、鉄道データをダウンロードしてきて rake コマンドを叩くだけです。
# ソース類の取得
$ git-clone git://github.com/jugyo/rail_data_converter.git rail_data_converter
$ cd rail_data_converter
# 鉄道データのダウンロード
# 以下のページからたどって鉄道データをダウンロードし、
# http://nlftp.mlit.go.jp/ksj/jpgis/datalist/KsjTmplt-N02-v1_1.html
# rail_data.xml という名前でカレントディレクトリに保存する
# 変換処理開始
$ rake
Rails で使用する際の手順
あとで書く。