Besleyici otobüs servisi


9

Her şeyden önce, biraz arka plan.

Bölgesel bir transit acentesinde çalışıyorum. Besleyici otobüs servisimiz hakkında "teşhis" yapıyoruz. Kullanıcılarımızın ne kadarının arabasını almak yerine tren istasyonuna gitmek için otobüse binebileceğini bilmek istiyoruz. Geçişte birkaç kez yapıldı, ancak şimdi ana veri kaynağımız olarak gtfs kullanıyoruz, bu yüzden metodolojimizi yeniden düşünmeliyiz.

tipik besleyici otobüs servisi

Trenin "beslenmesi" olarak değerlendirilebilmesi için, bir otobüs güzergahının bir tren istasyonundan (kırmızı tamponlar) belirli bir mesafede durması gerekir. Ayrıca, tren servisi ile eşzamanlılık çok önemlidir, çünkü eğer otobüsünüz tren istasyonundan trenden yarım saat önce gelirse, bekleme süresi çok uzundur ve sabahları 20 dakika daha uyumak ve arabanızı almak isteyeceksiniz.

Diyelim ki 12. hatta A hattını (Mavi) alırsınız. 13 numaralı durakta otobüsten inersiniz. Otobüs, trenden 5 dakika önce # 1 numaralı Tren İstasyonu'na gitmek için durak olan 13 numaralı duraktan gelir. Çok iyi. Bu, otobüs güzergahını 1'den 13'e kadar olan bir durakta kullanan herkesin trenden 5 dakika önce geleceği anlamına gelir.

Ardından, çok yoğun nüfuslu bir bölgeden geçen çok sayıda okul ve geçitten geçen tren, hızını çok düşürmek zorunda kalıyor. Bu arada, otobüs 14 ila 17 numaralı duraklarda yolcuları alır ve bu trenden 10 dakika önce # 2 numaralı Tren İstasyonu'na gelir. Bu nedenle 14 ila 17 duraklarında otobüse binen yolcu, tren istasyonuna geldiğinde 10 dakika bekleme süresine sahip olacaktı. Bu otobüs hattı boyunca, 1-13 duraklarında otobüse binen yolcunun, 14-17 duraklarında otobüse binenlerin 10 dakika bekleme süresi olduğu 5 dakikalık bekleme süresi vardır.

Parkurun diğer tarafında bulunan B Hattı, 1 numaralı Tren İstasyonu'nun yanından geçmektedir, ancak durakları 1 numaralı tren istasyonunu "beslemek" olarak düşünülemeyecek kadar uzaktır. Tren istasyonundan # 2 trenden 7 dakika önce gelir (sabah acele saatinde her tren için doest; çok iyi senkronize edilir). Yani B hattı boyunca, otobüsü 1'den 59'a kadar her yere götüren yolcuların 7 dakika bekleme süresi olacaktı.

Şimdi sorum. LineA.13 ve LineA.17 duraklarının trenimi beslediğini belirledikten sonra (mekansal olarak, PostGIS'de yapıldı) ve # 13'ten önce otobüse binerken bekleme süresi 5 dakika, ancak 10 dakikalık bir bekleme süresi, önlerindeki tüm durağa bekleme süresini nasıl atayabilirim?

Postgres / PostGIS'de (pl / pgsql veya pl / python) yapmak istiyorum, ancak saf python (OS veya arcpy) da kullanabilirim.

Sanırım geriye doğru dönebilirim. Bu yüzden, uygun bir durak bulduğumda (burada LineA.17), 16, sonra 15'i durdurmak için aynı bekleme süresini atayın: ölçütlerime uyan başka bir durak bulana kadar (LineA.13) ve geri kalanını durakları, 13 ile aynı bekleme süresi.

Nasıl olsa böyle bir döngü oluşturmak için hiçbir fikrim yok. Ben SQL'de yapabileceğimi sanmıyorum, bu yüzden PostgreSQL'de yordamsal bir dil kullanmak zorunda kalacaktım.

Her besleyici durağı arasındaki rotayı bulmak için pgRouting'i kullanma konusunda bir fikrim vardı, böylece A Hattı ikiye bölünecek (1'den 13'e ve sonra 13'den 17'ye kadar). Bu daha kolay olur mu?

Bir sonraki adım, bekleme süresi olan tüm hatlardan sürüş süresini hesaplamak için pgRouting'i kullanmak (LineA.18 ve üzeri için özür dileriz!) Otobüste dakika daha mı?)

Herhangi bir fikir? Normalde şimdiye kadar yaptığım çabayı göstermek için uzun bir devam eden çalışma betiği gönderiyorum, ancak takıldım!


Diğer garip durumlar nedeniyle, yolcuların otobüsten inebileceği rotaları kesmeyi düşünüyorum. Yani, her rota "segment" bağımsız olacaktır. Duruşlarım topolojik olarak doğru olmadığında hala şekillerimi PostGIS'te nasıl kesebileceğimi anlamaya ihtiyacım var (şekiller caddeyi takip ediyor ve duruşlar direğin üstünde) ...;)
fgcartographix

Yanıtlar:


3

Aslında istediğiniz döngüyü SQL ile oluşturmak gerçekten çok kolay:

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;

Keman .

Ayrıca, diyelim ki, aktarma sürelerini durmadan durdurabilmek de kolaydır.

Ve rotaları sadece geçici grafiğe dönüştürmeyi başarırsanız düzenli pgRouting'i kullanabilirsiniz (düğümler, rota zamanları için kalkış zamanlarını ve zamanı temsil eder).


Woot! İşe yarıyor ... Hala anlamadığım parçalar var, ama fikri anlıyorum ... Daha sonraki bir durağın daha küçük bir bekleme süresine sahip olması durumunda bekleme süresini geçersiz kılabileceğinizi sorabilecek kadar cesur olabilir miyim? Teori, platformda 20 dakika beklemek ve beklemek sadece 4 dakika ise tren istasyonu 2'ye kadar otobüste kalmak zorunda kalırsanız ilk tren istasyonunu atlayabilirsiniz ...;) Milyonlarca kez teşekkürler !!!
fgcartographix

1
Sadece ORDER BYmaddeyi değiştir . İlk iki sütun DISTINCT ONyan tümcede bulundukları için kalmalıdır
Jakub Kania

Sen bir büyücüsün !! :) Teşekkürler! Ben çok uzun zamandır bununla mücadele ediyorum!
fgcartographix

Sadece bir saat sonra bir tren için 4 dakika olmadığından emin olun :)
Jakub Kania

Hayır! İzin verilen maksimum bekleme süresi 30 dakikadır ve buna rağmen, gerçekten iyi olmadığını söyleyen büyük bir kırmızı sembol var! ;) Tekrar teşekkürler! Ayrıca, patronumla, kimsenin gerçekten bir otobüste kalmayacağını, bekleme süresi gerçekten daha uzun olsa bile, ilkinden daha uzak bir tren istasyonuna gitmek için 20 dakika daha uzun olmayacağını anladım. ;)
fgcartographix

5

Geçen yılki Google Summer of Code programında bir öğrenci çok modlu yönlendirme için pgRouting işlevi uyguladı. Yeni 2.0 sürümüne girmedi, bu yüzden muhtemelen şu anda çalışmıyor, ancak yararlı olup olmadığını görmek için mevcut kaynaklara göz atmak isteyebilirsiniz:

Bu işlevi bir sonraki sürüme dahil etmek güzel olacaktır, bu yüzden ilgilenmeniz durumunda gerekli çalışmaları koordine etmek için lütfen geliştirici posta listesine başvurun: http://pgrouting.org/support.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.