Dịch vụ xe buýt trung chuyển


9

Trước hết, một chút nền tảng.

Tôi làm việc cho một cơ quan vận chuyển khu vực. Chúng tôi đang thực hiện "chẩn đoán" về dịch vụ xe buýt trung chuyển của mình. Chúng tôi muốn biết tỷ lệ người dùng của chúng tôi có thể đi xe buýt đến ga xe lửa thay vì đi xe của họ. Nó đã được thực hiện nhiều lần trong thời gian qua, nhưng chúng tôi hiện đang sử dụng gtfs làm nguồn dữ liệu chính của chúng tôi vì vậy chúng tôi phải suy nghĩ lại về phương pháp của chúng tôi.

dịch vụ xe buýt trung chuyển điển hình

Để được coi là "cho ăn" tàu, một tuyến xe buýt phải có điểm dừng trong một khoảng cách nhất định từ ga tàu (bộ đệm màu đỏ). Ngoài ra, tính đồng bộ với dịch vụ xe lửa là rất quan trọng vì nếu xe buýt của bạn đến ga tàu nửa giờ trước tàu, thời gian chờ đợi quá lâu và bạn sẽ muốn ngủ thêm 20 phút vào buổi sáng và lấy xe.

Giả sử bạn đi tuyến A (màu xanh) tại điểm dừng 12. Bạn bước xuống xe buýt tại điểm dừng 13. Xe buýt đến điểm dừng 13, đó là điểm dừng để đi đến Ga tàu số 1 5 phút trước khi tàu. Điều đó rất tốt. Điều đó có nghĩa là tất cả mọi người đi tuyến xe buýt đó tại điểm dừng từ 1 đến 13 bao gồm sẽ đến 5 phút trước chuyến tàu đó.

Sau đó, đoàn tàu, đi qua một khu vực đông dân cư với rất nhiều trường học và ngã tư buộc phải giảm tốc độ rất nhiều. Trong khi đó, xe buýt đón hành khách tại điểm dừng 14 đến 17 và đến Ga tàu số 2 10 phút trước chuyến tàu đó. Vì vậy, hành khách đi xe buýt tại các điểm dừng 14 đến 17 tất cả sẽ có thời gian chờ là 10 phút sau khi đến ga tàu. Vì vậy, dọc theo tuyến xe buýt đó, hành khách đi xe buýt tại điểm dừng 1 đến 13 có thời gian chờ là 5 phút khi những người đi xe buýt tại điểm dừng 14 đến 17 có thời gian chờ là 10 phút.

Tuyến B, ở phía bên kia của đường ray, đi qua gần Ga tàu số 1, nhưng điểm dừng của nó quá xa để xem xét "cho ăn" Ga tàu số 1. Nó đến ga tàu số 2 7 phút trước khi đi tàu (hãy làm điều đó cho mọi chuyến tàu trong giờ cao điểm buổi sáng; nó được đồng bộ hóa rất tốt). Vì vậy, hành khách dọc theo tuyến B, đi xe buýt ở mọi nơi từ điểm dừng 1 đến 59 sẽ có thời gian chờ là 7 phút.

Bây giờ, câu hỏi của tôi. Khi tôi đã xác định rằng các điểm dừng LineA.13 và LineA.17 đang cho tàu của tôi (nó đã được thực hiện trong không gian, trong PostGIS) và thời gian chờ đợi khi đi xe buýt tại điểm dừng trước # 13 là 5 phút nhưng những lần sau thời gian chờ là 10 phút, làm thế nào tôi có thể chỉ định thời gian chờ cho tất cả các điểm dừng trước chúng?

Tôi muốn làm điều đó trong Postgres / PostGIS (pl / pssql hoặc pl / python), nhưng tôi cũng có thể sử dụng python thuần (OS hoặc arcpy).

Tôi có thể, tôi nghĩ, lặp lại lạc hậu. Vì vậy, một khi tôi tìm thấy một điểm dừng phù hợp (ở đây LineA.17), hãy chỉ định thời gian chờ tương tự để dừng 16, sau đó 15 ... cho đến khi tôi tìm thấy một điểm dừng khác phù hợp với tiêu chí của mình (LineA.13) và sau đó chỉ định phần còn lại của các điểm dừng, cùng thời gian chờ là 13.

Tôi không có ý tưởng làm thế nào để tạo ra một vòng lặp như vậy mặc dù. Tôi không nghĩ rằng tôi có thể làm điều đó bằng SQL vì vậy tôi phải sử dụng ngôn ngữ thủ tục trong PostgreQuery.

Tôi đã có ý tưởng sử dụng pgRouting để tìm tuyến giữa mỗi điểm dừng trung chuyển theo cách đó, Dòng A sẽ được chia làm hai (dừng 1 đến 13 và sau đó 13 đến 17). Điều đó sẽ dễ dàng hơn?

Bước tiếp theo, sẽ là sử dụng pgRouting để tính thời gian lái xe từ tất cả các điểm dừng có thời gian chờ (xin lỗi với LineA.18 trở lên!) Và so sánh với lịch trình của xe buýt để tính toán khả năng cạnh tranh (phải mất 5 Thêm phút nữa trên xe buýt mà trong xe?)

Có ý kiến ​​gì không? Tôi thường đăng một kịch bản tiến hành dài để thể hiện nỗ lực tôi đã làm cho đến nay, nhưng tôi bị mắc kẹt!


Do các trường hợp kỳ lạ khác, bây giờ tôi xem xét việc cắt các tuyến đường nơi hành khách có thể xuống xe. Vì vậy, mỗi tuyến "phân khúc" sẽ độc lập. Tôi vẫn cần tìm hiểu làm thế nào tôi có thể cắt các hình dạng của mình trong PostGIS khi các điểm dừng của tôi không chính xác về mặt cấu trúc (các hình dạng đi theo đường phố và các điểm dừng trên cột) ...;)
fgcartographix 10/10/13

Câu trả lời:


3

Thực tế việc tạo vòng lặp bạn muốn thực sự dễ dàng với 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;

Fiddle .

Cũng có thể dễ dàng, giả sử, tổng thời gian chuyển từ điểm dừng sang điểm dừng.

Và bạn có thể sử dụng pgRouting thường xuyên nếu chỉ bạn quản lý để chuyển đổi các tuyến đường thành biểu đồ thời gian (với các nút biểu thị thời gian khởi hành và thời gian cho chi phí tuyến đường).


Khốn nạn! Nó hoạt động ... Vẫn còn những phần mà tôi không hiểu, nhưng tôi có ý tưởng ... Tôi có thể đủ táo bạo để yêu cầu bạn có thể ghi đè thời gian chờ nếu một điểm dừng sau có thời gian chờ nhỏ hơn không? Lý thuyết là bạn có thể bỏ qua ga tàu đầu tiên nếu bạn phải đợi trên sân ga trong 20 phút và ở trong xe buýt cho đến Ga tàu 2 nếu thời gian chờ chỉ 4 phút ...;) Cảm ơn hàng triệu lần !!!
fgcartographix

1
Chỉ cần thay đổi ORDER BYmệnh đề. Hai cột đầu tiên phải ở lại vì chúng nằm trong DISTINCT ONmệnh đề nhưng ngoài ra, tất cả đều được phép: sqlfiddle.com/#!1/24fab/2
Jakub Kania

Bạn là một phù thủy !! :) Cảm ơn! Tôi đã vật lộn với điều đó quá lâu !!
fgcartographix

Chỉ cần đảm bảo rằng 4 phút không phải là một chuyến tàu sau đó một giờ :)
Jakub Kania

Không! Thời gian chờ tối đa được phép là 30 phút và thậm chí, có một biểu tượng lớn màu đỏ nói rằng điều đó thực sự không tốt! ;) Cảm ơn một lần nữa! Ngoài ra, tôi đã giành được quan điểm của mình với sếp rằng không ai thực sự ở lại trên xe buýt có thể lâu hơn 20 phút để đến ga xe lửa xa hơn trạm đầu tiên, ngay cả khi thời gian chờ đợi thực sự lâu hơn. ;)
fgcartographix

5

Trong chương trình Google Summer of Code năm ngoái, một sinh viên đã triển khai chức năng pgRouting để định tuyến đa phương thức. Nó không được đưa vào phiên bản 2.0 mới, vì vậy có thể nó không hoạt động ngay bây giờ, nhưng bạn có thể muốn xem các tài nguyên có sẵn để xem nó có hữu ích hay không:

Sẽ rất tuyệt nếu đưa chức năng này vào bản phát hành tiếp theo, vì vậy vui lòng liên hệ với danh sách gửi thư của nhà phát triển để phối hợp các công việc cần thiết trong trường hợp bạn quan tâm: http://pgrouting.org/support.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.