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” 이다.
<- "30300041" # 검색할 노선버스 번호를 빈문자로 정한다. busRtNm
4.1.2.2 운행 중인 버스의 실시간 위치 정보 조회 서비스 URL
노선정보조회 서비스 url을 입력한다.
- 기본 url : “http://openapitraffic.daejeon.go.kr/api/rest/busposinfo/getBusPosByRtid?serviceKey=”
&busRouteId=
: busRtNm
<- "http://openapitraffic.daejeon.go.kr/api/rest/busposinfo/getBusPosByRtid?serviceKey="
url <- paste0(url, API_key, "&busRouteId=", busRtNm) srch_url
4.1.2.3 실시간 위치 정보 조회
xmlParse()
함수를 이용하여 실시간 위치 정보 데이터를 다운로드하여, xmlfile
에 대입한다.
<- xmlParse(srch_url) # 해당 url에 데이터를 요구(request)하고,
xmlfile # 그 결과(response)를 xmlfile 변수에 저장한다.
# xmlRoot(xmlfile) # xmlfile 변수의 내용을 출력한다.
4.1.2.4 조회한 정보를 데이터 프레임 형태로 변환
xmlToDataFrmae()
함수를 이용하여, xmlfile
을 데이터 프레임 형태로 변환하여 dj_location
변수에 대입한다.
이제 dj_location
변수는 노선 번호가 106번인 운행 중인 버스들의 실시간 위치 정보를 담고 있다.
<- xmlToDataFrame(getNodeSet(xmlfile, "//itemList"))
dj_location 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로 이름 변경
<- as.numeric(dj_location$GPS_LONG)
gpsX <- as.numeric(dj_location$GPS_LATI)
gpsY
<- data.frame(busNo = dj_location$PLATE_NO, lon=gpsX, lat=gpsY)
bus_location 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")