지도 시각화


  1. 카카오 맵 api와 '위치명 ' 데이터를 이용하여 위도 경도를 추출한다.
  2. foilum 을 이용하여 지도에 마커를 그려준다.
#위치정보 가져오기
위치_빈도수 = df['위치'].value_counts( )
위치_빈도수
Busan 釜山, South Korea                                      92
Busan, South Korea                                         82
부산 광안리해수욕장 - 廣安里海水浴場 GwangalliBeach, Busan, South Korea    52
Haeundae, Busan                                            22
흰여울문화마을                                                    17
                                                           ..
부산주당                                                        1
0731커피로스터스                                                  1
수영구 광안동                                                     1
한창정보타운                                                      1
카페밀유                                                        1
Name: 위치, Length: 578, dtype: int64
#등록된 위치정보별 빈도수 데이터
위치_빈도수 = pd.DataFrame(위치_빈도수)
위치_빈도수.head()

위치
Busan 釜山, South Korea 92
Busan, South Korea 82
부산 광안리해수욕장 - 廣安里海水浴場 GwangalliBeach, Busan, South Korea 52
Haeundae, Busan 22
흰여울문화마을 17

카카오맵 api를 이용하여 위도,경도 가져오기.


카카오맵 api를 이용하여 키워드를 입력하면 위도 경도를 반환해주는 함수를 작성해보자.

import requests
import sys

url = 'https://dapi.kakao.com/v2/local/search/keyword.json?query=부산광역시청'
apikey = 'apikey'


kakao= requests.get( url, params = {'query':query}, headers={'Authorization' : 'KakaoAK ' + apikey } ).json() 
kakao
{'documents': [{'address_name': '부산 연제구 연산동 1000',
   'category_group_code': 'PO3',
   'category_group_name': '공공기관',
   'category_name': '사회,공공기관 > 지방행정기관 > 시청 > 광역시청',
   'distance': '',
   'id': '27284326',
   'phone': '051-120',
   'place_name': '부산광역시청',
   'place_url': 'http://place.map.kakao.com/27284326',
   'road_address_name': '부산 연제구 중앙대로 1001',
   'x': '129.07506783124393',
   'y': '35.17973748292069'},
  {'address_name': '부산 연제구 연산동 1000',
   'category_group_code': 'BK9',
   'category_group_name': '은행',
   'category_name': '금융,보험 > 금융서비스 > 은행 > BNK부산은행',
   'distance': '',
   'id': '7898226',
   'phone': '051-852-0066',
   'place_name': '부산은행 부산시청지점',
   'place_url': 'http://place.map.kakao.com/7898226',
   'road_address_name': '부산 연제구 중앙대로 1001',
   'x': '129.074594167442',
   'y': '35.1801024581601'},
  {'address_name': '부산 연제구 연산동 1000',
   'category_group_code': 'PK6',
   'category_group_name': '주차장',
   'category_name': '교통,수송 > 교통시설 > 주차장',
   'distance': '',
   'id': '409735239',
   'phone': '',
   'place_name': '부산시청 주차장',
   'place_url': 'http://place.map.kakao.com/409735239',
   'road_address_name': '부산 연제구 중앙대로 1001',
   'x': '129.074304725066',
   'y': '35.1804606708419'},
  {'address_name': '부산 부산진구 양정동 250-1',
   'category_group_code': 'PS3',
   'category_group_name': '어린이집,유치원',
   'category_name': '교육,학문 > 유아교육 > 어린이집',
   'distance': '',
   'id': '23872678',
   'phone': '051-866-2918',
   'place_name': '부산광역시청 어린이집',
   'place_url': 'http://place.map.kakao.com/23872678',
   'road_address_name': '부산 부산진구 거제천로40번길 31',
   'x': '129.072710296969',
   'y': '35.179222753544'},
  {'address_name': '부산 연제구 연산동 1000',
   'category_group_code': '',
   'category_group_name': '',
   'category_name': '사회,공공기관 > 행정기관 > 과학기술정보통신부 > 우체국',
   'distance': '',
   'id': '9039237',
   'phone': '051-862-5062',
   'place_name': '부산시청우체국',
   'place_url': 'http://place.map.kakao.com/9039237',
   'road_address_name': '부산 연제구 중앙대로 1001',
   'x': '129.075086850882',
   'y': '35.1797948309462'},
  {'address_name': '부산 연제구 연산동 1590-1',
   'category_group_code': '',
   'category_group_name': '',
   'category_name': '부동산 > 주거시설 > 아파트',
   'distance': '',
   'id': '1002976572',
   'phone': '',
   'place_name': '부산시청행복주택아파트(예정)',
   'place_url': 'http://place.map.kakao.com/1002976572',
   'road_address_name': '',
   'x': '129.078762706273',
   'y': '35.1791919810612'},
  {'address_name': '부산 연제구 연산동 1000',
   'category_group_code': 'BK9',
   'category_group_name': '은행',
   'category_name': '금융,보험 > 금융서비스 > 은행 > KB국민은행',
   'distance': '',
   'id': '18738273',
   'phone': '',
   'place_name': 'KB국민은행 부산시청지점',
   'place_url': 'http://place.map.kakao.com/18738273',
   'road_address_name': '부산 연제구 중앙대로 1001',
   'x': '129.075508794887',
   'y': '35.1799858527438'},
  {'address_name': '부산 부산진구 양정동 157-1',
   'category_group_code': 'BK9',
   'category_group_name': '은행',
   'category_name': '금융,보험 > 금융서비스 > 은행 > NH농협은행',
   'distance': '',
   'id': '18683444',
   'phone': '051-868-8710',
   'place_name': 'NH농협은행 부산시청지점',
   'place_url': 'http://place.map.kakao.com/18683444',
   'road_address_name': '부산 부산진구 진연로 15',
   'x': '129.07347771433152',
   'y': '35.17884194127481'},
  {'address_name': '부산 연제구 연산동 1422-8',
   'category_group_code': 'BK9',
   'category_group_name': '은행',
   'category_name': '금융,보험 > 금융서비스 > 은행 > 기업은행',
   'distance': '',
   'id': '8208642',
   'phone': '051-867-8817',
   'place_name': 'IBK기업은행 부산시청역지점',
   'place_url': 'http://place.map.kakao.com/8208642',
   'road_address_name': '부산 연제구 중앙대로 1000',
   'x': '129.075394388676',
   'y': '35.1777313182307'},
  {'address_name': '부산 연제구 연산동 1000',
   'category_group_code': '',
   'category_group_name': '',
   'category_name': '교육,학문 > 학습시설 > 도서관',
   'distance': '',
   'id': '1488771062',
   'phone': '',
   'place_name': '부산시청열린도서관(2020년하반기예정)',
   'place_url': 'http://place.map.kakao.com/1488771062',
   'road_address_name': '부산 연제구 중앙대로 1001',
   'x': '129.07493243862248',
   'y': '35.17993805777149'},
  {'address_name': '부산 연제구 연산동 1449-1',
   'category_group_code': '',
   'category_group_name': '',
   'category_name': '가정,생활 > 드럭스토어 > 올리브영',
   'distance': '',
   'id': '959482251',
   'phone': '051-851-4178',
   'place_name': '올리브영 부산시청역점',
   'place_url': 'http://place.map.kakao.com/959482251',
   'road_address_name': '부산 연제구 연제로 30',
   'x': '129.07696123674373',
   'y': '35.17926525252748'},
  {'address_name': '부산 연제구 연산동 1000',
   'category_group_code': '',
   'category_group_name': '',
   'category_name': '여행 > 공원 > 도시근린공원',
   'distance': '',
   'id': '13665316',
   'phone': '',
   'place_name': '부산광역시청 시민광장',
   'place_url': 'http://place.map.kakao.com/13665316',
   'road_address_name': '부산 연제구 중앙대로 1001',
   'x': '129.075963158602',
   'y': '35.1795527170568'},
  {'address_name': '부산 연제구 연산동 1000',
   'category_group_code': '',
   'category_group_name': '',
   'category_name': '사회,공공기관 > 행정기관부속시설',
   'distance': '',
   'id': '475037324',
   'phone': '',
   'place_name': '부산광역시청 대강당',
   'place_url': 'http://place.map.kakao.com/475037324',
   'road_address_name': '부산 연제구 중앙대로 1001',
   'x': '129.075050185776',
   'y': '35.1797341807228'},
  {'address_name': '부산 연제구 연산동 1000',
   'category_group_code': '',
   'category_group_name': '',
   'category_name': '여행 > 공원 > 도시근린공원',
   'distance': '',
   'id': '13665317',
   'phone': '',
   'place_name': '부산광역시청 등대광장',
   'place_url': 'http://place.map.kakao.com/13665317',
   'road_address_name': '부산 연제구 중앙대로 1001',
   'x': '129.073963272098',
   'y': '35.1811910502742'},
  {'address_name': '부산 연제구 연산동 1364-1',
   'category_group_code': '',
   'category_group_name': '',
   'category_name': '가정,생활 > 문구,사무용품 > 드림디포',
   'distance': '',
   'id': '16868795',
   'phone': '051-862-0945',
   'place_name': '드림디포 부산시청점',
   'place_url': 'http://place.map.kakao.com/16868795',
   'road_address_name': '부산 연제구 중앙대로 1035',
   'x': '129.077303670691',
   'y': '35.1809895970098'}],
 'meta': {'is_end': False,
  'pageable_count': 45,
  'same_name': {'keyword': '부산광역시청', 'region': [], 'selected_region': ''},
  'total_count': 142}}

kakao 데이터에서 위도,경도, 장소이름에 대한 정보가 documents 에 저장돼 있음을 알 수 있다.

장소이름 = kakao['documents'][0]['place_name']
경도= kakao['documents'][0]['x']
위도= kakao['documents'][0]['y']
print(위도,경도,장소이름)
35.17973748292069 129.07506783124393 부산광역시청

이제 위도,경도, 장소이름을 따로 가져와서 저장하는 함수 get_kakao()를 작성해 보자.


def get_kakao(query):
    url = 'https://dapi.kakao.com/v2/local/search/keyword.json?query={}'.format(query)
    apikey = '0407a2349ecda6d17bcefa82be4efd99'
    kakao= requests.get( url, params = {'query':query}, headers={'Authorization' : 'KakaoAK ' + apikey } ).json() 

    장소이름 = kakao['documents'][0]['place_name']
    경도= kakao['documents'][0]['x']
    위도= kakao['documents'][0]['y']
    kakao = [위도,경도,장소이름]

    return kakao
get_kakao('부산광역시청')
['35.17973748292069', '129.07506783124393', '부산광역시청']

get_kakao() 함수와 사전에 크롤링한 인스타그램 위치 데이터를 바탕으로 위도경도를 추출 한다.
그리고 api를 이용할 때는 짧은 시간에 너무 많은 정보를 요구 하면 차단 당할 수 있기에 time.sleep() 함수를 이용하여 사용 시간을 조절 한다.

인스타그램_위치 = df['위치']
위치_get_kakao=[]
for 위치 in 인스타그램_위치:
    try:   
        위치_get_kakao.append(get_kakao(위치)) 
        time.sleep(0.5) 
    except:
        pass

위치_get_kakao 리스트를 데이터프레임으로 변환후 컬럼명을 수정.

위치_get_kakao=pd.DataFrame(위치_get_kakao)
위치_get_kakao.columns=['위도','경도','위치']
위치_get_kakao

위도 경도 위치
0 35.3629930520716 129.18251602124 동부산컨트리클럽
1 35.1604590898844 129.162266187153 스케줄 해운대
2 37.590448495174364 127.02876401832988 앤에이앤
3 37.590448495174364 127.02876401832988 앤에이앤
4 37.590448495174364 127.02876401832988 앤에이앤
... ... ... ...
2004 35.1585232170784 129.159854668484 해운대해수욕장
2005 35.1636479638612 129.158897240251 해운대역 부산2호선
2006 35.1531932736837 129.118976093583 광안리해수욕장
2007 37.590448495174364 127.02876401832988 앤에이앤
2008 37.590448495174364 127.02876401832988 앤에이앤

2009 rows × 3 columns

folium 으로 시각화하여 마무리 해준다.



import folium
from folium.plugins import MarkerCluster

위도_경도= []
이름= []

for i in range(len(위치_get_kakao)):
    data = 위치_get_kakao.iloc[i]  # 행 하나씩
    위도_경도.append((float(data['위도']),float(data['경도'])))    # 위도 , 경도 순으로..
    위치명.append(data['위치'])


busan =[35.1797957, 129.0727983]
busan = folium.Map(location = busan, zoom_start = 11)

marker_cluster = MarkerCluster(
    locations=위도_경도, popups=위치명,
    name='Busan',
    overlay=True,
    control=True,

)

marker_cluster.add_to(busan)
folium.LayerControl().add_to(busan)

busan.save('busan.html')

출력물을 살펴보자.
축소를 하였을 때는 근처 마커 끼리 모아서 몇개의 마커가 모여있는지 나타낸다.

확대를 해서 마커에 마우스 커서를 올리면 마커의 지역명이 나타난다.

이상으로 토이프로젝트 - 인스타그램 을 마무리 한다.

ariz1623