目当ての温泉に最も近い宿をGoogleMapAPIとPythonで探す


#那須には有名な鹿の湯温泉があります。

> **鹿の湯温泉とは？**
> [鹿の湯の由来](http://www.shikanoyu.jp/history/)
> 那須温泉元湯・鹿の湯は、七世紀前半、約千三百年前の舒明（じょめい）天皇の御世に開湯されたといわれます。
> 狩野三郎行広という者が山狩の際に、射損じて逃げる鹿を追って山奥に入ると、鹿は傷ついた体を温泉で癒していました。

それ以外にも様々な温泉があります。
そこで、温泉を巡るには位置的にどの宿が一番最適かGoogleMapAPIを使って調べてみました。

必要なもの
- Python
- GoogleMapAPI
- 温泉と宿の名前リスト（自作）


## 各宿と温泉の住所を取得
ひとまず名前だけを入れたCSVをPythonに読み込ませます。

```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を取得します。

```python

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 栃木県那須郡那須町湯本１８１  NaN  37.098282  140.001072
小鹿の湯                〒325-0301 栃木県那須郡那須町湯本７７  NaN  37.094478  140.002445
金ちゃん温泉      〒325-0303 栃木県那須郡那須町高久乙３３７０−３１２５  NaN  37.070758  139.992096
河原の湯                  〒949-2235 新潟県妙高市関山燕温泉  NaN  36.902799  138.140873
那須湯本温泉             〒325-0301 栃木県那須郡那須町湯本１８１  NaN  37.098282  140.001072
共同浴場滝の湯         〒637-1333 奈良県吉野郡十津川村小原３７３−１  NaN  33.987779  135.790260
新那須温泉              〒325-0301 栃木県那須郡那須町湯本２０６  NaN  37.088573  140.011186
源泉 那須山        〒325-0001 栃木県那須郡那須町高久甲４５８８−１０  NaN  37.018106  140.031656
那須湯菜の宿 芽瑠鼓      〒325-0301 栃木県那須郡那須町湯本２０３−８６  NaN  37.084230  140.007658
東京タワー              〒105-0011 東京都港区芝公園４丁目２−８  NaN  35.658580  139.745433
                                                           address  ...         lng
name                                                                ...            
かんすい苑覚楽                                  〒325-0017 栃木県那須塩原市黒磯４０２−２  ...  140.046972
〜略
ホテル一望閣                              〒381-0401 長野県下高井郡山ノ内町平穏７１４８−３１  ...  138.496586
ホテル塩原ガーデン                                 〒329-2921 栃木県〜略
加登屋旅館                                    〒999-5205 山形県最上郡鮭川村中渡１３１２  ...  140.151967
喜久屋旅館                                     〒960-0201 福島県福島〜略
那須郡那須町湯本２５２  ...  140.000253
〜略
千歳屋旅館                                         〒311-2436 茨城県潮来市牛堀１１  ...  140.515381
大丸温泉旅館                                    〒325-0301 栃木県那須郡那須町湯本２６９  ...  139.984704
大江戸温泉物語塩原温泉かもしか荘                          〒329-2921 栃木県那須塩原市塩原１２５６  ...  139.832859
大黒屋旅館                                  〒042-0932 北海道函館市
〜略
田中屋                                    〒766-0001 香川県仲多度郡琴平町685番地１１  ...  133.818033
那須温泉山楽                                    〒325-0301 栃木県那須郡那須町湯本２０６  ...  140.007448
那須観光ホテル                                   〒325-0301 栃木県那須郡那須町湯本２０６  ...  140.005681
那須高原の宿 山水閣                                〒325-0301 栃木県那須郡那須町湯本２０６  ...  140.011163
那須湯本温泉 民宿 松葉                            〒325-0301 栃木県那須郡那須町湯本１３０−７  ...  140.001201
南月                618 S Brea Canyon Rd F, Walnut, CA 91789 アメリカ合衆国  ... -117.845580
弁天温泉旅館                                    〒325-0301 栃木県那

〜略
'''
```

概ね正しく取れましたが、見てみると長野県、北海道、福島、果てはUSAの住所も入ってしまってますね。これは同名の施設名があるため仕方ないです。
手動で直してもいいですが、今回は栃木県那須の旅館に泊まるので
` gmaps.geocode("栃木県那須 " + index, language='ja')`としてみました。

```python
'''
源泉 那須山                〒325-0001 栃木県那須郡那須町高久甲４５８８−１０  NaN  37.018106  140.031656
那須湯菜の宿 芽瑠鼓              〒325-0301 栃木県那須郡那須町湯本２０３−８６  NaN  37.084230  140.007658
東京タワー                                     栃木県那須郡那須町  NaN  37.019731  140.121017
                                         address  tel        lat         lng
name                                                                        
かんすい苑覚楽                〒325-0017 栃木県那須塩原市黒磯４０２−２  NaN  36.983257  140.046972
グランドホテル愛寿               〒325-0301 栃木県那須郡那須町湯本２０６  NaN  37.088654  140.011105
はなやホテル                   〒325-0301 栃木県那須郡那須町湯本７７  NaN  37.094478  140.002445
ブランヴェール那須           〒325-0301 栃木県那須郡那須町湯本２０６−１９４  NaN  37.092397  140.008389
'''
```
全ての那須の旅館や温泉の位置情報が取得できました。ファジーな情報からも検索してくれるGoogleMapはすごいですね。上記で試しに那須で東京タワーを検索していますが、那須町までしか取得できていませんでした。これも実際のGoogleMapの挙動と同じでした。

## 各宿から各温泉までの歩行距離を取得
各宿から温泉までの歩行距離は`distance`で取得できるのでそれを新規に作成したdfにイテレータで差し込んでいきます。

```python
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')
```
<img width="863" alt="スクリーンショット 2019-01-28 11.05.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/302092/3e11a3fe-1a12-1536-021d-306eebdaf126.png">


各宿から各温泉への歩行時距離を取得できました。`value`はメートル単位になっているようです。

ところで宿から温泉へ行くために1キロ以上歩くのは大変です。そこで1000メートル以上各宿から温泉へ歩行しなければならない宿は除外します。

```python
df_dists = df_dists[(df_dists['numeric_dist'] <= 1_000)]
```
##群生プロットで確認する。
そして、各宿から温泉へどの程度時間がかかるのか群生プロットで見てみます。

```pyhon

fig, axe = plt.subplots(figsize=(25, 20))
sns.swarmplot(x='index', y='numeric_dist', hue='dest_name', data=df_dists,)
plt.xticks(rotation=90)
```
結果

![Figure_4.png](https://qiita-image-store.s3.amazonaws.com/0/302092/1564315d-4fda-fb7a-8bf4-be40a8f0b782.png)

軸とhueを反転させると温泉側からも考えることができます。（見づらいですけど）
![Figure_3.png](https://qiita-image-store.s3.amazonaws.com/0/302092/c2f888c1-60b1-d55b-9f3b-3f02810205ce.png)



行きたい温泉からどの程度各宿が離れているのか目視できるようになりました！
~~本当は巡回セールスマン問題によって最適ルートを算出したかったのですが~~
GoogleMapは全世界対応なのでこれなら基本的にどこの国でも施設名と宿名を入力すればプロットすることができます。