Add more information regarding bus system
I've found a new URL that allows for as much oncoming buses as one prefers, and with the via-destinations and all other required information included. However, it's not an urgent thing to do right now, so I'm leaving it as a comment for further inclusion.
- Author
- Maarten Vangeneugden
- Date
- Aug. 24, 2018, 4:54 a.m.
- Hash
- 2aa408b31be741dd19435e1f102d1cec1553461a
- Parent
- 4eb90f67da7223f6368adb2eca5073fdbdbe5a47
- Modified files
- administration/bus.py
- docs/thesis/bussen.org
administration/bus.py ¶
12 additions and 1 deletion.
View changes Hide changes
1 |
1 |
import json |
2 |
2 |
import requests |
3 |
3 |
from datetime import datetime, tzinfo |
4 |
4 |
from django.core.cache import caches |
5 |
5 |
|
6 |
6 |
|
7 |
7 |
def departures(stop, amount=0): |
8 |
8 |
pass |
9 |
9 |
""" Returns the remaining departures of buses from the given stop for this day. |
10 |
10 |
If amount is given, a maximum amount of departures will be returned. |
11 |
11 |
Departures in the past are never returned.""" |
12 |
12 |
#today = datetime.now().strftime("%d-%m-%Y") |
13 |
13 |
#cache = caches["departures"] |
14 |
14 |
#cached_data = cache.get(stop) |
15 |
15 |
#if cached_data is None: |
16 |
16 |
####received_json_data = requests.get('https://www.delijn.be/rise-api-core/dienstregeling/halteDienstregeling/'+stop+'/'+today+'/nl').json() |
17 |
17 |
#buses = list() |
18 |
18 |
#for bus_json in received_json_data['halteDoorkomsten']: |
19 |
19 |
#bus = dict() |
20 |
20 |
## Some destinations should be a little bit more descriptive, they're handled here hardcoded |
21 |
21 |
#destination = bus_json["bestemming"] |
22 |
22 |
#bus["time"] = bus_json["lijn"]["tijdstip"] |
23 |
23 |
|
24 |
24 |
# TODO: I've opted not to use the caching system for a complete day timetable, because it wouldn't load |
25 |
25 |
# via destinations and give a rather hard time to work with. So I'm gonna stick with the simple |
26 |
26 |
# realtime thingy, which does the job well enough. |
27 |
27 |
|
28 |
28 |
|
+ |
29 |
# Where the "40" can be any number. That one does show the via. |
+ |
30 |
|
+ |
31 |
|
29 |
32 |
|
30 |
33 |
def arrivals(stops): |
31 |
34 |
""" Returns the a list of buses that stop at the given stops. |
32 |
35 |
The buses are in a list, with dicts with the following keys: |
33 |
36 |
- number :: The line number of the bus |
34 |
37 |
- color :: The hex color to display for this bus line |
35 |
38 |
- destination :: The name of the destination (already formatted properly) |
36 |
39 |
- time :: The datetime of the departure |
37 |
40 |
- via :: If the bus does a detour, the name is stored here |
38 |
41 |
The list can have a maximum of 20 entries. |
39 |
42 |
The subroutine throws an exception if no stops were given. |
40 |
43 |
""" |
41 |
44 |
stops_string = stops.pop(0) # This returns an error in an empty list, which is supposed to happen if no stops are sent |
42 |
45 |
while len(stops) != 0: |
43 |
46 |
stops_string = stops_string + "+" + stops.pop(0) |
44 |
47 |
received_json_data = requests.get('https://www.delijn.be/rise-api-core/haltes/Multivertrekken/'+stops_string+'/20').json() |
45 |
48 |
buses = list() |
46 |
49 |
for bus_json in received_json_data["lijnen"]: |
47 |
50 |
bus = dict() |
48 |
51 |
# Some destinations should be a little bit more descriptive, they're handled here hardcoded |
49 |
52 |
destination = bus_json["bestemming"] |
50 |
53 |
if destination in ["Hasselt", "Genk", "Neerpelt", "Tongeren", "Maastricht", "Bilzen", "Diepenbeek"]: |
51 |
54 |
destination += " Station" |
52 |
55 |
bus["destination"] = destination |
+ |
56 |
destination = "Kiewit Kinderboerderij" |
+ |
57 |
elif destination == "Beringen": |
+ |
58 |
destination = "Beringen Bogaersveld" |
+ |
59 |
elif destination == "Maaseik": |
+ |
60 |
destination = "Maaseik Van Eycklaan" |
+ |
61 |
bus["destination"] = destination |
53 |
62 |
bus["number"] = bus_json["lijnNummerPubliek"] |
54 |
63 |
bus["color"] = bus_json["kleurAchterGrond"] |
55 |
64 |
unix_time = str(bus_json["vertrekCalendar"])[:10] # De Lijn API returns too many trailing zeros |
56 |
65 |
bus["time"] = datetime.fromtimestamp(int(unix_time)) |
57 |
66 |
# About via: |
58 |
67 |
# The viaBestemming has an annoying tendency to uppercase all destinations. |
59 |
68 |
# Some can be hardcoded to the right destination, others just need to be |
60 |
69 |
# properly capitalized. |
61 |
70 |
via = bus_json["viaBestemming"] |
62 |
71 |
if via is not None: |
63 |
72 |
if via == "GENK": |
64 |
73 |
via = "Genk Station" |
65 |
74 |
elif via == "MM VILL & GENK": |
66 |
- | via = "Genk Station en Maasmechelen Village" |
+ |
75 |
via = "Genk Station en Maasmechelen Village" |
67 |
76 |
elif via == "UNIVERSITEIT": |
68 |
77 |
via = "Universiteit Hasselt" |
69 |
78 |
elif via == "HASSELT": |
70 |
79 |
via = "Hasselt station" |
71 |
80 |
elif via == "PATERSPLEIN": |
72 |
81 |
via = "Diepenbeek Patersplein" |
73 |
82 |
else: |
+ |
83 |
via = "Diepenbeek Station" |
+ |
84 |
else: |
74 |
85 |
via = via.title() # If it's anything else just capitalize and hope for the best |
75 |
86 |
bus["via"] = via |
76 |
87 |
buses.append(bus) |
77 |
88 |
return buses |
78 |
89 |
docs/thesis/bussen.org ¶
1 addition and 36 deletions.
View changes Hide changes
1 |
1 |
De studenten willen graag snel te weten komen wanneer hun bus vertrekt van de |
2 |
2 |
campus. Daarom heeft Joeni een aparte pagina waarop alle volgende twintig bussen |
3 |
3 |
van elke campus opgelijst worden. |
4 |
4 |
|
5 |
5 |
De lijst van bussen past zich automatisch aan aan de schermbreedte van het |
6 |
6 |
gebruikte toestel. De verschillende bussen worden voorzien van de bestemming, de |
7 |
7 |
lijn (en de omkaderingen in de lijnkleur), en natuurlijk het uur van vertrek. |
8 |
8 |
Daarnaast wordt er ook weergegeven hoe lang het nog duurt tot het vertrek vanaf |
9 |
9 |
nu (bijvoorbeeld "Over 25 minuten") en wordt er (indien van toepassing) |
10 |
10 |
aangegeven of er een "via"-bestemming is. |
11 |
11 |
|
12 |
12 |
Deze data wordt afgehaald van de website van De Lijn via hetzelfde systeem dat |
13 |
13 |
op dit moment op de TV-schermen in de hoofdgang van de campus Diepenbeek |
14 |
14 |
gebruikt wordt. Daardoor was het aangaan van een licentie met De Lijn voor het |
15 |
15 |
gebruik van hun data niet nodig, en gebeurt alles rechtstreeks en real-time. |
16 |
16 |
|
17 |
17 |
Dit dient dan als een vervanging voor de twee knoppen die op de pagina van |
18 |
18 |
=uhasselt.be/studenten= staan, die ook minder informatie bieden dan wat op Joeni |
19 |
19 |
te vinden is. |
20 |
- | |
+ |
20 |
|
21 |
21 |
#+CAPTION: Afbeelding van hoe de bussen-pagina er op een doordeweekse dag uitziet. |
22 |
22 |
#+NAME: fig:buses |
23 |
23 |
[[./img/bus.png]] |
24 |
24 |
|
25 |
- | *** Snelheid website De Lijn |
26 |
- | Vergeleken met Joeni is de gebruikssnelheid van de website van De Lijn redelijk |
27 |
- | lang: Het inladen van de eerstvolgende 20 bussen neemt _per request_ minstens |
28 |
- | 1000 milliseconden in beslag[fn:location], wat moeilijk te tolereren valt voor |
29 |
- | een actie die technisch gezien gewoon een SQL-request op een databank is, en een |
30 |
- | HTTP-antwoord terugsturen (van nog geen 5kB). Daarnaast zou dit ook betekenen |
31 |
- | dat élke keer een student deze pagina opvraagt, hierop zou moeten wachten. |
32 |
- | Bijkomend neveneffect is dat dit de servers van De Lijn misschien zwaar |
33 |
- | beïnvloedt, maar dat doet niet veel ter zake. |
34 |
- | |
35 |
- | De oplossing hiervoor is door gebruik te maken van Joeni's cachesysteem: |
36 |
- | |
37 |
- | In plaats van voor elke keer dat een student de busregeling wilt controleren een |
38 |
- | request naar De Lijn te sturen, wordt /de volledige dagregeling/ slechts één |
39 |
- | keer opgeslagen op de servers. Dit is gepland om elke nacht om 3 uur te |
40 |
- | gebeuren, een moment waarop er weinig hinder is van zowel technische als humane |
41 |
- | kant. |
42 |
- | |
43 |
- | Deze dienstregeling wordt dan in de cache opgeslagen van Joeni, en kan bij elke |
44 |
- | aanvraag direct aangereikt worden. |
45 |
- | |
46 |
- | Hier is slechts een klein nadeel aan verbonden: Het aanvragen van een |
47 |
- | volledige dienstregeling duurt langer (om en bij 4 seconden), maar daarvan zal |
48 |
- | niemand iets merken omdat het 's nachts gebeurt. De informatie is echter wel |
49 |
- | niet meer /real time/, maar De Lijn houdt sowieso geen vertragingen en |
50 |
- | afschaffingen van hun bussen bij, dus dat maakt geen verschil. |
51 |
- | |
52 |
- | Een ander nadeel is dat het de code van Joeni wat complexer maakt; er moet met |
53 |
- | een cache gehandeld worden, en in tegenstelling tot de /realtime/-optie, moet er |
54 |
- | zelf gekeken worden welke bussen nog vertrekken die dag. Maar dat is geen groot |
55 |
- | "offer" vergeleken met wat ervoor terugkomt. |
56 |
- | |
57 |
- | [fn:location] Snelheden gerapporteerd tijdens testen met Firefox Developer |
58 |
- | Edition op GNU/Linux. |
59 |
- |