통학

2019-02-08

들어가며

집과 고려대학교를 오고 가는 방법에 대해 정리해 보았다. 2018년 6월 12일에 작성했던 메모를 기반으로 상세 내용을 붙였고, 오늘 새로 찾은 방법을 추가했다.

고려대학교로 갈 때

수도권 전철 이외의 수단만을 이용해본 적이 단 한 번도 없다.

수도권 전철

(아침에 늦게 나올 수밖에 없으므로) 시간이 중요하다는 점을 최우선으로 고려한다.

용인시 마을버스 + 수도권 전철

위와 대부분 동일한데, 집에서 동천역까지 걸어가는 것이 650m 정도 되어 걸어가기 귀찮을 때 14-1번, 14-4번과 시간이 잘 맞으면 타고 갈 수 있다. 원래는 14-2번도 있었는데 폐선한 것으로 보인다. 14-1번은 더 넓고 14-4번의 배차간격조차도 20분이므로 일상적으로 쓰기는 어렵다. 동천동현대홈타운1차아파트(29-123) 정류장에서 17번을 타도 된다. 나머지 버스들은 동천역(56-604) 정류장이 아닌 동천역.배송단지(56-603) 정류장 이후 좌회전을 하므로 걷는 거리 단축이 엄청나게 크지는 않다.

용인시 마을버스 + 수도권 전철 (2)

2016년 1월 30일 신분당선 2단계 구간 개통 전, 정모 등을 갈 때나 썼던 방법이다. 처음에 버스가 끼어 시간이 많이 불확실해지므로 지금은 사용하지 않는다.

집으로 올 때

집에 오는 상황은 다양하다. 막차가 끊긴 정도에 따라서 여러 가지가 있다.

수도권 전철

평소에는 집에 정말 빨리 오고 싶을 때나 이용하는 방법으로, 거의 안 쓴다. 다만 평일 막차 시간대의 경우 신분당선이 분당선보다 막차가 늦으므로 이용하는 경우가 꽤 있다.

수도권 전철 + 용인시 택시

신분당선 막차에서 한 타임 지나서 탔을 때는 정자역까지밖에 못 간다. 막차가 아니면 절대로 쓸 일이 없는 방법으로 반드시 심야할증이 붙은 택시를 탄다. 정자역에서 성남시 택시는 용인에 거의 안 가고, 용인시 택시는 거의 안 보여서 집에 가기 매우 힘들다. 지금까지 성남시 택시는 한 번도 못 타봤다. 용인시 택시의 경우 귀로영업이라 시계외할증은 없지만 도농복합시라 기본적으로 요금이 비싸므로 성남시 택시에 시계외할증 붙은 것과 비슷할 것이다.

수도권 전철 + 용인시 마을버스

집에 갈 때는 시간이 여유로우므로 느리게 가도 별 상관이 없다. 신분당선을 이용하지 않으므로 요금이 싸고 분당선의 대부분 열차가 왕십리에서 시종착하므로 오래 앉아서 가기 쉽다는 장점도 있다. 주말에는 분당선이 신분당선보다 막차가 늦으므로 더 좋다.

서울특별시 택시

술을 좀 마셨을 때 학교에서 바로 집으로 택시를 타고 오는 방법이다. 돈 엄청 깨진다. 속도가 돈에 영향이 있는 것은 아니지만, 경부고속도로를 경유하기에 유료도로 통행료를 낸다. 심야할증은 기본이고 경부고속도로를 타고 가는 중 시계외할증요금이 시작되어 140원씩 올라간다. 한 번은 너무 밤이 깊어 아예 4시 지나서 가려고 했는데, 그 앞에서 추워서 못 버티고 3시 58분에 탔다. 거의 기본요금만 더 나온 것이다. 경부고속도로 말고 분당수서로에서 120km/h를 넘나들며 27분대로 매우 빠르게, 그리고 심야할증이 없어 싸게 도착했다.

서울특별시 택시 + 서울특별시 광역버스

오늘 새로 발견한 방법이고, 이를 적기 위해 메모로만 있던 이 글감을 글로 쓰기 시작했다. 막차를 놓치고 나서 이렇게 말짱한 정신으로 있는 적이 오랜만이어서 경로를 찾아봤더니 신설동 주변에서 심야 운행하는 버스가 있어 타 보기로 했다. 어쩌면 좀 걷고 버스를 탈 수 있었을지도 모르겠지만, 춥고 어차피 가까워 보여서 택시를 탔다. 심야할증은 기본이고 신호가 많아서 시간 병산이 많이 되는 듯하다. 9403번 막차를 타고 푹 자면 기사님이 오리역에서 깨워주시고, 진짜 종점인 구미동차고지(07-341) 정류장까지 가겠다고 하면 된다. 도착하면 3시 반쯤 되는데 거기서 걸어가면 된다. 차고지에 많은 차가 주차된 것을 볼 수 있다. 도로변에까지 나와 있던데 그건 좀 보기 그랬다.

경부고속도로 아래에 굴다리가 있어서 아래와 같이 거의 직선으로 올 수 있다. 조명도 엄청 환해서 그리 무섭지 않다. 15-20분 정도 걸린다.

구미동차고지에서 집까지 오는 경로
그림 1 구미동차고지에서 집까지 오는 경로

서울특별시 광역버스 (2/14 추가)

이제 정류장 위치도 알았겠다, 안암에서 신설동까지 그리 멀지 않으니 걸어가 보았다. 생각보다 금방이다. 함께 술 마신 사람이 일부 같이 와 주니 정말 짧게 느껴진다. 집 갈 때와 비슷하게 15-20분 정도 걸으면 9403번을 탈 수 있는 정류장에 도착할 수 있다. 안암의 참살이길(안암로24길)이 일방통행이라 택시가 우회할 수밖에 없어서 거리에 비해 요금이 더 나오니 걸어가는 것도 나쁘지 않다.

용두동을 경유하여 남쪽으로만 내려가도 용두동 정류장에서 탈 수 있고, 이 경로가 조금 더 거리가 짧은 듯하여 이쪽으로 변경했다.

6/23 새벽에는 이 경로 덕분에 엄청난 사건#이 발생했다.

서울특별시 심야버스 + 성남시 반디버스 (7/1 추가)

성남시에서 반디버스가 개통함에 따라 (이론상) 막차 시간이 무한대가 되었다. 요금상 분류는 경기도 직행좌석버스이다. 언젠가 술 등으로 인해 기회가 되면 타 보는 것으로 하고, 일단 경로만 정리해 본다. N13번을 타기 위해 걸어가는 거리가 9403번보다 약간 짧은 것이 특징이다. 오리역에 내리면 구미동차고지보다 400m 정도 더 걸어야 하지만 그 정도는 감수할 수 있겠다. N13번의 배차간격이 약 25분이고 반디1번의 배차간격이 40분이므로 시간이 좀 뜰 가능성이 있으며, 반디1번의 막차를 타고 갈 경우 복정역 4:40 출발이므로 미금역에서 5:30 첫차인 마을버스와 연계가 가능할 수도 있어 보인다.

사실 이걸 알게 되기까지의 스토리가 조금 있다. 건대입구역 쪽에 갈 일이 있어 집 앞을 지나는 1002번 버스 노선을 찾아보다가 이게 판교까지 단축되었다는 소식을 보게 되었고, 그 공고#에서 함께 반디버스의 개통 계획을 보게 된 것이다. 그런데 개통 연기 공지#가 뜨고 6월 중에 개통한다고 하더니, 결국 미뤄지고 7월 1일에 개통했다. 다만 해당 내용을 보도자료#에 써 놓고 새소식란에는 안 올려놨다. 심지어 7월 1일 자 기반 정보에는 노선 정보만 있고 경로 정보는 없었다. 7월 2일 자 버전에서야 확인되어 업데이트해 두었다.

2020-04-25 추가

이제 통학을 할 일이 매우 줄어듦에 따라 (오늘 신분당선 별도운임 조정을 포함하여) 운임 변경 등의 사항을 업데이트하지 않는다.

거리 계산

수도권 전철

철도거리표 등 일반적으로 공개된 자료들을 사용했다. 킬로미터 단위로 소수점 아래 한자리보다 더 정밀한 자료를 못 찾겠다.

경기도 버스

정밀한 거리 계산을 하기 위해 자료를 찾았다. API 테스트 페이지#에서 '테스트 값 입력'과 '전송' 버튼을 차례로 누르면 정적 파일 다운로드 링크가 나타난다. 이 중 routeLine#, station# 파일을 다운로드한다.

이 txt 파일은 매우 불편하게도 줄 바꿈을 ^로 해 놓았다. 다루기 불편하므로 LF로 바꾸자. ^는 16진수로 0x5E이므로 8진수로는 0136이다.

tr '\136' '\n' <routeline20190208.txt >routeline20190208_lf.txt
tr '\136' '\n' <station20190208.txt >station20190208_lf.txt

이제 검색을 편하게 하기 위해 DB에 import 한다. MariaDB의 LOAD DATA INFILE 구문을 이용했다. 관련 문서는 MariaDB#와 MySQL#에 있는데 개인적으로 후자가 조금 더 보기 편했다. 아래는 각 테이블을 만드는 SQL 코드로, HeidiSQL에서 'CREATE 코드 보기' 기능을 이용했다. 왜 routeline20190208 테이블의 SUB_LENGTHUNSIGNED가 아닌지 궁금할 수 있는데, 직접 import 해 보니 왜인지는 모르겠지만 음수값이 있어서 그렇다.

CREATE TABLE `routeline20190208` (
    `ROUTE_ID` INT(11) UNSIGNED NOT NULL,
    `LOCATION_SEQ` SMALLINT(5) UNSIGNED NOT NULL,
    `LOCATION_TP` INT(11) UNSIGNED NOT NULL,
    `LOCATION_ID` INT(11) UNSIGNED NULL DEFAULT NULL,
    `SUB_LENGTH` MEDIUMINT(8) NOT NULL,
    `SUM_LENGTH` MEDIUMINT(8) UNSIGNED NOT NULL,
    `X` DOUBLE NOT NULL,
    `Y` DOUBLE NOT NULL,
    `LINK_ID` INT(11) UNSIGNED NULL DEFAULT NULL,
    PRIMARY KEY (`ROUTE_ID`, `LOCATION_SEQ`)
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;

CREATE TABLE `station20190208` (
    `STATION_ID` INT(11) UNSIGNED NOT NULL,
    `STATION_NM` TINYTEXT NOT NULL COLLATE 'utf8mb4_unicode_ci',
    `CENTER_ID` INT(11) UNSIGNED NULL DEFAULT NULL,
    `CENTER_YN` CHAR(1) NOT NULL COLLATE 'utf8mb4_unicode_ci',
    `X` DOUBLE NOT NULL,
    `Y` DOUBLE NOT NULL,
    `REGION_NAME` TINYTEXT NOT NULL COLLATE 'utf8mb4_unicode_ci',
    `MOBILE_NO` MEDIUMINT(9) UNSIGNED NULL DEFAULT NULL,
    `DISTRICT_CD` TINYINT(4) UNSIGNED NOT NULL,
    PRIMARY KEY (`STATION_ID`)
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;

이제 import 하는 코드로, 경로에는 해당 파일의 절대경로를 적어주자. 물론 \\\/로 바꿔주어야 한다.

LOAD DATA LOCAL INFILE 'routeline20190208_lf.txt'
REPLACE INTO TABLE routeline20190208
CHARACTER SET 'utf8'
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(ROUTE_ID, LOCATION_SEQ, LOCATION_TP, @LOCATION_ID, SUB_LENGTH, SUM_LENGTH, X, Y, @LINK_ID)
SET LOCATION_ID = IF(@LOCATION_ID = '', NULL, @LOCATION_ID), LINK_ID = IF(@LINK_ID = '', NULL, @LINK_ID);

LOAD DATA LOCAL INFILE 'station20190208_lf.txt'
REPLACE INTO TABLE station20190208
CHARACTER SET 'utf8'
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(STATION_ID, STATION_NM, @CENTER_ID, CENTER_YN, X, Y, REGION_NAME, @MOBILE_NO, DISTRICT_CD)
SET CENTER_ID = IF(@CENTER_ID = '', NULL, @CENTER_ID), MOBILE_NO = IF(@MOBILE_NO = '', NULL, @MOBILE_NO);

여기서 route 정보는 왜 다운로드조차 하지 않았느냐면 불완전하기 때문이다. 노선 ID를 찾아야 하는데 해당 파일에서 없는 값은 직접 경기버스정보 홈페이지에서 검색 시 링크 주소 등을 보고 알아내야 한다. 내가 사용한 값들은 다음과 같으며, 이 중 반디1번을 제외하고는 모두 수동으로 찾아야 한다.

route에 정보가 없는 노선들에 대해 문의한 결과 답변들은 다음과 같다.

안녕하세요. 경기도 공공데이터 담당자 ***입니다. 경기도에서 제공하지 않는 버스정보 데이터의 경우, 경기도가 해당 버스정보에 대한 권한을 보유하고 있지 않기 때문에 제공해드리지 못하는 것이니 양해바랍니다. 마을버스 정보의 경우, 민간에서 보유한 데이터입니다. 마을버스 정보는 현재 관할 시군에서 운행정보를 수집하고 있으며, 버스정류소 전광판과 경기도 버스정보시스템에서만 제공할 수 있도록 관리되고 있어 경기도에서 마을버스 정보를 데이터 형태로 제공해드릴 수 없는 점 양해하여 주시기 바랍니다. 마을버스 정보가 필요하신 경우, 해당 시군으로 문의하여 주시기 바랍니다. 감사합니다.

안녕하세요. 공공데이터활용지원센터입니다. 문의사항에 대한 제공기관 측 답변을 안내 드립니다. 현재 경기도에서는 도내 시내, 시외버스에 대한 운행정보를 수집 관리하고 있기에 오픈API로 제공하고 있으며 귀하께서 질의하신 서울버스와 용인시 마을버스는 해당 지자체에서 직접 운행정보를 수집 관리하고 있고 오픈API 제공도 자체 관리하고 있습니다. 다만 해당 지자체에서 경기도 관할 홈페이지, 스마트폰 등에 도착안내가 될 수 있기를 요청하였기에 정보가 조회되는 것이며 경기도 오픈API에서는 제공하지 않는 점 양지하여 주시기 바랍니다. 감사합니다.

routeline에서 경유 정류장 목록은 다 주면서 왜 노선 자체의 정보는 못 주겠다는 것인지 전혀 이해할 수가 없다. 답변에서 언급된 운행정보는 실시간 운행정보인 것 같은데 그건 필요도 없다. 뭔가 재문의하면 원래 있던 routeline의 정보까지 잘릴 것 같아서 그냥 가만히 있기로 했다.

이제 노선 ID로 누적거리표를 만들어보자. 아래와 같은 코드를 실행하면 된다. 물론 ?는 원하는 노선 ID로 대체해야 한다.

SELECT MOBILE_NO, STATION_NM, SUM_LENGTH FROM routeline20190208 INNER JOIN station20190208 ON LOCATION_ID = STATION_ID WHERE ROUTE_ID = ? ORDER BY LOCATION_SEQ ASC;

실행하면 다음과 같은 누적거리표를 얻을 수 있다. 이제 원하는 정류장 사이의 거리를 계산하면 정확한 값을 얻을 수 있다.

서울특별시 광역버스 9403 누적거리표
그림 2 서울특별시 광역버스 9403 누적거리표

다만 동일한 구간임에도 노선에 따라 거리가 10m 이내로 차이 나는 경우가 있었는데, 그냥 처음으로 계산한 값을 쓰기로 했다.

서울특별시 버스 (7/1 추가)

경기도와 연관이 전혀 없는 서울특별시 내부 버스의 경우 위 방법으로 조회할 수 없어서 다른 방법을 써야 한다. 먼저 노선 ID를 얻는 과정이다. 서울열린데이터광장의 '서울시 버스 노선 정보 조회' 페이지#에서 20190124기준_서울시_노선현황.xls 파일을 다운로드한다. (가끔 업데이트되니 파일 이름은 변경될 수 있다.) 해당 파일을 열어서 직접 노선 번호를 통해 검색하면 된다. 다행히도 9403번의 노선 ID가 경기도와 호환된다. 내가 사용한 값들은 다음과 같다.

이제 거리 계산을 해 보도록 하자. 먼저 각 노선의 경로에서 각 구간 거리를 알기 위해서는 서울시 버스운행정보 공유서비스의 노선별경유정류소목록조회 API#를 이용해야 한다. 그런데 이 API는 인증키가 필요하다. 인증키는 공공데이터포털에서 받을 수 있다. 해당 API의 상위 항목인 노선정보조회 서비스#의 활용신청을 해야 한다. 개발계정에 대해 자동승인인 서비스이므로 대기시간 없이 바로 활용할 수 있다. 신청을 완료하면 개발계정 상세보기에서 '일반 인증키 발급' 버튼을 눌러 인증키를 받을 수 있고, 굳이 복사할 필요 없이 아래 상세기능정보에서 getStaionsByRouteList 기능의 실행을 클릭하고 busRouteId에 위에서 찾은 노선 ID을 입력하여 XML로 다운로드하면 된다. 나머지 포맷은 제대로 작동하지 않는다.

위 문단에서 getStaionsByRouteList는 getStationsByRouteList의 오타인 듯한데, API 명세 페이지에도 동일한 오류가 있다. 신고한 결과 답변은 다음과 같다. 버전 구분 하면 해결될 문제이겠지만 의지가 없어 보인다.

안녕하세요. 오류신고해주신 내용처럼 오타가 맞으나, API 주소를 변경할 경우 기존 사용자들에게 오류가 발생하여, 오타수정은 쉽지 않을 것 같습니다. getStaionsByRouteList로 호출하여 이용하여 주시기 바랍니다.

이 데이터에서 하필 거리 정보인 fullSectDist 필드가 누적 거리가 아닌 정류소간 거리인 관계로 다운로드한 XML 파일을 조금 처리할 필요가 있다. 별도의 도구가 없다면 Microsoft Office Excel을 활용할 수 있다.

서울특별시 심야버스 N13 구간거리표
그림 3 서울특별시 심야버스 N13 구간거리표

문제는 경기도에도 정보가 있고 서울특별시에도 정보가 있는 9403번 같은 경우이다. 위에서 사용한 용두동-구미동차고지 구간 기준 경기도 정보로는 33995m, 서울특별시 정보로는 34474m인데, 경기도는 서울특별시와 달리 교차로 및 곡선 변곡점별 정보를 제공하므로 이를 더 신뢰하기로 했다.

요금 계산

아래는 수도권 통합 요금제가 적용되는 대중교통으로, 기본요금은 가장 비싼 것만 적용된다. 수도권 전철의 경우 신분당선 등을 이용하든 말든 상관없이 무조건 정규 노선을 경유한 최단 거리로 적용된다. (정규 노선이므로 광운대역발 경춘선 등은 적용되지 않는다. 즉, 회기역을 거쳐 간 것으로 계산된다.)

택시를 이용할 경우 아래와 같다. 분명히 용인시 택시가 도농복합시 가군이라 110%라고 적혀 있는데, 아무리 봐도 110%가 아니다. 추가요금이 120%대이다. 나군도 계산해보면 추가요금이 140%대인데 왜 125%라고 되어 있는지 잘 모르겠다. 나군은 저 정도면 모범택시와 기본료 빼고는 거의 비슷해진다.

돌아가기


댓글