Chapter 2 대전광역시 버스 노선 정류소 정보 조회

data.go.kr의 Open API 활용 방법을 학습하기 위해, 현재 대전광역시 운행중인 106번 버스의 버스 노선별 정류소 조회에 대한 정보 조회 방법을 예로 들어본다.

버스 노선별 정류소를 구글 지도에 시각화해 보기로 한다

패키지 불러오기

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

2.1 노선별 정류소 정보 확인

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

2.1.1 API Key 인증받기

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

2.1.2 노선별 정류소 목록 조회하기

2.1.2.1 노선 ID 확인

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

busRouteId <- "30300041"

2.1.2.2 노선별 경유 정류소 정보 조회 서비스 URL.

노선별 경유 정류소 조회 서비스를 이용하여, 노선ID에 해당하는 경유 정류소 목록을 조회한다

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

2.1.2.3 노선별 경유 정류소 정보 조회

xmlParse() 함수를 이용하여 노선별 정류소 정보를 다운로드하여, xmlfile에 대입한다.

xmlfile <- xmlParse(srch_url)
# xmlRoot(xmefile)

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

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

이제 dj_station 변수는 bus_ID에 수록된 노선이 운행하는 정류소 정보를 담고 있다.

dj_station <- xmlToDataFrame(getNodeSet(xmlfile, "//itemList"))
str(dj_station)
## 'data.frame':    83 obs. of  12 variables:
##  $ BUSSTOP_ENG_NM: chr  "Mokwon University Front Gate" "Heungdo Elementary School" "Humansia Apts. 10" "Treefullcity Apts.9" ...
##  $ BUSSTOP_NM    : chr  "목원대학교" "흥도초등학교" "도안고등학교" "트리풀시티9단지" ...
##  $ BUSSTOP_SEQ   : chr  "1" "2" "3" "4" ...
##  $ BUSSTOP_TP    : chr  "1" " " " " " " ...
##  $ BUS_NODE_ID   : chr  "8001641" "8070030" "8005991" "8003100" ...
##  $ BUS_STOP_ID   : chr  "33230" "41810" "45520" "45890" ...
##  $ GPS_LATI      : chr  "36.329674" "36.333813" "36.33707" "36.341488" ...
##  $ GPS_LONG      : chr  "127.33825" "127.338264" "127.33825" "127.33867" ...
##  $ ROAD_NM       : chr  "도안동로" " " " " " " ...
##  $ ROAD_NM_ADDR  : chr  " " " " " " " " ...
##  $ ROUTE_CD      : chr  "30300041" "30300041" "30300041" "30300041" ...
##  $ TOTAL_DIST    : chr  "105" "509" "871" "1589" ...
  • bus_ID 노선의 정류소 정보가 83개임을 확인할 수 있다.
  • 컬럼의 갯수는 12개 : 이들에 대한 자세한 내용은 “(OpenAPI활용가이드_대전광역시_버스정보시스템_v1.0.docx, pp. 5~8 참고).”

2.1.2.5 분석용 데이터 세트의 생성

dj_station 데이터 세트의 BUSSTOP_NM(정류소 이름), GPS_LATI(위도), GPS_LONG(경도) 컬럼을 선택하여 다음과 같이 변환시켜 bus_station 데이터 세트를 생성한다.

  • BUSSTOP_NM -> stationNm 으로 이름 변경
  • GPS_LAT1 -> 숫자형 변환 -> gpsY로 이름 변경
  • GPS_LONG -> 숫자형 변환 -> gpsX로 이름 변경
gpsX <- as.numeric(dj_station$GPS_LONG)
gpsY <- as.numeric(dj_station$GPS_LATI)

bus_station <- data.frame(stationNm = dj_station$BUSSTOP_NM, lon=gpsX, lat=gpsY)
str(bus_station)
## 'data.frame':    83 obs. of  3 variables:
##  $ stationNm: chr  "목원대학교" "흥도초등학교" "도안고등학교" "트리풀시티9단지" ...
##  $ lon      : num  127 127 127 127 127 ...
##  $ lat      : num  36.3 36.3 36.3 36.3 36.3 ...

2.1.2.6 데이터 세트 저장하기

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