Chapter 1 버스 노선의 노선 ID 확인

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

(노선정보조회 서비스 Open API 활용가이드 P. 10)

패키지 불러오기

library(XML)
library(ggmap)
## Loading required package: ggplot2
## Google's Terms of Service: https://cloud.google.com/maps-platform/terms/.
## Please cite ggmap if you use it! See citation("ggmap") for details.
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## √ tibble  3.0.4     √ dplyr   1.0.2
## √ tidyr   1.1.2     √ stringr 1.4.0
## √ readr   1.4.0     √ forcats 0.5.0
## √ purrr   0.3.4
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

1.1 서울시 운행중인 노선 번호와 노선 ID 확인

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

1.1.1 API Key 인증받기

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

1.1.2 노선정보 조회

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

1.1.2.1 조회할 노선번호

노선번호(busRtNm)를 공란으로 한다. 즉, 서울시에 운행중인 모든 노선정보를 조회한다.

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

1.1.2.2 노선정보 조회 서비스 URL

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

url <- "http://ws.bus.go.kr/api/rest/busRouteInfo/getBusRouteList?ServiceKey="
srch_url <- paste(url, API_key, "&strSrch=", busRtNm, sep= "")

1.1.2.3 노선정보를 조회

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

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

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

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

이제 df 변수는 서울시에서 운행 중인 모든 노선 정보를 담고 있다.

df <- xmlToDataFrame(getNodeSet(xmlfile, "//itemList"))    # xml 형식을 데이터프레임으로 변환.
str(df)                            # 노선정보조회 서비스 Open API 활용 가이드 : p. 10-11 (2) 응답메시지 명세 참고...
## 'data.frame':    1179 obs. of  13 variables:
##  $ busRouteId : chr  "100100506" "100100507" "100100513" "100100373" ...
##  $ busRouteNm : chr  "6006" "6009" "6100" "6101" ...
##  $ corpNm     : chr  "서울공항리무진  02-577-1343" "서울공항리무진  02-577-1343" "한국도심공항  02-551-0077" "한국도심공항  02-551-0077" ...
##  $ edStationNm: chr  "인천공항" "인천공항" "인천공항" "김포공항" ...
##  $ firstBusTm : chr  "20201206065000" "20201206065000" "20201206053000" "20201206051000" ...
##  $ firstLowTm : chr  "              " "20200302000000" "              " "20190812000000" ...
##  $ lastBusTm  : chr  "20201206202000" "20201206150500" "20201206154000" "20201206204000" ...
##  $ lastBusYn  : chr  " " " " " " " " ...
##  $ lastLowTm  : chr  "              " "20200302000000" "20191105000000" "20190812000000" ...
##  $ length     : chr  "178.7" "147" "206" "90" ...
##  $ routeType  : chr  "1" "1" "1" "1" ...
##  $ stStationNm: chr  "몽촌토성역" "푸른마을아파트앞" "망우역" "수락터미널" ...
##  $ term       : chr  "630" "630" "180" "70" ...
  • 서울시에 운행 중인 버스 노선이 1172개임을 확인할 수 있다.
  • 컬럼의 갯수는 13개 : 이들에 대한 자세한 내용은 “노선정보조회 서비스 Open API 활용 가이드 : p. 10-11 (2) 응답메시지 명세 참고…”

1.1.2.5 노선정보 확인

서울시에 운행 중인 “모든 노선정보”를 확인한다.

df %>%  head
##   busRouteId busRouteNm                      corpNm edStationNm     firstBusTm
## 1  100100506       6006 서울공항리무진  02-577-1343    인천공항 20201206065000
## 2  100100507       6009 서울공항리무진  02-577-1343    인천공항 20201206065000
## 3  100100513       6100   한국도심공항  02-551-0077    인천공항 20201206053000
## 4  100100373       6101   한국도심공항  02-551-0077    김포공항 20201206051000
## 5  100100508       6300 서울공항리무진  02-577-1343    인천공항 20201206064000
## 6  100100568      6707A     KAL리무진  02-2667-0386    인천공항 20201206044000
##       firstLowTm      lastBusTm lastBusYn      lastLowTm length routeType
## 1                20201206202000                           178.7         1
## 2 20200302000000 20201206150500           20200302000000    147         1
## 3                20201206154000           20191105000000    206         1
## 4 20190812000000 20201206204000           20190812000000     90         1
## 5                20201206145500           20200324000000  201.4         1
## 6 20200617000000 20201206223000           20180112000000    130         1
##        stStationNm term
## 1       몽촌토성역  630
## 2 푸른마을아파트앞  630
## 3           망우역  180
## 4       수락터미널   70
## 5           고덕동  630
## 6         김포공항   70

그 중에 busRouteNm 컬럼은 버스 노선 번호를, 그리고 busRouteId 컬럼은 노선 ID를 보여준다.

head(df$busRouteNm)                               # 버스 노선 번호 출력
## [1] "6006"  "6009"  "6100"  "6101"  "6300"  "6707A"
head(df$busRouteId)                # 노선 ID 출력
## [1] "100100506" "100100507" "100100513" "100100373" "100100508" "100100568"

1.2 402번 버스 노선의 노선 ID 확인

df 변수의 busRouteNm == 402인 busRouteId (컬럼 번호 1)를 찾으면 된다.

busID <- df[df$busRouteNm == "402",  1] 
busID
## [1] "100100063"