본문 바로가기
Project

[카카오 지도 API] 반경 내 시설 정보 수집 with python

by skwkiix 2023. 11. 9.
728x90

이 포스팅에서는 카카오 지도 API 를 이용하여, 특정반경 내 집객시설를 수집하는 코드를 python 으로 구현한다.

 

 

1. 검색 키워드로 반경 내 집객시설  수집_예시 코드

카카오 지도 API 도메인 주소 : 'https://dapi.kakao.com'

import requests  # HTTP 요청
import pandas as pd  

# 카카오 API의 장소 검색 엔드포인트 URL
url = 'https://dapi.kakao.com/v2/local/search/keyword.json' 

params = {
    'query': '카페',  # 검색할 키워드 (예시: '카페')
    'x': 441908.750495,  # 중심점의 x 좌표
    'y': 194438.829927,  # 중심점의 y 좌표
    'radius': 200,  # 검색 반경 (미터 단위)
    'category_group_code': 'CE7'  # 카페 카테고리 코드
}

headers = {"Authorization": "KakaoAK {API_Key}"}  # API 인증을 위한 헤더

# API에 GET 요청을 보냄
response = requests.get(url, params=params, headers=headers)

# 응답 코드 확인
if response.status_code == 200:  # 요청이 성공한 경우
    data = response.json()  # JSON 형식으로 응답 데이터를 가져옴

    # 검색 결과에 'documents' 키가 있는지 확인
    if 'documents' in data:  # 검색 결과가 있는 경우
        places = data['documents']  # 장소 정보들을 가져옴
        
        # 장소 정보를 담을 리스트
        place_list = []
        
        # 각 장소 정보를 딕셔너리로 만들어 리스트에 추가
        for place in places:
            place_dict = {
                'Place Name': place.get('place_name', 'N/A'),  # 장소명
                'Address': place.get('address_name', 'N/A'),  # 주소
                'Phone': place.get('phone', 'N/A')  # 전화번호
            }
            place_list.append(place_dict)
        
        # 장소 정보를 DataFrame으로 변환
        df = pd.DataFrame(place_list)
        
        # DataFrame 출력
        print(df)
    else:
        print("No places found in the response.")  # 검색 결과가 없는 경우 메시지 출력
else:
    print("HTTP request failed with status code:", response.status_code)  # 요청 실패 시 상태 코드 출력

 

response.status_code == 200 으로 요청이 똑바로 되면, data = response.json() 그 응답을 딕셔너리로 가져온다. 

 

 


 

2. 카테고리별 반경 내 집객시설 수집_예시 코드

 
Category = ['대형마트', '편의점', '어린이집', '학교', '학원', '주차장', '주유소', '지하철역', '은행', '문화시설', '중개업소', '공공기관', '관광명소', '숙박', '음식점', '카페', '병원', '약국']
 

category_group_codes = ['MT1', 'CS2', 'PS3', 'SC4', 'AC5', 'PK6', 'OL7', 'SW8', 'BK9', 'CT1', 'AG2', 'PO3', 'AT4', 'AD5', 'FD6', 'CE7', 'HP8', 'PM9']

 

 

  • 위도 경도 좌표 데이터프레임 지정

카테고리별 집객시설 개수를 수집하기 전, 위도 경도 좌표가 포함된 데이터프레임을 불러오고, geometry(point(위도 경도)) 값을 geometry라고 선언해주었다.

df_properties = pd.DataFrame(properties)

# 데이터프레임에 기하학적인 정보 추가
df_properties['geometry'] = geometries

 

  • 메인 코드
# API 요청을 위한 함수 정의
import requests

def find_nearby_places(row, category_code):
    # 주어진 행에서 위도(latitude)와 경도(longitude) 정보 추출
    latitude = row.geometry.y
    longitude = row.geometry.x
    
    radius = 200  # 원하는 반경 설정 (미터 단위)
    
    # Kakao API를 활용하여 주변의 특정 카테고리 코드에 해당하는 장소 검색을 위한 URL 생성
    url = f"https://dapi.kakao.com/v2/local/search/category.json?category_group_code={category_code}&x={longitude}&y={latitude}&radius={radius}"
    
    # API 요청을 위한 인증 헤더 설정
    headers = {"Authorization": f"KakaoAK {api_key}"}
    
    # API에 GET 요청을 보내고 JSON 형식으로 응답을 가져옴
    response = requests.get(url, headers=headers)
    data = response.json()
    
    # 응답 데이터에서 'documents' 키에 해당하는 장소 개수를 가져옴
    place_count = len(data.get("documents", []))
    return place_count

# 데이터프레임 및 카테고리 그룹 코드 정의
category_group_codes = ['MT1', 'CS2', 'PS3', 'SC4', 'AC5', 'PK6', 'OL7', 'SW8', 'BK9', 'CT1', 'AG2', 'PO3', 'AT4', 'AD5', 'FD6', 'CE7', 'HP8', 'PM9']
api_key = ''  # 여기에 본인의 Kakao API 키를 입력해야 합니다

# 각 카테고리별로 개수를 세고 결과 데이터프레임 생성
result_df = gdf.copy()  # gdf는 기존의 지리 데이터프레임을 복사하여 사용
for category_code in category_group_codes:
    place_count_list = []
    for index, row in result_df.iterrows():
        # 각 행에 대해 find_nearby_places 함수를 사용하여 카테고리별 장소 개수를 얻어내고 리스트에 추가
        place_count = find_nearby_places(row, category_code)
        place_count_list.append(place_count)
    # 결과를 데이터프레임에 새로운 열로 추가
    result_df[f"{category_code}_개수"] = place_count_list

result_df.head()  # 결과 데이터프레임의 첫 부분을 출력

 

 

728x90