주소를 지도에 올릴 수 있도록 위경도 변환한다. 구글 공간정보서비스가 위세를 떨치는 기간에 다음 지도 API가 진화를 하여 kakaomap Maps API로 사용법과 사용량 등 개발자 관점에서 나름 쓸만한 형태로 개선되었다.
C:\Program Files\R\R-3.5.2\etc 디렉토리 Rprofile.site 파일에 카카오 개발자센터 앱개발에 사용할 API 키를 KAKAO_MAP_API_KEY 변수에 저장시킨다. 재미있는 것은 Authorization에서 "KakaoAK "를 꼭 앞에 붙여야함으로 paste0() 함수로 결합시켜 전달한다. 혹은 usethis 팩키지를 사용해서 edit_r_environ() 명령어를 사용해서 .Renviron 파일에 KAKAO_MAP_API_KEY값을 설정하여 사용하는 것도 좋다.
카카오 개발자센터 로컬 → REST API 문서에 지오코딩하는 자세한 사항이 나와있다. 한가지 사례로 삼정KPMG주소를 지도위에 표시하는 것을 목표로 먼저 삼정KPMG 주소를 던져서 위도경도를 받아내는 헬로월드 코드를 작성해본다.
코드
library(httr)library(tidyverse)library(jsonlite)# usethis::edit_r_environ()# 요청 URL 및 파라미터 설정base_url<-"https://dapi.kakao.com/v2/local/search/address.json"params<-list(query ='서울특별시 강남구 역삼동 737')# 삼정KPMG 주소# GET 요청 실행response<-GET(base_url, add_headers(Authorization =paste("KakaoAK", Sys.getenv("KAKAO_MAP_API_KEY"))), query =params)# 응답 확인print(content(response, "text"))#> [1] "{\"documents\":[{\"address\":{\"address_name\":\"서울 강남구 역삼동 737\",\"b_code\":\"1168010100\",\"h_code\":\"1168064000\",\"main_address_no\":\"737\",\"mountain_yn\":\"N\",\"region_1depth_name\":\"서울\",\"region_2depth_name\":\"강남구\",\"region_3depth_h_name\":\"역삼1동\",\"region_3depth_name\":\"역삼동\",\"sub_address_no\":\"\",\"x\":\"127.036628730251\",\"y\":\"37.4998101243238\"},\"address_name\":\"서울 강남구 역삼동 737\",\"address_type\":\"REGION_ADDR\",\"road_address\":{\"address_name\":\"서울 강남구 테헤란로 152\",\"building_name\":\"강남파이낸스센터\",\"main_building_no\":\"152\",\"region_1depth_name\":\"서울\",\"region_2depth_name\":\"강남구\",\"region_3depth_name\":\"역삼동\",\"road_name\":\"테헤란로\",\"sub_building_no\":\"\",\"underground_yn\":\"N\",\"x\":\"127.036508620542\",\"y\":\"37.5000242405515\",\"zone_no\":\"06236\"},\"x\":\"127.036628730251\",\"y\":\"37.4998101243238\"}],\"meta\":{\"is_end\":true,\"pageable_count\":1,\"total_count\":1}}"# KPMG 지리정보 데이터프레임kpmg_list<-response%>%content(as ='text')%>%fromJSON()## 도로명주소kpmg_list$documents$road_address%>%select(address_name, building_name, x,y)#> address_name building_name x y#> 1 서울 강남구 테헤란로 152 강남파이낸스센터 127.036508620542 37.5000242405515## 지명주소kpmg_list$documents$address%>%select(address_name, x,y)#> address_name x y#> 1 서울 강남구 역삼동 737 127.036628730251 37.4998101243238
2.2 함수 제작
코드
get_lnglat<-function(address='서울특별시 강남구 역삼동 737'){base_url<-"https://dapi.kakao.com/v2/local/search/address.json"params<-list(query =address)# 삼정KPMG 주소# GET 요청 실행response<-GET(base_url, add_headers(Authorization =paste("KakaoAK", Sys.getenv("KAKAO_MAP_API_KEY"))), query =params)# KPMG 지리정보 데이터프레임json_list<-response%>%content(as ='text')%>%fromJSON()## 위경도 주소return(json_list$documents$address%>%select(x,y)%>%unlist)}get_lnglat("경기도 가평군 가평읍 대곡리 213-5")#> x y #> "127.516690566855" "37.8236644879834"
2.3 충전소 지오코딩
get_lnglat() 함수는 모든 것이 예정된 방식으로 동작하는 것을 가정한다. 따라서, 가정 중 하나라도 충족하지 않는 경우 오류가 나서 반복 작업이 중단된다.
Error in `mutate()`:ℹ In argument: `data = map(주소, get_lnglat)`.Caused by error in `map()`:ℹ In index: 248.Caused by error in `UseMethod()`:! no applicable method for 'select' applied to an object of class "NULL"
ggplot()+geom_sf(data =sido_map, aes(geometry =geometry), fill ="transparent", color ="blue")+geom_sf(data =charger_sf, aes(geometry =geometry), color ="black", size =0.1)