목표 온천에 가장 가까운 숙소를 GoogleMapAPI와 Python으로 검색

나스에는 유명한 가노노유 온천이 있습니다.



가노노유 온천이란?
가노노유의 유래
나스 온천 모토유·가노노유는 7세기 전반 약 1300년 전의 조명 천황의 세상에 개탕되었다고 합니다.
카노 사부로 히로히로라는 자가 야마 사냥 때에, 사손해 도망치는 사슴을 쫓아 산속에 들어가자, 사슴은 상처 입은 몸을 온천에서 치유하고 있었습니다.

그 외에도 다양한 온천이 있습니다.
그래서, 온천을 둘러보려면 위치적으로 어느 숙소가 제일 최적인가 GoogleMapAPI를 사용해 조사해 보았습니다.

필요한 것
- 파이썬
- 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 는 미터 단위로 되어 있는 것 같습니다.

그런데 숙소에서 온천에 가기 위해 1km 이상 걷는 것은 어렵습니다. 거기서 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은 전 세계 대응이므로 이것이라면 기본적으로 어느 나라에서나 시설명과 숙명을 입력하면 플롯할 수 있습니다.

좋은 웹페이지 즐겨찾기