Chapter 4 노선 버스의 실시간 위치 확인

data.go.kr의 Open API 활용 방법을 학습하기 위해, 대전광역시에서 운행중인 버스의 실시간 위치 정보 조회 방법을 알아보기로 한다.

(OpenAPI활용가이드_대전광역시_버스정보시스템_v1.0.docx 참고)

패키지 불러오기

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

4.1 특정 노선의 실시간 위치

먼저 Open API를 사용하기 위해 data.go.kr에서 발급받은 API Key를 인증받는다.

4.1.1 API Key 인증받기

API_key <- "XNamCEPA1y........w2oz2Hqld26g%3D%3D"               
# data.go.kr에서 발급받은 API_key 입력

4.1.2 실시간 버스 위치 정보 조회

(OpenAPI활용가이드_대전광역시_버스정보시스템_v1.0.docx P. 23 ~ 26. 참고)

4.1.2.1 조회할 노선 ID

노선번호 106번인 버스의 노선 ID는 bus_ID에 저장되어 있으며 “30300041” 이다.

busRtNm <- "30300041"                     # 검색할 노선버스 번호를 빈문자로 정한다. 

4.1.2.2 운행 중인 버스의 실시간 위치 정보 조회 서비스 URL

노선정보조회 서비스 url을 입력한다.

url <- "http://openapitraffic.daejeon.go.kr/api/rest/busposinfo/getBusPosByRtid?serviceKey="
srch_url <- paste0(url, API_key, "&busRouteId=", busRtNm)

4.1.2.3 실시간 위치 정보 조회

xmlParse() 함수를 이용하여 실시간 위치 정보 데이터를 다운로드하여, xmlfile에 대입한다.

xmlfile <- xmlParse(srch_url)      # 해당 url에 데이터를 요구(request)하고, 
                                   # 그 결과(response)를 xmlfile 변수에 저장한다.
# xmlRoot(xmlfile)                 # xmlfile 변수의 내용을 출력한다. 

4.1.2.4 조회한 정보를 데이터 프레임 형태로 변환

xmlToDataFrmae() 함수를 이용하여, xmlfile을 데이터 프레임 형태로 변환하여 dj_location 변수에 대입한다.

이제 dj_location 변수는 노선 번호가 106번인 운행 중인 버스들의 실시간 위치 정보를 담고 있다.

dj_location <- xmlToDataFrame(getNodeSet(xmlfile, "//itemList"))
str(dj_location)
## 'data.frame':    12 obs. of  12 variables:
##  $ ARR_TIME   : chr  "20201206211214" "20201206211224" "20201206211151" "20201206211211" ...
##  $ BUS_NODE_ID: chr  "8002648" "8001801" "8007325" "8005990" ...
##  $ BUS_STOP_ID: chr  "20520" "51580" "35300" "45500" ...
##  $ DIR        : chr  "0" "0" "0" "0" ...
##  $ EVT_CD     : chr  "1" "1" "1" "1" ...
##  $ GPS_LATI   : chr  "36.339042" "36.359366" "36.358659" "36.344763" ...
##  $ GPS_LONG   : chr  "127.41282" "127.449027" "127.360578" "127.340203" ...
##  $ PLATE_NO   : chr  "대전75자3309" "대전75자3311" "대전75자3327" "대전75자3316" ...
##  $ ROUTE_CD   : chr  "30300041" "30300041" "30300041" "30300041" ...
##  $ STRE_DT    : chr  "20201206211217" "20201206211226" "20201206211154" "20201206211211" ...
##  $ TOTAL_DIST : chr  "12147" "19335" "5510" "2026" ...
##  $ ud_type    : chr  "0" "0" "0" "0" ...
  • 30300041 노선 버스들의 실시간 위치 정보를 보여 준다. 현재 13대의 버스가 운행 중이다.
  • 컬럼의 갯수는 12개 : 이들에 대한 자세한 내용은 “(OpenAPI활용가이드_대전광역시_버스정보시스템_v1.0.docx P. 23 ~ 26. 참고)”

4.1.2.5 분석용 데이터 세트 생성

dj_location 데이터 세트의 PLATE_NO(버스차량 번호), GPS_LATI(위도), GPS_LONG(경도) 컬럼을 선택하여 다음과 같이 변환시켜 bus_location 데이터 세트를 생성한다.

  • PLATE_NO : 운행 중인 자동차 번호판 -> busNo
  • GPS_LAT1 -> 숫자형 변환 -> gpsY로 이름 변경
  • GPS_LONG -> 숫자형 변환 -> gpsX로 이름 변경
gpsX <- as.numeric(dj_location$GPS_LONG)
gpsY <- as.numeric(dj_location$GPS_LATI)

bus_location <- data.frame(busNo = dj_location$PLATE_NO, lon=gpsX, lat=gpsY)
str(bus_location)
## 'data.frame':    12 obs. of  3 variables:
##  $ busNo: chr  "대전75자3309" "대전75자3311" "대전75자3327" "대전75자3316" ...
##  $ lon  : num  127 127 127 127 127 ...
##  $ lat  : num  36.3 36.4 36.4 36.3 36.3 ...
  • 현재 12대의 버스가 운행 중임을 알 수 있다.

4.1.2.6 데이터 세트 저장하기

write_rds(bus_location, "data/bus_location.rds")