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 key는 Google 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 |
영업팀에 문의 (대량 사용 할인) |
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)
여기까지가 R의 ggmap
패키지를 활용한 지오코딩, 역지오코딩에 대한 설명이고 다음은 이 글에서 설명한 내용 외에 추가적으로 확인, 개선해야 될 부분들과 참고 문헌들입니다.
긴 글 읽어주셔서 감사합니다. 많은 도움이 되길 바라며 피드백은 항상 환영입니다.
4. 확인, 개선해야 될 부분 (Improvements)
Google Maps API key 발급 방법은?지오코딩할 경우 지번 주소와 도로명 주소 모두 동일한 결과(위경도 좌표계)가 출력되는지?Google Maps API 가격 책정 방식과 테이블은 어떻게 되어있는지?-
지오코딩, 역지오코딩에 위경도 좌표계만 활용 가능한지? 아니면 UTM 좌표계와 같이 다른 좌표계도 활용 가능한지?
-
역지오코딩 결과(주소)를 지번 혹은 도로명 주소로 고정 출력하기
-
역지오코딩 결과(주소) 영문이 아닌 한글로 출력 혹은 변환하기
5. 참고 문헌 (Reference)
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 가격 책정 기준표 추가 일부 내용 수정 |