데이터 갖고 놀기/실전 전투 R

API R로 여행 계획 짜기 (with daum kakao)

고물상자 2020. 2. 14. 14:10

여행 계획을 짜다보면 좋은 툴들이 많다. 효율적인 동선을 짜기 위한 여러 어플리케이션도 있고, 간단하게는 google map을 이용해서 동선을 짜기도 한다. 

이번에는 카카오 개발자센터에서 지원하는 REST API 기능을 이용해서 여행지도를 그려보려고 한다. 


예전에 공공데이터 open API를 사용하는 포스팅이 꾸준히 찾는 걸 보면 많은 사람들이 R에서 API를 사용하는 것을 원하는 것 같다. 

2017/10/26 - [데이터 갖고 놀기/공공데이터 갖고 놀기] - 공공데이터 open api _ R

 

공공데이터 open api _ R

공공데이터 open api 듣기는 많이 들었는데... 실제로는 api 호출법을 몰라서 어떻게 하는것인지 인터넷을 한참 찾아봤다... 다들 api를 호출해서 xml 형태를 data.frame으로 바꾸고 csv로 저장해서.... 비전공자..

poiopzxcv.tistory.com

그래서 이번에는 다음 카카오의 api를 이용해서 R에서 여행 방문지에 대해 정리하는 것을 해보자. 

먼저 필요 패키지는 아래와 같다. 사실 아래 패키지는 API 를 사용할때 묻지 않고 일단 불러오는 패키지로 어느부분에서 그냥 쓰이기때문에 항상 불러놓고 시작한다. 

library(httr)
library(stringr)
library(XML)
library(data.table)
library(RCurl)

 

 

그리고 카카오 key를 불러들이고 url을 설정한다. 

kakao_key="카카오키"
url=c("https://dapi.kakao.com/v2/local/search/keyword.json")
query=URLencode(iconv("?query=상호명", to="UTF-8)

kakao_key 는 카카오 개발자 센터에서 발급받은 api 키를 입력한다. 
그리고 url은 검색 방법마다 다르긴 한데, 카카오에서는 총 6개의 검색방법을 제안하고 있다. 

{format}은 나는 JSON으로 받을 것이라서 json을 입력 

그리고 query부분은 한글을 그대로 쓰면, 받아들이지 못하기 때문에 UTF-8로 코딩하여 입력을 해준다. 

res=GET(str_c(url, query),
		add_headers(""Authorization"=str_c("KakaoAK ", kakao_key))
        )
result=content(res)
str(result)

###########
List of 2
 $ documents:List of 1
  ..$ :List of 12
  .. ..$ address_name       : chr "제주특별자치도 제주시 애월읍 봉성리 3138"
  .. ..$ category_group_code: chr "CE7"
  .. ..$ category_group_name: chr "카페"
  .. ..$ category_name      : chr "음식점 > 카페"
  .. ..$ distance           : chr ""
  .. ..$ id                 : chr "310705633"
  .. ..$ phone              : chr ""
  .. ..$ place_name         : chr "영국찻집"
  .. ..$ place_url          : chr "http://place.map.kakao.com/310705633"
  .. ..$ road_address_name  : chr "제주특별자치도 제주시 애월읍 녹근로 19-15"
  .. ..$ x                  : chr "126.314112546652"
  .. ..$ y                  : chr "33.4172313997298"
 $ meta     :List of 4
  ..$ is_end        : logi TRUE
  ..$ pageable_count: int 1
  ..$ same_name     :List of 3
  .. ..$ keyword        : chr "영국찻집"
  .. ..$ region         : list()
  .. ..$ selected_region: chr ""
  ..$ total_count   : int 1

그리고 GET 함수를 이용해서 요청을 하고, 해당 결과를 content(res)를 해서 결과를 보면 최종 결과가 나온다. 
이걸 root 형식이나 뭐 이런걸로 바꾸고 싶은데... 마땅히 생각은 안나고... 단순하게 data.table을 짜본다. 

map=data.table(category=result[[1]][[1]][3],
               name=result[[1]][[1]][8],
               add=result[[1]][[1]][1],
               info=result[[1]][[1]][9],
               lon=result[[1]][[1]][11],
               lat=result[[1]][[1]][12]
               )

이렇게 되면 map이라는 data.table안에 영국찻집의 이름, 카테고리, 주소, URL, 위도와 경도가 표시 된다. 

Plan. 

1. csv파일에 갈 곳을 정렬 해 놓고 코드를 실행시켰을때, 한개의 data.table안에 모든 인폼이 들어가게 한다. (반복문 필요)

2. 그리고, 지도를 불려들어 그 위에 갈 곳을 점과 label로 표시한다. 

3. 샘플을 위해 영국찻집이라는 단1개의 상호를 쓰는 카페를 이용했는데, 실제로는 앵간한 상호들 심지어 ... 지점 인 곳까지 모두 표기 되는데 이를 정리 하는 방법을 고민해보자.. (사실상 이게 메인)