본문 바로가기
카테고리 없음

R ggmap으로 지오코딩, 역지오코딩하기

by 레드홀스 2020. 12. 28.

R ggmap으로 지오코딩, 역지오코딩하기

 

개요

본 글은 R의 ggmap패키지를 활용하여 지오코딩, 역지오코딩 하는 방법을 설명한 내용을 담고있으며, R mark down을 활용하여 작성했습니다.
카카오 API 등 다른 방법을 활용하는 방법은 해당 글에 없으니 참고하시기 바랍니다.

본 문서 작성에 활용한 R, RStudio, ggmap 패키지의 버전은 각각 다음과 같습니다.

구분 버전 (version)
R 4.0.2
RStudio 1.3.1073
ggmap 3.0.0

먼저 지오코딩과 역지오코딩의 기본개념은 다음과 같습니다.

구분 설명
지오코딩 (geocoding) 주소를 활용하여 위경도 좌표를 추출하는 것
역지오코딩 (reverse geocoding) 위경도 좌표를 활용하여 주소를 추출하는 것

그럼 본격적으로 ggmap 패키지를 활용한 지오코딩, 역지오코딩 하는 방법에 대해 서술하도록 하겠습니다.

 

1. 환경 설정 (Environment setting)

 

1 - 1. Google Maps API key 발급

R에서 ggmap패키지를 활용하기 위해서는 구글 지도 API (Google Maps API) 인증키(key)가 필요합니다.
Google Maps API keyGoogle Cloud Platform - Google Maps Platform에 접속하시면 발급받으실 수 있습니다.

 

위 링크에 접속하신 뒤 서비스 약관 동의 후 사용자 인증 정보 클릭하고 사용자 인증 정보 만들기를 클릭하시면 됩니다.
(신용 카드 등록 등 결제 계정 설정의 과정이 필요합니다.)
참고로 Google Maps API 사용량에 따라 과금이 될 수 있으니 Google Maps Platform - 가격 책정을 미리 읽어보시기 바랍니다.

 

V1.0 문서 작성일(2020-12-27 일요일) 기준 Google Maps Platform - Geocoding API 가격 책정 기준은 아래와 같습니다.
(참고로 직접 코드 테스트하면서 API 요청 횟수 확인 결과 지오코딩, 역지오코딩 관측치 1건당 1회입니다.)

API 구분 월간 사용량
0~40,000회
월간 사용량
40,001~100,000회
월간 사용량
100,001~500,000회
월간 사용량
500,001회 이상
Geocoding 무료 (1,000회당)
$5.00
(1,000회당)
$4.00
영업팀에 문의
(대량 사용 할인)

 

Google Maps Platform 접속 화면

Google Maps Platform 접속 화면

 

API 키가 정상적으로 생성되었을 경우 아래와 같은 창이 뜹니다.
※ 위에서 말했다시피 사용량에 따라 과금이 될 수 있으니 개인 API 키는 절대로 유출하시면 안 됩니다.

API 키 발급 결과창

API 키 발급 결과창

 

1 - 2. 패키지 불러오기, API 키 등록

위 과정들을 통해 API 키를 발급받으셨다면, RStudio로 돌아오셔서 ggmap 패키지를 설치, 불러온 뒤 키를 RStudio 환경에 등록하시면 됩니다.

 

ggmap 패키지 설치 및 불러오기

# 패키지는 최초 사용시 혹은 업데이트 할 경우에만 설치하면 됨
# install.packages("ggmap")

# 설치한 ggmap 패키지 불러오기 (장착이라고도 함)
library(ggmap)

 

API 키 등록

ggmap::register_google(key = '본인 API 키')

 


 

2. 지오코딩 (Geocoding)

지오코딩은 위에서 언급한 것처럼 주소를 입력(input)하여 좌표를 얻는(output) 것 입니다.

 

2 - 1. 단일 주소 지오코딩

대한민국의 수도인 서울을 입력할 경우 어떤 결과가 나오는지 아래 코드를 통해 확인하실 수 있습니다.
(base 패키지의 enc2utf8() 함수를 활용해 인코딩(encoding)을 UTF-8로 변환해줘야 합니다.)

ggmap::geocode(location = base::enc2utf8("서울"), source = 'google')
## # A tibble: 1 x 2
##     lon   lat
##   <dbl> <dbl>
## 1  127.  37.6

 

서울 외에 서울시, 서울특별시로 입력한 경우에도 동일한 위경도 좌표값을 출력합니다.

ggmap::geocode(location = base::enc2utf8("서울시"), source = 'google')
## # A tibble: 1 x 2
##     lon   lat
##   <dbl> <dbl>
## 1  127.  37.6
ggmap::geocode(location = base::enc2utf8("서울특별시"), source = 'google')
## # A tibble: 1 x 2
##     lon   lat
##   <dbl> <dbl>
## 1  127.  37.6

 

위경도 좌표계뿐만 아니라 주소를 같이 출력하고 싶은 경우 output이라는 argument를 latlona로 입력하시면 됩니다.

ggmap::geocode(location = base::enc2utf8("서울"), source = 'google', output = "latlona")
## # A tibble: 1 x 3
##     lon   lat address           
##   <dbl> <dbl> <chr>             
## 1  127.  37.6 seoul, south korea

 

위경도 좌표계에 한글 주소를 출력하고 싶은 경우 location argument에서 주소뒤에 &language=ko를 붙이시면 됩니다.

ggmap::geocode(location = base::enc2utf8("서울&language=ko"), source = 'google', output = "latlona")
## # A tibble: 1 x 3
##     lon   lat address            
##   <dbl> <dbl> <chr>              
## 1  127.  37.6 대한민국 서울특별시

 

2 - 2. 데이터 프레임 지오코딩

데이터 프레임(여러 개의 주소, 관측치)을 한 번에 지오코딩하는 방법(코드)을 설명 드리겠습니다.
(여기서는 펜타시스템 테크놀러지 본사와 사업장 중 하나인 서라벌 빌딩의 지번주소 및 도로명 주소를 활용했습니다.)

# 입력 데이터 생성 
geocode_input <- data.frame("bld_nm"   = c("여의도본사", "여의도본사", "서라벌빌딩", "서라벌빌딩"),
                            "addr_cat" = c("지번주소", "도로명주소", "지번주소", "도로명주소"),
                            "addr"     = c("서울 영등포구 여의도동 25-11", "서울 영등포구 국제금융로2길 25", 
                                           "서울 종로구 내자동 198", "서울 종로구 사직로8길 21-2"))

# 입력 데이터 확인 
DT::datatable(geocode_input)
 

아래 코드를 실행하면 지오코딩이 실행되고 다음과 같이 위경도 좌표계가 생성 됩니다.

# 인코딩(encoding) 변경
geocode_input$addr <- enc2utf8(geocode_input$addr)

# 지오코딩 : 위경도 좌표계만 출력
geocode_output <- ggmap::mutate_geocode(data = geocode_input, location = addr, source = 'google')

# 결과 확인 
DT::datatable(geocode_output)
 

 

3. 역지오코딩 (Reverse geocoding)

역지오코딩은 말그대로 지오코딩의 반대 즉, 위경도 좌표를 입력(input)하여 주소를 얻는(output) 것 입니다.

 

3 - 1. 단일 좌표 역지오코딩

펜타시스템 테크놀러지 여의도 본사 위경도 좌표계를 예시로 보여드리겠습니다.

ggmap::revgeocode(c(lon = 126.9254313, lat = 37.5234532))
## [1] "25-11 Yeoui-dong, Yeongdeungpo-gu, Seoul, South Korea"

 

※ 역지오코딩의 경우 아쉽게도 결과값(주소)을 한글로 출력하는 방법을 아직 찾지 못했습니다.
보완 방법을 저도 찾아보겠지만 혹시나 이 글을 읽으신 분들 중 아시는 분들께서는 댓글이나 연락주시면 감사하겠습니다.

 

3 - 2. 데이터 프레임 역지오코딩

위에서 지오코딩을 보여드린 것과 유사하게 데이터 프레임(여러 개의 좌표, 관측치)을 역지오코딩 하는 방법입니다.
펜타시스템 테크놀러지 여의도 본사와 서라벌 빌딩의 위경도 좌표계를 예시로 활용했습니다.

# 역지오코딩 할 데이터 프레임 생성
rev_geocode_input <- data.frame("bld_nm" = c("여의도본사", "서라벌빌딩"),
                                "lon"    = c(126.9254, 126.9711),
                                "lat"    = c(37.52345, 37.57465))

# 데이터 확인 
DT::datatable(rev_geocode_input)
 

아래 코드를 실행하면 역지오코딩이 실행되고 다음과 같이 주소(address)가 생성 됩니다.

# 역지오코딩 
address <- do.call(rbind, lapply(1:nrow(rev_geocode_input),
                                 function(i)ggmap::revgeocode(as.numeric(rev_geocode_input[i, c("lon", "lat")]), output = "address")))

# 기존 데이터와 역지오코딩 결과 데이터 결합 
rev_geocode_output <- cbind(rev_geocode_input, address)

# 최종 결과 데이터 확인 
DT::datatable(rev_geocode_output)
 

여기까지가 Rggmap패키지를 활용한 지오코딩, 역지오코딩에 대한 설명이고 다음은 이 글에서 설명한 내용 외에 추가적으로 확인, 개선해야 될 부분들과 참고 문헌들입니다.

 

긴 글 읽어주셔서 감사합니다. 많은 도움이 되길 바라며 피드백은 항상 환영입니다.

 


 

4. 확인, 개선해야 될 부분 (Improvements)

 

  • Google Maps API key 발급 방법은?
  • 지오코딩할 경우 지번 주소와 도로명 주소 모두 동일한 결과(위경도 좌표계)가 출력되는지?
  • Google Maps API 가격 책정 방식과 테이블은 어떻게 되어있는지?
  • 지오코딩, 역지오코딩에 위경도 좌표계만 활용 가능한지? 아니면 UTM 좌표계와 같이 다른 좌표계도 활용 가능한지?

  • 역지오코딩 결과(주소)를 지번 혹은 도로명 주소로 고정 출력하기

  • 역지오코딩 결과(주소) 영문이 아닌 한글로 출력 혹은 변환하기

 


 

6. 글 개정 내역 (Revision history)

회사 팀원들과 공유 및 블로그에 포스팅 시작한 버전은 1.0이며 최초 작성부터 최근까지 각 버전별 개정 내역은 다음과 같습니다.

 

버전 (version) 작성일 개정 내역
V0.3 2020-12-23 최초 작성
V0.6 2020-12-26 지오코딩 일부 내용 수정 및 추가
Google Maps API key 내용 추가
V1.0 2020-12-28 역지오코딩 내용 추가
팀원들과 공유 및 블로그 포스팅
V1.2 2020-12-29 Google Maps API 가격 책정 기준표 추가
일부 내용 수정