4 분 소요

import warnings
warnings.filterwarnings('ignore')
import requests
import folium
from pandas.io.json import json_normalize
#전국 또는 특정 지역의 스타벅스 매장의 위치를 찾아서 지도위에 표시하기
#1. requests 모듈로 스타벅스 매장 위치 데이터를 
#   가져와서 딕셔너리 타입으로 변환한다.
#2. 판다스의 json_normalize()함수로 json이 변환된 딕셔너리를 
#   판다스 데이터프레임으로 변환한다.
#3. folium 모듈을 사용해 지도를 표시하고 지도위의 스타벅스 매장 위치에
#   마커를 표시한다.
#서울 스타벅스 전 지점
targetSite = 'https://www.starbucks.co.kr/store/getStore.do?r=V412YZ6GQ3'
request = requests.post(targetSite, data={ 
    'ins_lat' : 37.2700715, # 위도
    'ins_lng': 127.1273485, # 경도
    'p_sido_cd' : '01', #시도코드
    'p_gugun_cd': '', #구군코드
    'in_biz_cd': '', #?
    'iend' : 1600, #서버가 응답하는 최대 매장의 개수
    'set_date' : '' #?
    })

storeList = request.json()
print(type(storeList))
print(len(storeList['list']))
<class 'dict'>
581
#json_normalize()함수로 json타입으로 데이터가
#변환된 딕셔너리를 판다스 데이터프레임으로 변환한다.
#json_normalize(데이터프레임으로 변환할 데이터가 저장된 딕셔너리, 
#               '딕셔너리의 key중에서 데이터 프레임으로 변환할 key')
star_df = json_normalize(storeList, 'list')
print(type(star_df))
<class 'pandas.core.frame.DataFrame'>
star_df.head()
seq sido_cd sido_nm gugun_cd gugun_nm code_order view_yn store_num sido gugun ... t22 t21 p90 t05 t30 t36 t27 t29 t43 t48
0 0 None None None None None None None None None ... 0 0 0 0 0 0 0 0 0 0
1 0 None None None None None None None None None ... 0 0 0 0 0 0 0 0 0 0
2 0 None None None None None None None None None ... 0 0 0 0 0 0 0 0 0 0
3 0 None None None None None None None None None ... 0 0 0 0 0 0 0 0 0 0
4 0 None None None None None None None None None ... 0 0 0 0 0 0 0 0 0 0

5 rows × 129 columns

print(storeList['list'][0])
{'seq': 0, 'sido_cd': None, 'sido_nm': None, 'gugun_cd': None, 'gugun_nm': None, 'code_order': None, 'view_yn': None, 'store_num': None, 'sido': None, 'gugun': None, 'address': None, 'new_img_nm': None, 'p_pro_seq': 0, 'p_view_yn': None, 'p_sido_cd': '', 'p_gugun_cd': '', 'p_store_nm': None, 'p_theme_cd': None, 'p_wireless_yn': None, 'p_smoking_yn': None, 'p_book_yn': None, 'p_music_yn': None, 'p_terrace_yn': None, 'p_table_yn': None, 'p_takeout_yn': None, 'p_parking_yn': None, 'p_dollar_assent': None, 'p_card_recharge': None, 'p_subway_yn': None, 'stb_store_file_renew': None, 'stb_store_theme_renew': None, 'stb_store_time_renew': None, 'stb_store_lsm': None, 's_code': '1509', 's_name': '역삼아레나빌딩', 'tel': '1522-3232', 'fax': '02-568-3763', 'sido_code': '01', 'sido_name': '서울', 'gugun_code': '0101', 'gugun_name': '강남구', 'addr': '서울특별시 강남구 역삼동 721-13 아레나빌딩', 'park_info': None, 'new_state': None, 'theme_state': 'T05@T08@T16@T17@T20@T21@T30@@T52@P80@P90', 'new_bool': 0, 'search_text': '', 'ins_lat': '', 'ins_lng': '', 'in_distance': 0, 'out_distance': '26.75', 'all_search_cnt': -1, 'addr_search_cnt': -1, 'store_search_cnt': -1, 'rowCount': 30, 'store_nm': '', 'store_cd': 0, 's_biz_code': '3762', 'new_icon': 'N', 'set_user': '', 'favorites': 0, 'map_desc': None, 'notice': None, 'defaultimage': '/upload/store/2020/09/[3762]_20200917031519_6juwr.JPG', 'etcimage': None, 'in_biz_cd': None, 'in_store_cd': None, 'in_favorites': None, 'in_user_id': None, 'in_biz_cds': 0, 'in_biz_arr': None, 'in_biz_arrdata': None, 'in_scodes': 0, 'in_scode_arr': None, 'in_scode_arrdata': None, 'disp': None, 'set_date': None, 'hlytag': None, 'hlytag_msg': None, 'vSal': '', 'istart': 1, 'iend': 60, 'open_dt': '20190613', 'gold_card': 0, 'ip_lat': '', 'ip_long': '', 'espresso': '', 'new_store': '', 'premiere_food': '', 'doro_address': '서울특별시 강남구 언주로 425 (역삼동)', 'cold_blew': '', 'my_siren_order_store_yn': 'N', 'whcroad_yn': 'WHCROAD', 'skuNo': '', 'skuName': '', 'skuImgUrl': '', 'stock_count': 0, 'store_area_name': None, 'store_area_code': 'A01', 'is_open': None, 'gift_stock_yn': None, 'lat': '37.501087', 'lot': '127.043069', 't20': 0, 't04': 0, 't03': 0, 't01': 0, 't12': 0, 't09': 0, 't06': 0, 't10': 0, 'p10': 0, 'p50': 0, 'p20': 0, 'p60': 0, 'p30': 0, 'p70': 0, 'p40': 0, 'p80': 0, 't22': 0, 't21': 0, 'p90': 0, 't05': 0, 't30': 0, 't36': 0, 't27': 0, 't29': 0, 't43': 0, 't48': 0}
# 작업에 필요한 칼럼 및 가지를 선택해서 지도에 마커를
# 표시할 때 사용할 데이터가 저장된 데이터프레임을 만든다.
# s_name => 지점이름
# sido_code => 시도코드
# sido_name => 시도이름
# gugun_code => 구군코드
# gugun_name => 구군이름
# ,doro_address => 도로명주소
# lat => 위도
# lot => 경도

star_df_map = star_df[['s_name','sido_code','sido_name','gugun_code',
                        'gugun_name','doro_address','lat','lot']]
star_df_map.head()
s_name sido_code sido_name gugun_code gugun_name doro_address lat lot
0 역삼아레나빌딩 01 서울 0101 강남구 서울특별시 강남구 언주로 425 (역삼동) 37.501087 127.043069
1 논현역사거리 01 서울 0101 강남구 서울특별시 강남구 강남대로 538 (논현동) 37.510178 127.022223
2 신사역성일빌딩 01 서울 0101 강남구 서울특별시 강남구 강남대로 584 (논현동) 37.514132 127.020563
3 국기원사거리 01 서울 0101 강남구 서울특별시 강남구 테헤란로 125 (역삼동) 37.499517 127.031495
4 대치재경빌딩R 01 서울 0101 강남구 서울특별시 강남구 남부순환로 2947 (대치동) 37.494668 127.062583
star_df_map.dtypes
s_name          object
sido_code       object
sido_name       object
gugun_code      object
gugun_name      object
doro_address    object
lat             object
lot             object
dtype: object
star_df_map['lat'] = star_df_map['lat'].astype(float)
star_df_map['lot'] = star_df_map['lot'].astype(float)
star_df_map.dtypes
s_name           object
sido_code        object
sido_name        object
gugun_code       object
gugun_name       object
doro_address     object
lat             float64
lot             float64
dtype: object
#종각점 
star_df_map[star_df_map['s_name']=='종각']
s_name sido_code sido_name gugun_code gugun_name doro_address lat lot
431 종각 01 서울 0118 종로구 서울특별시 종로구 종로 64 (종로2가) 37.569918 126.984528
#종로관철점
star_df_map[star_df_map['s_name']=='종로관철']
s_name sido_code sido_name gugun_code gugun_name doro_address lat lot
433 종로관철 01 서울 0118 종로구 서울특별시 종로구 종로12길 21, 2층 (관철동) 37.569058 126.986013
# folium 모듈의 Map()함수로 location 속성으로 지정한
# 위치를 중심으로 하는 zoom_start옵션으로 지정한
# 배율을 가지는 지도를 만든다.
star_map = folium.Map(location=[37.56996875550683, 126.98374888362954], zoom_start=18)

# folium 모듈의 Marker()함수로 location 속성으로 지정한
# 위치에 마커를 만들고 addto()함수로 지도에 추가한다.
# folium 모듈의 Popup()함수로 마커를 클릭했을 때 
# 표시할 팝업 메시지와 max_width속성으로 팝업메시지
# 표시되는 창의 최대 크기를 지정할 수 있다.
popup = folium.Popup('종각점', max_width=200)
folium.Marker(location=[37.56996875550683, 126.98374888362954], 
              popup=popup).add_to(star_map)

popup = folium.Popup('종로 관철점점', max_width=200)
folium.Marker(location=[37.56919236504892, 126.98600579712074], 
              popup=popup).add_to(star_map)
star_map.save('./output/star1.html')
star_map

1

# 서울특별시에 위치한 스타벅스 전 지점의 위치를 지도위에
# 표시한다.

# 지도를 작성할 때 지도의 중심으로 설정할 위치가 애매할 경우
# 지도위에 표시할 모든 스타벅스의 위도,경도위치의 평균을 
# 중심으로 하는 지도를 만들면 된다.
star_map = folium.Map(location=[star_df_map['lat'].mean(),
                      star_df_map['lot'].mean()], 
                      zoom_start=18)

# iterrows() 함수는 데이터프레임에 저장된 데이터의 인덱스와
# 그 인덱스에 해당되는 데이터를 얻어온다.
for index, data in star_df_map.iterrows():
    popup = folium.Popup(data['s_name'] + '점, 주소 : ' +data['doro_address'], max_width=300)
    folium.Marker(location=[data['lat'], data['lot']], popup=popup).add_to(star_map)
star_map.save('./output/star2.html')
star_map

2

# 강남구 스타벅스 전 지점
targetSite = 'https://www.starbucks.co.kr/store/getStore.do?r=V412YZ6GQ3'
request = requests.post(targetSite, data={ 
    'ins_lat' : 37.2700715, # 위도
    'ins_lng': 127.1273485, # 경도
    'p_sido_cd' : '01', #시도코드
    'p_gugun_cd': '', #구군코드
    'in_biz_cd': '', #?
    'iend' : 1600, #서버가 응답하는 최대 매장의 개수
    'set_date' : '' #?
    })
storeList = request.json()
star_df = json_normalize(storeList, 'list')
star_df_map = star_df[['s_name','sido_code','sido_name','gugun_code',
                        'gugun_name','doro_address','lat','lot']]
star_df_map['lat'] = star_df_map['lat'].astype(float)
star_df_map['lot'] = star_df_map['lot'].astype(float)

star_map = folium.Map(location=[star_df_map['lat'].mean(),
                      star_df_map['lot'].mean()], 
                      zoom_start=12)
for index, data in star_df_map.iterrows():
    popup = folium.Popup(data['s_name'] + '점, 주소 : ' +data['doro_address'], max_width=300)
    folium.Marker(location=[data['lat'], data['lot']], popup=popup).add_to(star_map)
star_map.save('./output/star3.html')
star_map

3

태그:

카테고리:

업데이트:

댓글남기기