2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

pythonで最寄り駅を検索するプログラム

Last updated at Posted at 2023-02-26

位置地図座標から最寄り駅を探索したい

大量に検索したかったのでAPIだと制限とかあるし遅い。
この程度のことに有料とかはありえない。
調べてもAPIは見つかるのだが、オフラインで使えるものが見つからなかったのでpythonで作ってみた。

国土交通省のオープンデータを加工しまくった。
検索用データはデカいのでGithubにおいた

経路や地理条件を厳密に考慮して最寄りを出しているわけではなく、最も直線距離が近い駅を出力するようにしたものなので、あくまでざっくりで良い場合に限る。

import sys
import os
import pickle
from math import cos, sin, sqrt, atan2

"""
座標から最寄り駅探索
station_data.pklの出典:「国土数値情報(鉄道データ)」(国土交通省) (https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N02-v3_0.html) (データ年度:令和3年度取得)
を加工編集
"""
filename = os.path.join(os.path.dirname(__file__), "dat/station_data.pkl")
with open(filename, "rb") as f:
    stations = pickle.load(f)

N = len(stations)


def get_station(lat, lon):
    scale = 2 ** 10
    ret = {}

    for dic in stations:
        dlat = dic["lat"] - lat
        dlon = dic["lon"] - lon

        if dlat ** 2 > 1 or dlon ** 2 > 1:
            continue

        a = sin(dlat / 2) ** 2 + cos(dic["lat"]) * cos(lat) * sin(dlon / 2) ** 2
        d = 12742.02 * atan2(sqrt(a), sqrt(1 - a))

        if d < scale:
            scale = d
            ret = dic
    return ret


if __name__ == "__main__":
    for x in sys.argv[1:]:
        print(get_station(*x.split(",")))
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?