Chapter 5 실시간 버스 위치의 시각화

이제 다운받은 노선버스의 실시간 위치 정보를 이용하여 Google 지도에 시각화한다.

즉, 구글 맵에 버스 위치를 표시해 보기로 한다.

패키지 불러오기

library(XML)
library(ggmap)
library(tidyverse)

5.1 실시간 위치를 Marker로 표시하기

5.1.1 Google API 인증

register_google(key="API Key")      # https://console.cloud.google.com 에서 확인

5.1.2 버스 위치의 중심점 찾기

data <- read_rds("data/df-location.rds")

gc <- data[, 2:3]            # lon, lat 컬럼만 추출
cen <- sapply(gc, mean)      # 차량위치의 중심점

5.1.3 구글 지도 정보 가져오기

get_googlemap() 함수를 이용하여 구글 지도 정보를 가져온다. 그 결과는 map에 대입한다.

map <- get_googlemap(center = cen, 
                     maptype = "roadmap",
                     zoom = 11, 
                     marker = gc)
## Source : https://maps.googleapis.com/maps/api/staticmap?center=37.508274,127.046774&zoom=11&size=640x640&scale=2&maptype=roadmap&markers=37.481563,127.131748%7C37.485382,127.104033%7C37.482695,127.077381%7C37.492735,127.059167%7C37.494331,127.029469%7C37.541578,127.00354%7C37.548507,126.984267%7C37.56055,126.975675%7C37.557875,126.973365%7C37.539502,127.003843%7C37.512189,127.020776%7C37.495727,127.028498%7C37.492577,127.059611%7C37.482833,127.070937%7C37.485957,127.102992%7C37.478385,127.123087&key=xxx

5.2 구글 지도 그리기

이제 버스의 위치를 구글 지도위에 marker로 표시한다.

ggmap(map)

# , extent="device")

5.3 지도에 차량번호를 포함시키기

지도 위에 현재 운행 위치에서 운행중인 차량번호를 표시해 보자.

5.3.1 데이터 세트

data 데이터 세트에 차량번호 정보가 plainNo 컬럼에 있다.

head(data)
##        plainNo      lon      lat
## 1 서울70사9585 127.1317 37.48156
## 2 서울70사9583 127.1040 37.48538
## 3 서울70사9565 127.0774 37.48269
## 4 서울70사9582 127.0592 37.49274
## 5 서울70사9580 127.0295 37.49433
## 6 서울70사9563 127.0035 37.54158

5.3.2 차량의 중심점 확인

이미 앞에서 gc 데이터 세트를 생성하여 중심점 cen을 확인한 바 있다.

gc <- data[, 2:3]            # lon, lat 컬럼만 추출
cen <- sapply(gc, mean)      # 차량위치의 중심점

5.3.3 구글 지도 정보 가져오기

이제는 마커 표기 없는 구글 지도 정보를 가져온다.

map1 <- get_googlemap(center = cen, 
                      maptype="roadmap", 
                      zoom=12)
## Source : https://maps.googleapis.com/maps/api/staticmap?center=37.508274,127.046774&zoom=12&size=640x640&scale=2&maptype=roadmap&key=xxx

5.3.4 지도위에 버스 번호 표시하기

geom_text() 함수를 이용하여 data$plainNO 를 label 인수의 값으로 입력해 준다.

ggmap(map1, extent="device") +
     geom_text(data = data,             # 분석용 데이터 세트
               aes(x = lon, y = lat),   # 경도, 위도 컬럼
               size = 3,                # 글자 크기
               label = data$plainNo)         # 운행중인 버스번호 출력

5.3.5 운행 지점을 점으로 찍기

ggmap(map1, extent="device") +
     geom_text(data = data,              # 분석용 데이터 세트
               aes(x = lon, y = lat),    # 경도, 위도 등의 위치
               size = 3,                 # 글자 크기
               label = data$plainNo) +
     geom_point(data = data,             # 분석용 데이터 세트
                aes(x = lon, y = lat),   # 경도, 위도 등의 위치
                size = 2,                # 점의 크기
                colour='blue')        # 점의 색깔