#那須には有名な鹿の湯温泉があります。
鹿の湯温泉とは?
鹿の湯の由来
那須温泉元湯・鹿の湯は、七世紀前半、約千三百年前の舒明(じょめい)天皇の御世に開湯されたといわれます。
狩野三郎行広という者が山狩の際に、射損じて逃げる鹿を追って山奥に入ると、鹿は傷ついた体を温泉で癒していました。
それ以外にも様々な温泉があります。
そこで、温泉を巡るには位置的にどの宿が一番最適かGoogleMapAPIを使って調べてみました。
必要なもの
- Python
- GoogleMapAPI
- 温泉と宿の名前リスト(自作)
各宿と温泉の住所を取得
ひとまず名前だけを入れたCSVをPythonに読み込ませます。
gmaps = googlemaps.Client(key)
spring = "spring_ad.csv"
hotel = "hotel_ad.csv"
now = datetime.now()
# エンコードエラーが出たため、codecsを挟んでます。
with codecs.open(hotel, "r", "Shift-JIS") as file:
df_h = pd.read_csv(file, index_col=0)
print(df_h)
with codecs.open(spring, "r", "Shift-JIS") as file:
df_s = pd.read_csv(file, index_col=0)
print(df_s)
'''
address tel
name
かんすい苑覚楽 NaN NaN
グランドホテル愛寿 NaN NaN
はなやホテル NaN NaN
〜略
address tel
name
那須温泉 鹿の湯 NaN NaN
小鹿の湯 NaN NaN
金ちゃん温泉 NaN NaN
〜略
'''
読み込まれたものを今度はGoogleMapAPIをつかって日本語language=ja
で住所とlat lngを取得します。
def add_linfo(df):
df['address'] = df['address'].astype(object)
df['lat'] = 0
df['lat'] = df['lat'].astype(float)
df['lng'] = 0
df['lng'] = df['lng'].astype(float)
for index, row in df.iterrows():
results = gmaps.geocode(index, language='ja')
df.at[index, 'address'] = results[0]['formatted_address'].strip('日本、')
df.at[index, 'lat'] = results[0]['geometry']['location']['lat']
df.at[index, 'lng'] = results[0]['geometry']['location']['lng']
add_linfo(df_s)
add_linfo(df_h)
print(df_s)
print(df_h)
'''
address tel lat lng
name
那須温泉 鹿の湯 〒325-0301 栃木県那須郡那須町湯本181 NaN 37.098282 140.001072
小鹿の湯 〒325-0301 栃木県那須郡那須町湯本77 NaN 37.094478 140.002445
金ちゃん温泉 〒325-0303 栃木県那須郡那須町高久乙3370−3125 NaN 37.070758 139.992096
河原の湯 〒949-2235 新潟県妙高市関山燕温泉 NaN 36.902799 138.140873
那須湯本温泉 〒325-0301 栃木県那須郡那須町湯本181 NaN 37.098282 140.001072
共同浴場滝の湯 〒637-1333 奈良県吉野郡十津川村小原373−1 NaN 33.987779 135.790260
新那須温泉 〒325-0301 栃木県那須郡那須町湯本206 NaN 37.088573 140.011186
源泉 那須山 〒325-0001 栃木県那須郡那須町高久甲4588−10 NaN 37.018106 140.031656
那須湯菜の宿 芽瑠鼓 〒325-0301 栃木県那須郡那須町湯本203−86 NaN 37.084230 140.007658
東京タワー 〒105-0011 東京都港区芝公園4丁目2−8 NaN 35.658580 139.745433
address ... lng
name ...
かんすい苑覚楽 〒325-0017 栃木県那須塩原市黒磯402−2 ... 140.046972
〜略
ホテル一望閣 〒381-0401 長野県下高井郡山ノ内町平穏7148−31 ... 138.496586
ホテル塩原ガーデン 〒329-2921 栃木県〜略
加登屋旅館 〒999-5205 山形県最上郡鮭川村中渡1312 ... 140.151967
喜久屋旅館 〒960-0201 福島県福島〜略
那須郡那須町湯本252 ... 140.000253
〜略
千歳屋旅館 〒311-2436 茨城県潮来市牛堀11 ... 140.515381
大丸温泉旅館 〒325-0301 栃木県那須郡那須町湯本269 ... 139.984704
大江戸温泉物語塩原温泉かもしか荘 〒329-2921 栃木県那須塩原市塩原1256 ... 139.832859
大黒屋旅館 〒042-0932 北海道函館市
〜略
田中屋 〒766-0001 香川県仲多度郡琴平町685番地11 ... 133.818033
那須温泉山楽 〒325-0301 栃木県那須郡那須町湯本206 ... 140.007448
那須観光ホテル 〒325-0301 栃木県那須郡那須町湯本206 ... 140.005681
那須高原の宿 山水閣 〒325-0301 栃木県那須郡那須町湯本206 ... 140.011163
那須湯本温泉 民宿 松葉 〒325-0301 栃木県那須郡那須町湯本130−7 ... 140.001201
南月 618 S Brea Canyon Rd F, Walnut, CA 91789 アメリカ合衆国 ... -117.845580
弁天温泉旅館 〒325-0301 栃木県那
〜略
'''
概ね正しく取れましたが、見てみると長野県、北海道、福島、果てはUSAの住所も入ってしまってますね。これは同名の施設名があるため仕方ないです。
手動で直してもいいですが、今回は栃木県那須の旅館に泊まるので
gmaps.geocode("栃木県那須 " + index, language='ja')
としてみました。
'''
源泉 那須山 〒325-0001 栃木県那須郡那須町高久甲4588−10 NaN 37.018106 140.031656
那須湯菜の宿 芽瑠鼓 〒325-0301 栃木県那須郡那須町湯本203−86 NaN 37.084230 140.007658
東京タワー 栃木県那須郡那須町 NaN 37.019731 140.121017
address tel lat lng
name
かんすい苑覚楽 〒325-0017 栃木県那須塩原市黒磯402−2 NaN 36.983257 140.046972
グランドホテル愛寿 〒325-0301 栃木県那須郡那須町湯本206 NaN 37.088654 140.011105
はなやホテル 〒325-0301 栃木県那須郡那須町湯本77 NaN 37.094478 140.002445
ブランヴェール那須 〒325-0301 栃木県那須郡那須町湯本206−194 NaN 37.092397 140.008389
'''
全ての那須の旅館や温泉の位置情報が取得できました。ファジーな情報からも検索してくれるGoogleMapはすごいですね。上記で試しに那須で東京タワーを検索していますが、那須町までしか取得できていませんでした。これも実際のGoogleMapの挙動と同じでした。
各宿から各温泉までの歩行距離を取得
各宿から温泉までの歩行距離はdistance
で取得できるのでそれを新規に作成したdfにイテレータで差し込んでいきます。
df_dists = pd.DataFrame(columns=["address", "dest_name", "dest_address", "dist", "numeric_dist"])
for indexh, rowh in df_h.iterrows():
hloc = str(rowh['lat']) + ',' + str(rowh['lng'])
for indexs, rows in df_s.iterrows():
sloc = str(rows['lat']) + ',' + str(rows['lng'])
dir_results = gmaps.directions(hloc, sloc, mode="walking", departure_time=now)
w_times = dir_results[0]['legs'][0]['distance']['text']
w_times_v = dir_results[0]['legs'][0]['distance']['value']
df_dists = df_dists.append(pd.Series([rowh['address'],
indexs,
rows['address'],
w_times,
w_times_v],
index=df_dists.columns,
name=indexh))
df_dists.to_csv('df_dists.csv')
各宿から各温泉への歩行時距離を取得できました。value
はメートル単位になっているようです。
ところで宿から温泉へ行くために1キロ以上歩くのは大変です。そこで1000メートル以上各宿から温泉へ歩行しなければならない宿は除外します。
df_dists = df_dists[(df_dists['numeric_dist'] <= 1_000)]
##群生プロットで確認する。
そして、各宿から温泉へどの程度時間がかかるのか群生プロットで見てみます。
fig, axe = plt.subplots(figsize=(25, 20))
sns.swarmplot(x='index', y='numeric_dist', hue='dest_name', data=df_dists,)
plt.xticks(rotation=90)
結果
軸とhueを反転させると温泉側からも考えることができます。(見づらいですけど)
行きたい温泉からどの程度各宿が離れているのか目視できるようになりました!
本当は巡回セールスマン問題によって最適ルートを算出したかったのですが
GoogleMapは全世界対応なのでこれなら基本的にどこの国でも施設名と宿名を入力すればプロットすることができます。