リモートも増えて来たので
会社から2時間以内で行ける駅を
探してみようと思いました。

解説動画はこちら




今回は会社から2時間圏内の場所を
探してみようということで
いい感じのものは無いかなーと探していたら
NAVITIMEのAPIが使えるみたいですね。

これは起点となる駅からXX分以内で
行ける駅と緯度経度を取得できるという
素敵なAPIでした。

ここら辺から参照してね

これを使って
NAVITIMEのAPIから該当する駅を取得するコードを
書いていきましょう。

なおこのコードを動かすには
APIキーが必要です。

無料で取得できますんで、ここは自分で
取得して下さいね!!!

コードはこんな感じです
import requests

# NAVITIMEのAPI
url = "https://navitime-reachable.p.rapidapi.com/reachable_transit"

# 基点の緯度経度(今回は新橋駅)
base_loc = "35.667272,139.758786"

# かかる分数
term = "120"

## API_KEY (登録が必要) 
# api_key # ここは自分で取得して設定してね

query_str = {
    "start":base_loc,
    "term":term,
    "term_from":"0",
    "walk_speed":"5",
    "transit_limit":"3",
    "offset":"0", 
    "limit":"2000",
    "datum":"wgs84",
    "coord_unit":"degree",
}

headers = {
    'x-rapidapi-host' : "navitime-reachable.p.rapidapi.com",
    'x-rapidapi-key' : api_key # ここは自分で取得して設定してね
}

res = requests.request("GET", url, headers=headers, params=query_str)

 今回は起点となる駅を新橋駅にしています。
日本のサラリーマンの中心ですからね。

ここら辺に勤めている人も多いはず
変えたい方は緯度経度の指定の部分(base_loc)を
変えてください。

なお3時間でも良いという方は
term(120)を180に変えてくださいね。

さてこのコードを動かすと、120分以内の
駅群が取得出来ます。

APIから取得した駅をデータフレームにして
使えるようにしましょう。
# データ化
items = res.json()['items']

data = []
for item in items:
    time = item['time']
    lat = item['coord']['lat']
    lon = item['coord']['lon']
    name = item['name']
    node_id = item['node_id']
    transit_count = item['transit_count']
    tmp = [name,node_id,time,transit_count,lat,lon]
    data.append(tmp)

# データフレームの作成
import pandas as pd
df = pd.DataFrame(data,columns=['駅名','駅ID','時間','乗換回数','緯度','経度'])
df.head()
スクリーンショット 2021-06-05 16.56.19

綺麗な表形式のデータフレームに直しました。
これで使いやすくなります。

これを眺めるのも良いですが
やはり緯度経度が有るので
地図にプロットしたいですよね。

Foliumを使えば
簡単に地図にプロッティングできます
早速コードを書いていきましょう。

なおFoliumはデフォルトのライブラリには無いので
インストールが必要です。

入れていない無い方、エラーが出る方は
インストールしてください。

Foliumを使って可視化する
import folium
from folium.features import CustomIcon

# マーカー用の関数
def make_maker(r,color):
    tmp = folium.Marker(
        location = [r['緯度'],r['経度']],  
        popup    = '{0} : {1}分'.format(r['駅名'],r['時間']),
        icon     = folium.Icon(color=color))
    return tmp

# 地図生成
lat,lon = float(base_loc.split(',')[0]),float(base_loc.split(',')[1])
plot_map = folium.Map(location=[lat,lon] ,  zoom_start=8)

group1 = folium.FeatureGroup(name="60分以内").add_to(plot_map)
group2 = folium.FeatureGroup(name="120分以内").add_to(plot_map)

# 起点マーカーの書き込み
folium.Marker(
        location = [lat,lon],  
        popup    = '{0} : {1}分'.format('新橋駅',0),
        icon     = folium.Icon(color='green')).add_to(plot_map)

# マーカーの書き込み
for i, r in df[df['時間']<=60].iterrows():    
    group1.add_child(make_maker(r,'blue'))
for i, r in df[(df['時間']>60)].iterrows():    
    group2.add_child(make_maker(r,'red'))

# 判例コントローラー表示
folium.LayerControl().add_to(plot_map)

# HTMLファイルへ書き込み
plot_map.save("eki_maps.html")

なおこのコードは起点が新橋駅なので
変えたい方は関係するコード部分を
書き換えてくださいね。

これを実行すると
HTMLファイルが作成されます。

早速見ていきましょう。
スクリーンショット 2021-06-05 16.56.50

青マーカーが1時間以内
赤マーカーが2時間以内の駅です

右上のマーカーから絞り込みが出来ます。
スクリーンショット 2021-06-05 16.57.15



60分以内のみ

スクリーンショット 2021-06-05 16.57.38


61-120分のみ
スクリーンショット 2021-06-05 16.57.27

緑色のマーカーが起点の新橋駅です。

これで見ると
結構遠くまで行けますねえ

最北端や最西端は新幹線でしょうねえ
流石にここら辺は厳しいかもしれませんが
千葉や埼玉、神奈川は結構行けるところありますね。

ここら辺から引越しの候補が
見つかるかもしれません。

伊東辺りまで行けそうなので
温泉街に住むのもアリかもしれません!!

APIをうまく使えば
もう少し絞り込めるので
色々と遊んでみると良いと思います。

今回はこれまでです
それでは。