最寄り駅を検索する無料APIを公開してみた


最寄りの駅を検索して返却するAPIサービス【NeaREST API】を公開してみたのでご紹介します。

  • 商用利用無料
  • 認証制限なし
  • 高速応答
  • 最大検索件数20件

概要・デモ

以下ページにAPIドキュメントと仕様がありますのでご確認ください。

https://station.ic731.net/docs/near

また、簡単なデモとして今いる位置から最も近い駅を検索するアプリを公開していますのでスマートフォンでお試しください。

https://station.ic731.net/demo/nearest

以下のようなJSONを返却します。

{
    "meta": {
        "status": "success"
    },
    "data": [
        {
            "station_id": 9930101,
            "station_name": "都庁前",
            "pref": "東京都",
            "post": "1600023",
            "address": "新宿区西新宿2-8-1",
            "location": [
                139.69257,
                35.690551
            ],
            "distance": 148
        },
        // 以降続く…

作った動機

最寄り駅を検索するAPIはすでに存在し、以下のようなものが挙げられます。

  • NAVITIME API
  • 駅すぱあとWebService
  • HeartRails

この中で無料で使えるのは一番最後のHeartRails Express 路線/駅名/最寄駅データサービス 様だけ。
実質的に無料で使う場合のスタンダードであり、このサービスがなくなると無料なサービスはなくなってしまいます。

その他にも選択肢をもたせるのは非常に大切な事だと思い、今回開発して公開しました。

仕組み

構成・技術スタックは以下の通りです。

メインシステム

メインシステムはLaravel 9を用いました。

https://laravel.com

個人事業主の大学生とという身分なもので素早い開発とメンテナンスのしやすさを鑑み無難なLaravelに。
PHPのバージョンは開発環境・本番サーバーともに8.1系です。
(最初Lumenでやろうと思ったのですがもう非推奨なんですね)

データベース

今回、他サービスとの干渉防止と可用性の担保・高速処理を目指したく、駅情報データベースを個人的に推しているDBaaS【MongoDB Atlas】を利用しました。

その名の通りドキュメント志向データベースのMongoDBをホスティングするサービスで、共用メモリ500MBのClusterを無料で使えておすすめです。

https://www.mongodb.com/ja-jp/atlas/database

DBaaSを使うことでデータベースの保守管理コストの軽減を図りました。

駅情報データベースは 駅データ.jp様 の最新データを独自に再フォーマットして格納しています。

応答速度30msへの高速化

今回開発するに当たって高速化という点にも重きを置きました。

地理空間インデックス

MongoDBに保存している駅情報の位置情報に地理空間インデックスを付与し、効率的かつ最適なロジックで球面モデルを使用した最寄りの駅を検索する ことができた(つもりです)

少し古いですが以下情報などを参考にしました

https://qiita.com/fetaro/items/7f110f18c6dd9ccd0c90

https://gihyo.jp/dev/serial/01/mongodb/0009

Laravel Octane

普通に開発して実装した時点でも応答速度は50ms程度と高速なのですが更に早くした意欲が出てしまい、Laravelの高速化ミドルウェアで動かせるパッケージ「Laravel Octane」も活用しました。

導入手順

https://0115765.com/archives/7350

結果、abテストで50ms→29msの高速化を実現しました。
実際のところ、Apacheのリバースプロキシを使っているため実際は40ms程度まで落ちるのですがそれでも十分早くなっていると思います。

以上、ざっと紹介させていただきました。ぜひ使っていただけると幸いです!
※紹介スライド

https://www.docswell.com/s/ichii731/ZNXYGK-nearest