雑記帳 →

ランダムで駅を出すツールを作る

Zakki

もともとZennに投稿しようとしていた文章。いい感じに書ける気がしなかったのでここに供養。


ある時、1時間程度暇な時間があり、特に意味もなく適当な駅で降りてみようと思ったことがあった。その適当な駅を決めるために、MapFanの駅一覧からテキストを取ってきて、ルーレットに入れて回す…ということをしていた。

でも、テキストはきれいに改行されておらず、複数の路線を対象にすると労力も増える。 そこで、簡単に指定駅の中からランダムな駅を出すツールを作ることにした。

使用している技術

すべて生のHTML, CSS, JavaScript。外部APIや外部データの使用は一切なし。

TIP

世の中には駅データ.jp経度緯度付き全国沿線・駅データベースなどの、データを簡単に取得できるサービスがあります。 本来はそちらを使うべきです。

制約

プログラムを作るに当たり、以下の制約を定める。

  1. 駅は路線ごと、路線は事業者ごと、事業者は地方・都道府県単位で分類
  2. チェックボックスに路線・駅単位でユニークなIDを振る
  3. asyncawaitは使わない

作る

フォーマットを決める

事業者が複数の路線を持っている場合は、

const multi = {
  "jr-east-yamanote": [
    { name: "東京", id: "tokyo" },
    { name: "神田", id: "kanda" },
    ...
    { name: "有楽町", id: "yurakucho" },
  ],
  ...
};

のように、事業者ID-路線IDをキーにして、{ name: "駅名", id: "ローマ字駅名" }を複数持つリストとする。

事業者が一つの路線しか持たない場合は、

const single = [
  { name: "新木場", id: "shinkiba" },
  { name: "東雲", id: "shinonome" },
  ...
  { name: "大崎", id: "osaki" },
];

のように、ただのリストとして作る。

路線(事業者)

路線(事業者)は、次のようなオブジェクトとする。

const kantoRailways = {
  id: "kanto",
  name: "関東",
  railways: {
    "jr-east": {
      id: "jr-east",
      name: "JR東日本",
      icon: "assets/kanto/jr-east/jr.svg",
      railway: [
        {
          name: "山手線",
          id: "yamanote",
          icon: "assets/kanto/jr-east/jy.svg",
        },
        ...
        {
          name: "鹿島線",
          id: "kashima",
          icon: "assets/kanto/jr-east/kashima.svg",
        },
      ],
    },
  },
};

ここで使用しているjr-eastは事業者ID、yamanoteは路線IDとして駅の作成時に使用する。 iconは外部URLを入れても参照できるように、index.htmlの相対パスとしている。

メソッドを生やす

路線一覧、駅一覧の作成

ほとんどの時間がこれに費やされる。 隣にiPadを置き、にらめっこしながら気合いで入力。 GitHub Copilotが適切なローマ字を出してくれることもあるが、全体の半分程度。

以下のサイトで掲載されている路線図から、駅名とその英語表記を拝借した。

バンドラーの作成

事業者や路線の駅データをそれぞれのファイルに分けていると、流石にindex.htmlに手打ちするわけにもいかない。かといって、JavaScriptで動的に<script>タグを埋め込むと、チェックボックスのリスナーが適切に動作しない。

そこで、各地方・都道府県の路線データと駅データを格納しているフォルダのすべてのjsを適切な順番で読み出し、まとめてminifyすれば、高速でシンプルになると考えた。

完成物

おまけ

企画券から選択できたらもっと楽しい気がしたので、その機能も追加。

カテゴリー

/

Zakki
profile icon

wamo

シンプルなものが好きです。

アーカイブ

カテゴリー

寄付

時間のないサイト運営者リング