Chapter 2 버스 노선의 정류소 정보 조회

다운받은 버스 노선의 노선 ID를 이용하여 Google 지도에 버스 노선의 경로를 시각화한다.

즉, 구글 맵에 버스 노선의 정류장들을 선으로 연결해서 표시해 보기로 한다.

패키지 불러오기

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

2.1 노선별 정류소 정보 다운로드 하기

(노선정보조회 서비스 Open API 활용가이드 P. 10, (3) getBusRouteList 상세기능 명세)

402번 버스의 노선 ID를 확인하였다.

버스 노선의 정류장을 선으로 연결하기 위헤 특정 노선을 선택하고,

그 노선의 정류장 이름과 위치 정보를 확인한다.

2.1.1 API Key 인증받기

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

2.1.2 정류소 정보 조회

2.1.2.1 노선 ID 확인

노선번호 402번 버스의 노선 ID는 busID에 저장되어 있다.

busRouteId <- busID

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

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

(노선정보조회 서비스 Open API 활용가이드 P. 13, (4) getStaionsByRouteList 상세기능 명세 참고)

서비스 url을 다음과 같이 설정하고, srch_url 변수에 대입한다.

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

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

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

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

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

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

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

df_path <- xmlToDataFrame(getNodeSet(xmlfile, "//itemList"))
str(df_path)
## 'data.frame':    108 obs. of  20 variables:
##  $ arsId       : chr  "24446" "24448" "24464" "24467" ...
##  $ beginTm     : chr  "04:00" "04:05" "04:08" "04:08" ...
##  $ busRouteId  : chr  "100100063" "100100063" "100100063" "100100063" ...
##  $ busRouteNm  : chr  "402" "402" "402" "402" ...
##  $ direction   : chr  "광화문" "광화문" "광화문" "광화문" ...
##  $ gpsX        : chr  "127.1359435567" "127.1333059577" "127.131555" "127.1291283788" ...
##  $ gpsY        : chr  "37.4806401323" "37.4809413424" "37.481607" "37.4805494955" ...
##  $ lastTm      : chr  "23:59" "00:04" "00:06" "00:06" ...
##  $ posX        : chr  "212022.43167104843" "211789.1230600006" "211634.17106410407" "211419.7317364646" ...
##  $ posY        : chr  "442370.28669265006" "442403.3799425196" "442477.0334311831" "442359.3799282368" ...
##  $ routeType   : chr  "3" "3" "3" "3" ...
##  $ sectSpd     : chr  "0" "32" "29" "30" ...
##  $ section     : chr  "0" "123605241" "123604916" "123605062" ...
##  $ seq         : chr  "1" "2" "3" "4" ...
##  $ station     : chr  "123000354" "123000356" "123000372" "123000375" ...
##  $ stationNm   : chr  "장지공영차고지" "아이코리아" "송파글마루도서관.버들어린이집" "문현고등학교" ...
##  $ stationNo   : chr  "24446" "24448" "24464" "24467" ...
##  $ transYn     : chr  "N" "N" "N" "N" ...
##  $ fullSectDist: chr  "0" "794" "356" "576" ...
##  $ trnstnid    : chr  "101900006" "101900006" "101900006" "101900006" ...
  • busID 노선의 정류소 정보가 109개임을 확인할 수 있다.
  • 컬럼의 갯수는 20개 : 이들에 대한 자세한 내용은 “노선정보조회 서비스 Open API 활용가이드 P. 14, (4) getStaionsByRouteList 응답 메시지 명세 참고.”

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

df_path 컬럼 중 정류소 이름을 나타내는 stationNm 컬럼과, 위치정보를 나타내는 gpsX, gpsY 컬럼을 선택하여 station 데이터 세트를 생성한다.

  • gpsX : 경도 -> 숫자형으로 변환 -> 컬럼명을 lon으로 변경
  • gpsY : 위도 -> 숫자형으로 변환 -> 컬럼명을 ’lat’으로 변경
gpsX <- as.numeric(df_path$gpsX)
gpsY <- as.numeric(df_path$gpsY)

station <- data.frame(stationNm = df_path$stationNm, 
                      lon = gpsX,
                      lat = gpsY)
str(station)
## 'data.frame':    108 obs. of  3 variables:
##  $ stationNm: chr  "장지공영차고지" "아이코리아" "송파글마루도서관.버들어린이집" "문현고등학교" ...
##  $ lon      : num  127 127 127 127 127 ...
##  $ lat      : num  37.5 37.5 37.5 37.5 37.5 ...

2.1.2.6 데이터 세트의 저장

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