본문 바로가기
데이터분석/R

[R 데이터분석 with 샤이니] 카카오맵 API로 지오 코딩하기

by 버섯도리 2022. 7. 2.

> ## 05-1 지오 코딩 준비하기

> # Step 2 : 중복된 주소 제거하기

> setwd(dirname(rstudioapi::getSourceEditorContext()$path))
> load("./04_preprocess/04_preprocess.rdata")
> apt_juso <- data.frame(apt_price$juso_jibun)
> apt_juso <- data.frame(apt_juso[!duplicated(apt_juso), ])
> head(apt_juso, 2)
              apt_juso..duplicated.apt_juso....
1       서울특별시 종로구 청운동 56-45 청운현대
2 서울특별시 종로구 사직동 9-1 광화문스페이스본
> apt_juso <- apt_juso[!duplicated(apt_juso), ]
> apt_juso <- data.frame(apt_price$juso_jibun)
> apt_juso <- data.frame(apt_juso[!duplicated(apt_juso), ])


> ## 05-2 주소를 좌표로 변환하는 지오 코딩

> # Step 1 : 지오 코딩 준비하기

> add_list <- list()
> cnt <- 0
> kakao_key <- "xxxxx"

> # Step 2 : 지오 코딩하기

> library(httr)
> library(RJSONIO)
> library(data.table)
> library(dplyr)

> for (i in 1:nrow(apt_juso)) {
+   tryCatch(
+     {
+       # 주소로 좌표값 요청
+       lon_lat <- GET(url = 'https://dapi.kakao.com/v2/local/search/address.json',
+                      query = list(query = apt_juso[i, ]),
+                      add_headers(Authorization = paste0("KakaoAK ", kakao_key)))
+       
+       coordxy <- lon_lat %>% content(as='text') %>% fromJSON()
+       cnt <- cnt + 1
+       
+       # 주소, 경도, 위도 정보를 리스트로 저장
+       add_list[[cnt]] <- data.table(apt_juso = apt_juso[i,],
+                                     coord_x = coordxy$documents[[1]]$x,
+                                     coord_y = coordxy$documents[[1]]$y)
+       
+       message <- paste0("[", i, "/", nrow(apt_juso), "] 번째 (",
+                         round(i/nrow(apt_juso)*100,2), "%) [", apt_juso[i,], "] 지오 코딩 중입니다: X = ",
+                         add_list[[cnt]]$coord_x, " / Y = ", add_list[[cnt]]$coord_y)
+       cat(message, "\n\n")
+     }, error = function(e) { cat("ERROR :", conditionMessage(e), "\n")}
+   )
+ }

...

[5711/5713] 번째 (99.96%) [서울특별시 강동구 천호동 53-6 광남벨라스2차아파트] 지오 코딩 중입니다: X = 127.138915312211 / Y = 37.542779865803 

[5712/5713] 번째 (99.98%) [서울특별시 강동구 천호동 288-29 브라운스톤암사아파트] 지오 코딩 중입니다: X = 127.128642305767 / Y = 37.5494485313012 

[5713/5713] 번째 (100%) [서울특별시 강동구 길동 361-18 청원파크빌2] 지오 코딩 중입니다: X = 127.145234516055 / Y = 37.5387542572085

> # Step 3 : 지오 코딩 결과 저장하기

> juso_geocoding <- rbindlist(add_list)
> juso_geocoding$coord_x <- as.numeric(juso_geocoding$coord_x)
> juso_geocoding$coord_y <- as.numeric(juso_geocoding$coord_y)
> juso_geocoding <- na.omit(juso_geocoding)
> dir.create("./05_geocoding")
> save(juso_geocoding, file = "./05_geocoding/05_geocoding.rdata")
> write.csv(juso_geocoding, "./05_geocoding/05_geocoding.csv")

 

 

 

 

 

 

출처 : 김철민, ⌜공공데이터로 배우는 R 데이터분석 with 샤이니⌟, 이지스퍼블리싱, 2022