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
'Project' 카테고리의 다른 글
| 서울시 빅데이터 캠퍼스 데이터 분석 사례(수상작) 크롤링 (1) | 2023.10.03 |
|---|