บริการรถบัสป้อน


9

ก่อนอื่นมีพื้นหลังเล็กน้อย

ฉันทำงานให้กับ บริษัท ขนส่งในภูมิภาค เรากำลังทำการ "วินิจฉัย" เกี่ยวกับบริการรถบัสของเรา เราต้องการทราบว่าสัดส่วนของผู้ใช้ของเราสามารถขึ้นรถบัสเพื่อไปที่สถานีรถไฟแทนที่จะนั่งรถของพวกเขาได้ ผ่านไปหลายครั้ง แต่ตอนนี้เราใช้ gtfs เป็นแหล่งข้อมูลหลักของเราดังนั้นเราจึงต้องทบทวนวิธีการของเราใหม่

บริการรถบัสป้อนทั่วไป

หากต้องการได้รับการพิจารณาให้เป็น "การให้อาหาร" รถไฟเส้นทางรถเมล์ต้องหยุดภายในระยะทางที่กำหนดจากสถานีรถไฟ (บัฟเฟอร์สีแดง) การซิงโครไนซ์กับบริการรถไฟนั้นสำคัญมากเพราะถ้ารถบัสของคุณมาถึงสถานีรถไฟครึ่งชั่วโมงก่อนรถไฟเวลาที่รอจะนานเกินไปและคุณจะต้องนอนอีก 20 นาทีในตอนเช้าและขึ้นรถของคุณ

สมมติว่าคุณใช้สาย A (สีฟ้า) ที่ป้าย 12 คุณก้าวออกจากรถที่ป้าย 13 รถบัสมาถึงที่ป้าย 13 ซึ่งเป็นป้ายหยุดเพื่อไปที่สถานีรถไฟ # 1 5 นาทีก่อนรถไฟ นั่นเป็นสิ่งที่ดีมาก นั่นหมายความว่าทุกคนที่ใช้เส้นทางรถเมล์ที่ป้าย 1-13 รวมถึง 5 นาทีก่อนรถไฟ

จากนั้นรถไฟจะผ่านบริเวณที่มีประชากรหนาแน่นมากโดยมีโรงเรียนและทางแยกถูกบังคับให้ลดความเร็วลงมาก ในขณะเดียวกันรถบัสจะไปรับผู้โดยสารที่ป้ายที่ 14 ถึง 17 และมาถึงที่สถานีรถไฟ # 2 10 นาทีก่อนรถไฟ ผู้โดยสารนั่งรถบัสที่ป้าย 14 ถึง 17 ทุกคนจะมีเวลารอ 10 นาทีเมื่อมาถึงสถานีรถไฟ ดังนั้นตามแนวรถบัสผู้โดยสารที่ขึ้นรถบัสที่ป้ายที่ 1 ถึง 13 มีเวลารอ 5 นาทีเมื่อผู้ที่ขึ้นรถที่ป้ายที่ 14 ถึง 17 มีเวลารอ 10 นาที

บรรทัด B ในอีกด้านหนึ่งของเส้นทางผ่านใกล้สถานีรถไฟหมายเลข 1 แต่จุดจอดนั้นไกลเกินกว่าที่จะพิจารณาว่า "ให้อาหาร" สถานีรถไฟ # 1 มาถึงที่สถานีรถไฟ # 2 7 นาทีก่อนรถไฟ (ลงมือทำทุกขบวนในช่วงชั่วโมงเร่งด่วนตอนเช้า ดังนั้นผู้โดยสารตามสาย B ขึ้นรถบัสทุกที่ตั้งแต่ป้าย 1 ถึง 59 จะมีเวลารอ 7 นาที

ตอนนี้คำถามของฉัน เมื่อฉันได้พิจารณาแล้วว่าหยุด LineA.13 และ LineA.17 กำลังให้อาหารรถไฟของฉัน (มันถูกทำในเชิงพื้นที่ใน PostGIS) และเวลาที่รอคอยเมื่อขึ้นรถบัสที่ป้ายก่อนหน้า # 13 คือ 5 นาที แต่หลังจากนั้น เวลารอ 10 นาทีฉันจะกำหนดเวลารอให้หยุดทั้งหมดก่อนพวกเขาได้อย่างไร

ฉันต้องการทำใน Postgres / PostGIS (pl / pgsql หรือ pl / python) แต่ฉันสามารถใช้ python บริสุทธิ์ (OS หรือ arcpy) ได้เช่นกัน

ฉันทำได้ฉันคิดว่าวนไปข้างหลัง ดังนั้นเมื่อฉันพบจุดหยุดที่เหมาะกับ (ที่นี่ LineA.17) ให้กำหนดเวลารอเดียวกันเพื่อหยุด 16 และ 15 ... จนกว่าฉันจะพบจุดหยุดที่ตรงกับเกณฑ์ของฉัน (LineA.13) แล้วกำหนดส่วนที่เหลือ ของการหยุดเวลารอเดียวกับ 13

ฉันไม่รู้ว่าจะสร้างลูปอย่างไร ฉันไม่คิดว่าฉันสามารถทำได้ใน SQL ดังนั้นฉันจึงต้องใช้ภาษาขั้นตอนใน PostgreSQL

ฉันมีความคิดในการใช้ pgRouting เพื่อค้นหาเส้นทางระหว่างตัวป้อนแต่ละตัวหยุดเพื่อให้วิธีนั้น Line A จะแยกออกเป็นสองส่วน (หยุด 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 เป็นประจำถ้าเพียงคุณจัดการเปลี่ยนเส้นทางเป็นกราฟเวลา (ด้วยโหนดที่แสดงเวลาออกเดินทางและเวลาสำหรับต้นทุนเส้นทาง)


Woot! มันใช้งานได้ ... ยังมีบางส่วนที่ฉันไม่เข้าใจ แต่ฉันได้รับความคิด ... ฉันจะกล้าพอที่จะขอให้คุณเขียนทับเวลารอถ้าการหยุดภายหลังมีเวลารอน้อยกว่าหรือไม่ ทฤษฎีคือคุณสามารถข้ามสถานีรถไฟแรกถ้าคุณต้องรอบนแพลตฟอร์มเป็นเวลา 20 นาทีและอยู่ในรถบัสจนกว่าสถานีรถไฟ 2 หากรอเพียง 4 นาที ... ;) ขอบคุณล้านครั้ง !!!
fgcartographix

1
เพียงแค่เปลี่ยนORDER BYข้อ สองคอลัมน์แรกจะต้องอยู่ต่อเนื่องจากคอลัมน์อยู่ในDISTINCT ONประโยค แต่มิฉะนั้นจะอนุญาตทั้งหมด: sqlfiddle.com/#!1/24fab/2
Jakub Kania

คุณเป็นพ่อมด !! :) ขอบคุณ! ฉันดิ้นรนกับสิ่งนั้นมานานเกินไป !!
fgcartographix

เพียงแค่ให้แน่ใจว่า 4 นาทีไม่ได้ใช้สำหรับรถไฟที่จะใช้เวลาหนึ่งชั่วโมงต่อมา :)
Jakub Kania

Nah! ระยะเวลารอคอยสูงสุดที่อนุญาตคือ 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.