R) 시각화 - Google 지도

R) 시각화 - Google 지도

R에서 Google Map API를 활용하여 Google Map을 사용하는 방법을 알아본다.

개요

Google 지도와 ggplot2 패키지를 사용하여 특정 위치의 지도를 불러오는 방법과 지도상에 별도 표기하는 방법을 알아본다.

Google Map API는 GCP(Google Cloud Platform) 서비스 중 하나이다. 해당 서비스를 이용하기 위한 API 키 발급은 GCP - 지오코딩(geocoding)에서 다루고 있으니 해당 포스팅을 참고하여 API 키를 발급받은 후 본 포스팅의 코드를 실습하도록 한다.

준비

GCP에서 생성한 Google Map 관련 프로젝트로 가서 API 키(아래 API 키는 존재하지 않는 키 이다.)를 가져와 별도의 객체에 다음과 같이 등록한다. 그리고 시각화를 위한 ggmap 패키지를 불러온다. 추가로 패키지의 각종 함수를 사용하기 위해서 register_google() 함수에 발급받은 API 키를 입력하여 실행하도록 하자.

1
2
3
4
mykey = "AIzaSyBpkJubAqtwhJx0YRpDXEVR8Y9puaE6zf8" # 본인의 API 키로 바꿔주세요.

library("ggmap")
register_google(key = mykey)

Google 지도를 불러오는 함수인 get_googlemap() 함수의 도움말에 있는 예제를 실행할 때 다음과 같은 에러가 발생할 수 있다.

1
2
3
gc <- geocode("waco, texas", source = "google")
center <- as.numeric(gc)
ggmap(get_googlemap(center = center, color = "bw", scale = 2), extent = "device")
Source : https://maps.googleapis.com/maps/api/staticmap?center=31.549333,-97.14667&zoom=15&size=320x320&scale=2&maptype=roadmap&key=xxx
Error in aperm.default(map, c(2, 1, 3)) :
invalid first argument, must be an array
추가정보: 경고메시지(들):
In get_googlemap(center = as.numeric(gc[1, 1:2]), maptype = "roadmap", :
HTTP 400 Bad Request

해당 에러는 발급받은 API 키가 지도 시각화 관련 권한을 받지 못했기 때문에 발생했을 가능성이 매우 높다. 이 때는 신청한 Google Map API에 다음과 같은 목록이 있는지 확인해보자.
GCP API 키 제한 목록

기본적으로는 키 제한이 없지만 다음 API 목록이 선택지에 있는지 잘 확인해야 한다.
● Maps Static API
● Geocoding API
● Geolocation API
● Maps Embed API
GCP API 키 선택 목록

사용 API 추가는 API 신청 버튼을 찾아서 추가하도록 하자.
GCP API 키 신청 버튼

시작하기

Google Map 시각화는 보통 전국 지도를 그리지 않고 특정 위치를 중심으로 그 근방 지도를 시각화 한다. 그래서 지오코딩(Geocoding) 기능을 같이 사용하는 경우가 대부분이다.

1
2
3
4
5
gc = geocode(enc2utf8("2호선 신림역"))
map = get_googlemap(center = as.numeric(gc),
maptype = "roadmap",
zoom = 15,
size = c(320, 320))

설정

get_googlemap() 함수의 주요 인자는 다음과 같다.

● center: 지도의 중심 위경도 좌표
● maptype: 지도 종류(terrain, satellite, roadmap, hybrid)
● zoom: 확대 축소
● size: 지도 크기(최대 640x640)
● scale: 지도 크기(2 == 1280x1280, 4 = 640x640)
● markers: 지도상에 표기할 위치(위경도 정보가 담긴 데이터프레임 입력)
● color: 색상(bw == 흑백)

zoom

지도의 확대 축소를 설정할 수 있으며 예제 코드와 결과는 다음과 같다.

1
2
3
4
5
6
gc = geocode(enc2utf8("2호선 신림역"))
map = get_googlemap(center = as.numeric(gc),
maptype = "roadmap",
zoom = 17,
size = c(320, 320))
ggmap(map)

zoom 17
zoom 15
zoom 13

marker

기존에 구한 신림역 위경도 좌표를 약간 조정한 두 좌표를 rbind() 함수로 묶어서 “markers” 인자에 할당한 결과는 다음과 같다.

1
2
3
4
5
6
7
map = get_googlemap(center = as.numeric(gc[1, 1:2]),
maptype = "roadmap",
zoom = 16,
size = c(320, 320),
markers = rbind(gc[1, 1:2] + 0.0015,
gc[1, 1:2] - 0.0015))
ggmap(map)

markers

응용

Google 지도 위에 추가 데이터를 시각화 하기 위해서는 geom_xx() 함수를 사용하면 된다. 다음의 예시에는 “mapping” 인자에 할당되는 aes() 함수를 사용하지 않았으나, 제대로 하려면 정확한 문법을 사용해야 한다. ggplot2 패키지 기반이기 때문에 역시나 theme_void() 같은 함수도 사용할 수 있다.

1
2
3
4
5
6
7
ggmap(map) + 
geom_point(data = rbind(gc[1, 1:2] + 0.004,
gc[1, 1:2] - 0.004),
size = 20,
color = "#FF0000",
alpha = 0.4) +
theme_void()

markers + 추가 데이터

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×