피더 버스 서비스


9

우선, 약간의 배경.

지역 교통 기관에서 일합니다. 피더 버스 서비스에 대해 "진단"하고 있습니다. 우리는 자동차를 타는 대신 버스를 타고 기차역에 갈 수있는 사용자의 비율을 알고 싶습니다. 이 과정은 여러 차례 수행되었지만 이제는 gtfs를 기본 데이터 소스로 사용하므로 방법론을 다시 생각해야합니다.

전형적인 피더 버스 서비스

열차를 "먹이는"것으로 간주 되려면 버스 노선이 기차역에서 일정 거리 (빨간색 버퍼) 내에 정차해야합니다. 또한 버스가 열차 30 분 전에 기차역에 도착하면 대기 시간이 너무 길어 아침 20 분 더 자고 차를 타러 갈 수 있기 때문에 열차 서비스와의 동시성이 매우 중요합니다.

정류장 12에서 라인 A (파란색)를 타십시오. 정류장 13에서 버스를 내립니다. 버스는 정류장 5에 도달하는 정류장 인 정류장 13에 도착합니다. 아주 좋습니다. 1 ~ 13 정거장의 버스 노선을 이용하는 모든 사람들은 그 열차 5 분 전에 도착한다는 의미입니다.

그런 다음, 많은 학교와 교차로가있는 인구 밀집 지역을 통과하는 열차는 속도를 크게 낮추어야합니다. 그 동안 버스는 14-17 번 정류장에서 승객을 태우고 기차 10 분 전에 기차역 # 2에 도착합니다. 따라서 14 ~ 17 번 정류장에서 버스를 타는 승객은 기차역에 도착하면 대기 시간이 10 분입니다. 따라서 버스 노선을 따라 1 번에서 13 번 정류장에서 버스를 타는 승객은 5 분의 대기 시간을 가지며 14 번에서 17 번 정류장에서 버스를 타는 승객은 10 분의 대기 시간을 갖습니다.

트랙의 반대편에있는 B 라인은 1 번 기차역 근처를 통과하지만 정류장은 너무 멀어서 1 번 기차역을 "공급"하는 것을 고려하지 않습니다. 열차 7 분 전에 기차역 # 2에 도착합니다 (아침 출퇴근 시간 동안 모든 열차에 대해 운행하며 동기화가 잘되어 있습니다). 따라서 1 번 버스에서 1 번 버스에서 59 번 버스를 타는 승객은 B 라인을 따라 7 분의 대기 시간이 있습니다.

자, 내 질문입니다. LineA.13 및 LineA.17 정거장이 내 열차를 운행하고 있음을 확인한 후 (PostGIS에서 공간적으로 수행됨), # 13 이전 정거장에서 버스를 타는 대기 시간은 5 분이지만 10 분의 대기 시간, 대기 시간을 모든 정류장에 할당하려면 어떻게해야합니까?

Postgres / PostGIS (pl / pgsql 또는 pl / python)에서하고 싶지만 순수한 파이썬 (OS 또는 arcpy)도 사용할 수 있습니다.

제 생각 엔 뒤로 고리를 돌릴 수있었습니다. 따라서, 맞는 정류장 (여기서는 LineA.17)을 발견하면 16 번, 15 번까지 동일한 대기 시간을 할당 한 다음 기준에 맞는 다른 정류장을 찾은 다음 (LineA.13) 나머지는 할당하십시오. 13 번과 동일한 대기 시간

그래도 그런 루프를 만드는 방법을 모르겠습니다. SQL로 할 수 있다고 생각하지 않으므로 PostgreSQL에서 절차 언어를 사용해야합니다.

pgRouting을 사용하여 각 피더 정지 점 사이의 경로를 찾아서 A 라인이 2로 나뉘어집니다 (1 ~ 13 정거장과 13 ~ 17 정거장). 더 쉬울까요?

다음 단계는 pgRouting을 사용하여 대기 시간이있는 모든 정류장에서 운행 시간을 계산하고 (LineA.18 이상에 죄송합니다!) 버스 일정과 비교하여 경쟁력을 계산하는 것입니다 (5 소요) 차에서 버스에 몇 분 더?)

어떤 아이디어? 나는 지금까지 진행 한 노력을 보여주기 위해 오랫동안 진행중인 작업 스크립트를 게시하지만 갇혀 있습니다!


다른 이상한 경우로 인해 이제 승객이 버스에서 내릴 수있는 경로를 줄이는 것이 좋습니다. 따라서 각 경로 "세그먼트"는 독립적입니다. 나는 여전히 내 정거장 (모양이 거리를 따르고 정지가 극에있는)이 정확한 없을 때 내가 PostGIS와 나의 모양을 절감 할 수있는 방법을 강구해야)
fgcartographix

답변:


3

실제로 원하는 루프를 만드는 것은 SQL을 사용하여 정말 쉽습니다.

SELECT DISTINCT ON (b1.line, b1.number) b1.line,b1.number,b2.waiting
FROM busstops AS b1
  LEFT JOIN busstops AS b2
    ON b1.line = b2.line
      AND b1.number<=b2.number
      AND b2.waiting IS NOT NULL
ORDER BY b1.line,b1.number,b2.number;

바이올린 .

또한 스톱 전송에서 스톱 전송까지의 총 전송 시간을 쉽게 알 수 있습니다.

경로를 시간 그래프로 변환하는 경우에만 (만약 출발 시간과 경로 비용을 나타내는 노드 포함) 정규 pgRouting을 사용할 수 있습니다.


우와! 그것은 작동합니다 ... 아직 이해하지 못하는 부분이 있지만 아이디어를 얻습니다 ... 나중의 정류장에 대기 시간이 더 작은 경우 대기 시간을 무시할 수 있는지 대담 할 수 있습니까? 이론은 당신이 20 분 동안 플랫폼에서 기다려야하고 대기가 4 분이면 기차역 2까지 버스에 머물러야한다면 첫 번째 기차역을 건너 뛸 수 있다는 것입니다 ...;) 백만 번 감사합니다 !!!
fgcartographix

1
ORDER BY절을 변경하십시오 . 처음 두 열은 DISTINCT ON절 에 있기 때문에 유지되어야 하지만 그 외에는 모두 허용됩니다. sqlfiddle.com/#!1/24fab/2
Jakub Kania

당신은 마법사입니다 !! :) 감사! 나는 너무 오랫동안 그것으로 고투하고 있었다!!
fgcartographix

단지 1 시간 후인 기차가 4 분이 아닌지 확인하십시오 :)
Jakub Kania

아냐! 허용되는 최대 대기 시간은 30 분이며 실제로는 좋지 않다는 큰 빨간색 기호가 있습니다! ;) 다시 감사합니다! 또한 대기 시간이 실제로 더 길어도 아무도 처음 버스보다 기차역에 가지 않기 위해 버스에 20 분 더 머 무르지 않을 것이라는 점을 상사와상의했습니다. ;)
fgcartographix

5

작년 Google Summer of Code 프로그램에서 학생은 멀티 모달 라우팅을위한 pgRouting 기능을 구현했습니다. 새로운 2.0 릴리스로 만들지 않았으므로 지금은 작동하지 않을 수 있지만 사용 가능한 리소스를 살펴보고 도움이되는지 확인하십시오.

이 기능을 다음 릴리스로 가져 오면 좋을 것이므로 개발자 메일 링리스트에 문의하여 필요한 경우 필요한 작업을 조정하십시오. http://pgrouting.org/support.html

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.