목표 온천에 가장 가까운 숙소를 GoogleMapAPI와 Python으로 검색
17518 단어 파이썬matplotlibGoogleMapsAPI
나스에는 유명한 가노노유 온천이 있습니다.
가노노유 온천이란?
가노노유의 유래
나스 온천 모토유·가노노유는 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은 전 세계 대응이므로 이것이라면 기본적으로 어느 나라에서나 시설명과 숙명을 입력하면 플롯할 수 있습니다.
Reference
이 문제에 관하여(목표 온천에 가장 가까운 숙소를 GoogleMapAPI와 Python으로 검색), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/rakko_no_learning/items/9019a836594c135187a2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
〜略
'''
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 栃木県那
〜略
'''
'''
源泉 那須山 〒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
'''
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')
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)
Reference
이 문제에 관하여(목표 온천에 가장 가까운 숙소를 GoogleMapAPI와 Python으로 검색), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rakko_no_learning/items/9019a836594c135187a2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)