본문 바로가기

Node.js

[버스 API] 공공 데이터 api를 이용해 버스 도착 정보 얻는 예제

  우리학교는 버스가 학교 구석 회차장까지 들어오는데, 그 정보는 한 번에 정리된 형식으로 볼 수가 없었다.nodejs 공부를 하면서 예제로 카톡봇을 만들다보니, 내가 그 정보를 카톡봇으로 정리하거나 앱으로 만들면 좋겠다는 생각이 들었다.

허나 REST API를 처음 이용해보는 수준에서 공공 데이터의 오픈 API 이용하기가 간단한 것은 아니다. 어느 정도 감을 잡은 뒤에는 뚝딱뚝딱 만들어낼 수 있지만, 처음엔 헤맬 수 밖에.

공공 데이터의 오픈 api는 한 번 API이용을 신청하면 한 시간이 지나야 승인이 떨어져서 공부하려고 딱 시작했는데, 기다리는 동안 텐션이 싹 죽을 수가 있다...

이것 때문에 A라는 API를 이용하면 될 줄 알고 기다린 뒤 A를 실행해보면 B도 필요하다는 것을 알게 되고 B를 신청하면 또 1시간을 기다려야하는 불상사가 계속해서 일어남...


● 필요한 Open API는?


공공 데이터 포털 : https://www.data.go.kr/

위의 링크를 통해 공공 데이터 포털을 접속할 수 있고,

경기도 기준으로 내가 원하는 버스의 도착 정보를 얻으려면 크게

  • 버스노선 조회 서비스

  • 정류소 조회 서비스

  • 버스 도착 정보 조회 서비스

세 가지가 필요한 것 같다.

위에서 말했듯 한 번 api를 신청하고 작업하다가 다시 필요한 api를 발견하게 되어 그때서야 신청하면 시간이 많이 낭비되니 그냥 세개 다 신청해놓자. 손해 볼 건 없다. 돈이 나가는 것도 아니니까.

※ api를 요청해봤더니 SERVICE KEY IS NOT REGISTERED ERROR 라는 응답을 받게 될 경우

: SERVICE KEY IS NOT REGISTERED ERROR 는 처음 인증키를 발급받았을 때 나오는 에러

인증키를 받고 한 시간 정도 지나야 그 인증키를 사용할 수 있다.



openAPI의 개발자 가이드를 보면 알 수 있지만

태그명이 의미하는 바는 아래와 같다.


stationId:정류장 아이디-우리가 일반적으로는 알아볼 수는 없음

stationName:정류장 이름

routeId:노선 아이디-우리가 일반적으로 알아볼 수는 없음

routeName:노선 -우리가 알아볼 수 있음 ex) 5100, 9

predictTime1:가장 빨리 오는 그 노선 번호의 버스

predictTime2:두번 째로 빨리 오는 그 노선 번호의 버스


● openAPI 사용 흐름 - 1 자기가 원하는 버스 노선의 정보를 통해 정류소 찾고 그 정류소의 도착 정보 찾기 ( 이게 제일 쉬움 )


1. "버스 노선 조회 서비스"의 "노선번호목록조회" 기능으로 버스 번호를 입력해 해당 버스 번호(노선 번호의) routeId를 얻는다.

ex) 5100번 버스의 routeId는 200000115이다


2. "버스 노선 조회 서비스"의 "경유경류소목록조회" 기능으로 1에서 구한 routeId를 전달하여 해당 버스 노선이 다니는 정류소의 이름과 정류소 id를 구한다.

ex) 예를 들어 5100번 버스가 가는 신논현역 정류장의 stationId는 121000946 이고 stationName은 신논혁역. 금강빌딩 이다.


3. "버스 도착 정보 조회 서비스"의 "버스도착정보목록조회" 기능으로 2에서 구한 stationId를 전달하여 해당 station에 도착하는 버스들의 정보를 얻는다.


4. 얻은 정보에서 2에서 구한 routeId에 해당하는 버스의 predictTime을 확인한다.


● openAPI 사용 흐름 - 2 정류소 위치를 좌표로 조회해서 정류소를 찾은 뒤 그 정류소의 도착 정보 찾기 ( 초보 때 썼던 번거로운 방식 )


우선 구글 맵스에서 원하는 지역 우클릭 -> "이곳이 궁금한가요?"를 통해 버스정보를 찾으려는 지역의 좌표값을 얻는다.

ex)  y:37.03808, x:127.10989 - 앞이 y위도, x가 경도이다.


1. "정류소 조회 서비스"의 "주변정류소목록조회" 기능으로 방금 구한 지역의 좌표를 이용해

주변 정류소를 조회하고, 찾고자 하는 정류소의 stationId를 얻는다.


2. "버스노선 조회 서비스"의 "노선번호목록조회" 기능을 통해 그 자기가 알고 있는 버스 노선(버스번호)에 대한 routeId를 얻는다.


3. "버스노선 조회 서비스"의 "버스노선 정보항목 조회"를 통해 routeId를 통해 버스 노선 번호를 얻는다.


4. "버스 도착 정보 조회 서비스"의 "버스도착정보목록조회" 기능을 이용해 버스 도착정보를 얻는다

( 최종적인 정보이므로 stationId, routeId가 의미하는 routeName 을 알아야 정보를 이용할 수 있음 )


우선 이 글에서는 1. "정류소 조회 서비스"의 "주변정류소목록조회" 기능으로 아까 구한 지역의 좌표를 이용해

주변 정류소를 조회하고, 찾고자 하는 정류소의 stationId를 얻는다.

까지만 다루겠다.

(사실 이 글을 쓰던 시점은 글을 수정하고 있는 지금으로부터 약 1년 전인데, 당시 너무 비효율적으로 서술했었네요.)


주변정류소목록조회를 하면 자기가 입력한 좌표의 주변에 있는 정류소 목록이 뜬다.

근데 이걸 보고 우리가 이용하긴 좀 까다롭다..


파일은 위와 같이 나와있는데,

어떤 정류장이 어디의 정류장인지 이것만 보고선 정확히 알 수가 없다.

따라서 좌표를 쳐봐야하는 경우가 있을 수 있다.


구글에 그 정류소 위치를 확인하기 위해서는 y좌표, x좌표 형식으로 입력해야하는데,

<x> x값</x>

<y> y값</y>

의 형태를 이용하기는 매우 불편함...

따라서 나는 아직 xml관련된 것은 모르니까 

그냥 저것을 html로 저장한 뒤 jQuery를 이용해 파싱하기로 했다.


html로 저장하면 이런식으로 나오고, 그것을 파싱하면,


이렇게 알아보기 쉽게 나온다. 따라서 그냥 긁어다가 구글맵스에 좌표를 치기 훨씬 수월해 졌고

좌표의 바로 윗줄에서 stationId를 볼 수 있으니 아주 편리하다.

(mobileno 는 별로 쓸 데 없는 듯)

이를 통해 내가 찾는 stationName이 어떤 stationId를 갖는지 알 수 있으면 된다.

내가 예를 들어 경희대정문 정류소의 정보를 얻고 싶으면 stationId를 알아야하는데, 위의 작업은 그 stationId를 얻는 작업이었다.