buses.py

Sat, 12 Jan 2019 01:38:58 +0200

author
Teemu Piippo <teemu@hecknology.net>
date
Sat, 12 Jan 2019 01:38:58 +0200
changeset 136
27324a81beca
parent 134
4ac0f2e2ec4e
permissions
-rw-r--r--

stuff

0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
1 #!/usr/bin/env python3
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
2 import enum, json
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
3 from sys import stderr
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
4 from datetime import date, time, datetime, timedelta
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
5 from copy import copy
2
48efa8ca14dd Suppea ajovuoroesitys
Teemu Piippo <teemu@hecknology.net>
parents: 0
diff changeset
6 from misc import *
7
f3791dccfd03 Käännetty tiedostojen nimet englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 5
diff changeset
7 from geometry import *
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
8
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
9 def transform_trip_reference(reference):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
10 return reference
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
11
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
12 class BusTrip:
114
b736478416d4 added map to trip view
Teemu Piippo <teemu@hecknology.net>
parents: 109
diff changeset
13 def __init__(self, reference, route, service, length, block_id, shape):
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
14 self.reference, self.route, self.service, self.block_id = reference, route, service, block_id
22
3d094a804af8 lisää muutoksia
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
15 self.length = length
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
16 self.schedule = []
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
17 self.name = transform_trip_reference(reference)
114
b736478416d4 added map to trip view
Teemu Piippo <teemu@hecknology.net>
parents: 109
diff changeset
18 self.shape = str(shape)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
19 def __repr__(self):
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
20 return 'all_trips[%r]' % self.name
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
21 def contains_stop(self, stop):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
22 for halt in self.schedule:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
23 if halt.stop is stop:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
24 return halt
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
25 else:
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
26 return None
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
27 def is_served_at(self, day):
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
28 try:
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
29 return self.service in services_for_day[day]
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
30 except KeyError:
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
31 return False
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
32 def concise_schedule(self, starting_stop = None):
72
65408ed066b3 Refactor
Teemu Piippo <teemu@hecknology.net>
parents: 71
diff changeset
33 if starting_stop and starting_stop in self.schedule:
65408ed066b3 Refactor
Teemu Piippo <teemu@hecknology.net>
parents: 71
diff changeset
34 schedule = copy(self.schedule)
65408ed066b3 Refactor
Teemu Piippo <teemu@hecknology.net>
parents: 71
diff changeset
35 schedule = schedule[schedule.index(starting_stop):]
65408ed066b3 Refactor
Teemu Piippo <teemu@hecknology.net>
parents: 71
diff changeset
36 else:
65408ed066b3 Refactor
Teemu Piippo <teemu@hecknology.net>
parents: 71
diff changeset
37 schedule = self.schedule
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
38 if profile['regions']['use-regions']:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
39 used_areas = set()
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
40 result = []
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
41 for halt in schedule:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
42 stop = halt.stop
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
43 if stop.region and stop.region not in used_areas:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
44 used_areas.add(stop.region)
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
45 result.append(stop.region)
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
46 return result
5
a65b680f1774 Paljon asioita
Teemu Piippo <teemu@hecknology.net>
parents: 4
diff changeset
47 else:
72
65408ed066b3 Refactor
Teemu Piippo <teemu@hecknology.net>
parents: 71
diff changeset
48 return [halt.stop.name for halt in schedule]
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
49
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
50 class BusRoute:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
51 def __init__(self, entry):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
52 self.id = entry['route_id']
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
53 self.reference = entry['route_short_name']
28
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
54 self.trips = set()
90
Teemu Piippo <teemu@hecknology.net>
parents: 88
diff changeset
55 self.service = None
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
56 def __repr__(self):
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
57 return 'routes[%r]' % self.reference
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
58
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
59 class BusService:
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
60 def __init__(self, reference):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
61 self.reference = reference
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
62 self.dates = set()
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
63 def __repr__(self):
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
64 return 'services[%r]' % self.reference
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
65
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
66 class BusStop:
29
2c78e68d7363 Mööö
Teemu Piippo <teemu@hecknology.net>
parents: 28
diff changeset
67 def __init__(self, reference, name, location, code = None):
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
68 self.reference, self.name, self.location = reference, name, location
29
2c78e68d7363 Mööö
Teemu Piippo <teemu@hecknology.net>
parents: 28
diff changeset
69 self.code = code or reference
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
70 self.cluster = None
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
71 self.pairs = set() # samannimiset lähellä olevat pysäkit
28
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
72 self.involved_trips = set()
90
Teemu Piippo <teemu@hecknology.net>
parents: 88
diff changeset
73 self.services = set()
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
74 def __repr__(self):
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
75 return 'bus_stops[%r]' % self.reference
127
2bc0529d44a5 bus live information
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
76 def schedule(self, *, max_amount = 50, max_past = 0, arrivals = False):
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
77 '''
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
78 Hakee tämän pysäkin seuraavat `määrä` lähtöä. Päätepysäkille saapuvia busseja ei
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
79 lasketa. Palauttaa pysähdykset listana jossa alkiot ovat muotoa (aika, halt),
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
80 jossa:
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
81 - `aika` on saapumishetki muotoa datetime ja
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
82 - `halt` on vastaava BusHalt olio.
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
83
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
84 Mikäli pysäkille ei ole määrätty riittävästi pysähdyksiä kalenterissa, tuloslista
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
85 jää alimittaiseksi, mahdollisesti jopa tyhjäksi.
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
86 '''
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
87 result = []
20
3199e289ae62 - Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents: 19
diff changeset
88 # -1 päivää yövuoroja varten
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
89 date = today() - timedelta(days = 1)
127
2bc0529d44a5 bus live information
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
90 gone_list = []
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
91 # Niin kauan kuin aikatauluja ei ole vielä tarpeeksi,
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
92 while len(result) < max_amount:
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
93 try:
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
94 # hae nykyisen päivän aikataulut ja lisää ne,
127
2bc0529d44a5 bus live information
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
95 schedule = self.schedule_for_day(date, arrivals = arrivals, allow_gone = True)
2bc0529d44a5 bus live information
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
96 for entry in schedule:
2bc0529d44a5 bus live information
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
97 if entry['gone']:
2bc0529d44a5 bus live information
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
98 gone_list.append(entry)
2bc0529d44a5 bus live information
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
99 else:
2bc0529d44a5 bus live information
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
100 result.append(entry)
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
101 except ValueError:
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
102 # paitsi jos mentiin kalenterin ulkopuolelle, jolloin lopetetaan,
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
103 break
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
104 # ja siirry seuraavaan päivään.
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
105 date += timedelta(1)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
106 # Typistä lopputulos haluttuun tulosmäärään.
127
2bc0529d44a5 bus live information
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
107 if gone_list:
2bc0529d44a5 bus live information
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
108 result = gone_list[-max_past:] + result
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
109 return result[:max_amount]
109
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
110 def schedule_for_day(self, date, *, arrivals = False, allow_gone = False):
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
111 '''
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
112 Hakee pysäkin aikataulut tiettynä päivänä.
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
113 '''
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
114 # Jos päädyttiin aikataulukalenterin ulkopuolelle, niin tuotetaan virhe. Jos vain
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
115 # palautettaisiin tyhjä result, niin algoritmi jatkaisi etsintää loputtomiin.
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
116 if date > viimeinen_käyttöpäivä:
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
117 raise ValueError('tried to retrieve schedule for date %s which is outside schedule data' % date)
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
118 result = []
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
119 # Jokaiselle ajovuorolle,
28
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
120 for trip in self.involved_trips:
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
121 # jos tämä ajovuoro ajetaan tänä päivänä
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
122 if trip.is_served_at(date):
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
123 # ja jos tämä trip pysähtyy tällä pysäkillä, ei kuitenkaan saapuen
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
124 # päätepysäkille,
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
125 stop = trip.contains_stop(self)
31
60045b362d71 - Ajovuoroa ei enää esitetä kahdessa välilehdessä vaan puukuvaimessa
Teemu Piippo <teemu@hecknology.net>
parents: 30
diff changeset
126 if stop and (arrivals or not stop.is_arrival) and stop is not trip.schedule[-1]:
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
127 # ja jos tämä halt on tulevaisuudessa,
75
4f8a67d5d79e Käytä lähtöaikoja
Teemu Piippo <teemu@hecknology.net>
parents: 72
diff changeset
128 stop_time = datetime.combine(date, time()) + stop.departure_time
127
2bc0529d44a5 bus live information
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
129 gone = stop_time + timedelta(minutes = 1) < now()
2bc0529d44a5 bus live information
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
130 if allow_gone or not gone:
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
131 # lisää halt listaan.
18
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
132 result.append({
77
83cd29dee853 stop_week
Teemu Piippo <teemu@hecknology.net>
parents: 75
diff changeset
133 'date': date,
83cd29dee853 stop_week
Teemu Piippo <teemu@hecknology.net>
parents: 75
diff changeset
134 'offset': stop.departure_time,
18
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
135 'time': stop_time,
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
136 'trip': trip,
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
137 'stop': stop,
127
2bc0529d44a5 bus live information
Teemu Piippo <teemu@hecknology.net>
parents: 114
diff changeset
138 'gone': gone,
18
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
139 })
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
140 # Lajittele lopputulos saapumisajan mukaan.
18
1c8ff93fbfac Lisää käännöstä
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
141 result.sort(key = lambda schedule_entry: schedule_entry['time'])
17
fa3c822859b5 Refaktorioitu aikatauluhaku
Teemu Piippo <teemu@hecknology.net>
parents: 15
diff changeset
142 return result
90
Teemu Piippo <teemu@hecknology.net>
parents: 88
diff changeset
143 @property
Teemu Piippo <teemu@hecknology.net>
parents: 88
diff changeset
144 def typename(self):
Teemu Piippo <teemu@hecknology.net>
parents: 88
diff changeset
145 if self.services == {'train'}:
Teemu Piippo <teemu@hecknology.net>
parents: 88
diff changeset
146 return 'train-station'
Teemu Piippo <teemu@hecknology.net>
parents: 88
diff changeset
147 elif self.services == {'tram'}:
Teemu Piippo <teemu@hecknology.net>
parents: 88
diff changeset
148 return 'tram-stop'
Teemu Piippo <teemu@hecknology.net>
parents: 88
diff changeset
149 elif self.services == {'ferry'}:
Teemu Piippo <teemu@hecknology.net>
parents: 88
diff changeset
150 return 'ferry-terminal'
Teemu Piippo <teemu@hecknology.net>
parents: 88
diff changeset
151 else:
Teemu Piippo <teemu@hecknology.net>
parents: 88
diff changeset
152 return 'bus-stop'
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
153
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
154 class BusHalt:
134
4ac0f2e2ec4e removed uuid mapping
Teemu Piippo <teemu@hecknology.net>
parents: 127
diff changeset
155 def __init__(self, arrival_time, departure_time, stop, trip, traveled_distance, visitnumber):
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
156 self.arrival_time, self.departure_time, self.stop, self.trip = arrival_time, departure_time, \
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
157 stop, trip
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
158 self.traveled_distance = traveled_distance
134
4ac0f2e2ec4e removed uuid mapping
Teemu Piippo <teemu@hecknology.net>
parents: 127
diff changeset
159 self.visitnumber = visitnumber
23
3a495bc4b7b5 optimointia
Teemu Piippo <teemu@hecknology.net>
parents: 22
diff changeset
160 @property
29
2c78e68d7363 Mööö
Teemu Piippo <teemu@hecknology.net>
parents: 28
diff changeset
161 def is_arrival(self):
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
162 if profile['regions']['use-regions']:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
163 if not hasattr(self, 'cachedIsArrival'):
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
164 if self.stop.region:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
165 iterator = iter(self.trip.schedule)
29
2c78e68d7363 Mööö
Teemu Piippo <teemu@hecknology.net>
parents: 28
diff changeset
166 stop = next(iterator)
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
167 while stop is not self:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
168 stop = next(iterator)
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
169 for stop in iterator:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
170 if stop.stop.region != self.stop.region:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
171 self.cachedIsArrival = False
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
172 break
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
173 else:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
174 self.cachedIsArrival = True
29
2c78e68d7363 Mööö
Teemu Piippo <teemu@hecknology.net>
parents: 28
diff changeset
175 else:
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
176 self.cachedIsArrival = False
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
177 return self.cachedIsArrival
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
178 else:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
179 return self == self.trip.schedule[-1]
94
e27c18f080d1 added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents: 93
diff changeset
180 def departure_datetime(self, date):
e27c18f080d1 added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents: 93
diff changeset
181 import datetime
e27c18f080d1 added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents: 93
diff changeset
182 return datetime.datetime.combine(date, datetime.time()) + self.departure_time
e27c18f080d1 added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents: 93
diff changeset
183 def arrival_datetime(self, date):
e27c18f080d1 added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents: 93
diff changeset
184 import datetime
e27c18f080d1 added an interesting trip portal
Teemu Piippo <teemu@hecknology.net>
parents: 93
diff changeset
185 return datetime.datetime.combine(date, datetime.time()) + self.arrival_time
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
186 def __repr__(self):
134
4ac0f2e2ec4e removed uuid mapping
Teemu Piippo <teemu@hecknology.net>
parents: 127
diff changeset
187 return 'BusHalt(%r, %r, %r, %r, %r, %r)' % (self.arrival_time, self.departure_time, self.stop, self.trip, self.traveled_distance, self.visitnumber)
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
188 def sign(self, long = False):
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
189 from busroute import reduce_schedule
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
190 return reduce_schedule(
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
191 route = self.trip.concise_schedule(self),
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
192 trip_length = self.trip.length - self.traveled_distance,
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
193 long = long,
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
194 )
134
4ac0f2e2ec4e removed uuid mapping
Teemu Piippo <teemu@hecknology.net>
parents: 127
diff changeset
195 @property
4ac0f2e2ec4e removed uuid mapping
Teemu Piippo <teemu@hecknology.net>
parents: 127
diff changeset
196 def primary_key(self):
4ac0f2e2ec4e removed uuid mapping
Teemu Piippo <teemu@hecknology.net>
parents: 127
diff changeset
197 arrival_time = self.trip.schedule[0].arrival_time;
4ac0f2e2ec4e removed uuid mapping
Teemu Piippo <teemu@hecknology.net>
parents: 127
diff changeset
198 return self.trip.block_id + '-' + str(int(arrival_time.seconds)) + '-' + str(self.visitnumber)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
199
109
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
200 class BusStopCluster:
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
201 def __init__(self):
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
202 self.stops = set()
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
203 self.cached_center = None
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
204 self.name = None
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
205 @property
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
206 def url_name(self):
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
207 return self.name.lower().replace('(', '').replace(')', '').replace(' ', '-')
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
208 def add_stop(self, stop):
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
209 assert not stop.cluster
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
210 stop.cluster = self
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
211 self.stops.add(stop)
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
212 self.cached_center = None
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
213 @property
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
214 def center(self):
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
215 if not self.cached_center:
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
216 if self.stops:
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
217 from statistics import median
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
218 pointtype = type(next(iter(self.stops)).location)
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
219 self.cached_center = pointtype(
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
220 median(stop.location.x for stop in self.stops),
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
221 median(stop.location.y for stop in self.stops),
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
222 )
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
223 else:
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
224 raise ValueError('an empty cluster has no center point')
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
225 return self.cached_center
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
226 def merge(self, other):
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
227 for bus_stop in other.stops:
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
228 bus_stop.cluster = self
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
229 self.stops |= other.stops
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
230 other.stops = set()
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
231 other.cached_center = None
136
Teemu Piippo <teemu@hecknology.net>
parents: 134
diff changeset
232 def schedule(self, *, max_amount = 50, max_past = 0, arrivals = False):
109
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
233 result = []
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
234 for stop in self.stops:
136
Teemu Piippo <teemu@hecknology.net>
parents: 134
diff changeset
235 result += stop.schedule(max_amount = max_amount, max_past = max_past, arrivals = arrivals)
109
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
236 result.sort(key = lambda schedule_entry: schedule_entry['time'])
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
237 return result[:max_amount]
114
b736478416d4 added map to trip view
Teemu Piippo <teemu@hecknology.net>
parents: 109
diff changeset
238 def __lt__(self, other):
b736478416d4 added map to trip view
Teemu Piippo <teemu@hecknology.net>
parents: 109
diff changeset
239 return (self.name and other.name) and (self.name < other.name) or (id(self) < id(other))
109
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
240
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
241 class CustomBusStopCluster(BusStopCluster):
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
242 def __init__(self, *, name, stops):
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
243 super().__init__()
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
244 self.name = name
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
245 self.stops = stops
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
246 def add_stop(self, stop):
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
247 return NotImplemented
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
248 @property
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
249 def url_name(self):
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
250 from urllib.request import quote
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
251 return 'custom?stops=' + ';'.join(stop.code for stop in self.stops) + '&name=' + quote(self.name)
88a5110b66ba added some features
Teemu Piippo <teemu@hecknology.net>
parents: 94
diff changeset
252
114
b736478416d4 added map to trip view
Teemu Piippo <teemu@hecknology.net>
parents: 109
diff changeset
253 from collections import defaultdict
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
254 routes = {}
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
255 routes_per_id = {}
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
256 all_trips = {}
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
257 services = {}
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
258 bus_stops = {}
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
259 all_clusters = set()
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
260 viimeinen_käyttöpäivä = None
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
261 clusters_by_name = {}
24
e6bdb9c54096 Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents: 23
diff changeset
262 services_for_day = {}
114
b736478416d4 added map to trip view
Teemu Piippo <teemu@hecknology.net>
parents: 109
diff changeset
263 shapes = defaultdict(list)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
264
93
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
265 def load_buses(gtfs_zip_path):
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
266 global viimeinen_käyttöpäivä
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
267 from zipfile import ZipFile
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
268 with ZipFile(gtfs_zip_path) as gtfs_zip:
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
269 print('Loading routes... ', file = stderr, end = '', flush = True)
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
270 with gtfs_zip.open('routes.txt') as file:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
271 for row in read_csv(map(bytes.decode, file)):
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
272 route = BusRoute(row)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
273 routes[route.reference] = route
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
274 routes_per_id[route.id] = route
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
275 print('%d routes' % len(routes), file = stderr)
93
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
276 # Add services
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
277 import re
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
278 service_patterns = {}
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
279 if 'service-patterns' in profile:
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
280 for service_type, regexps in profile['service-patterns'].items():
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
281 service_patterns[service_type] = {re.compile(regexp) for regexp in regexps.split('@')}
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
282 if 'services' in profile and profile['services'].get('default-service'):
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
283 print('Tagging services...', end = '')
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
284 for route in routes.values():
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
285 for service_type, regexps in service_patterns.items():
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
286 if any(regexp.match(route.reference) for regexp in regexps):
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
287 route.service = service_type
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
288 break
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
289 else:
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
290 route.service = profile['services']['default-service']
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
291 print('')
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
292 print('Loading trips... ', file = stderr, end = '', flush = True)
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
293 shape_distances = {}
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
294 try:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
295 with gtfs_zip.open('shapes.txt') as file:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
296 for row in read_csv(map(bytes.decode, file)):
114
b736478416d4 added map to trip view
Teemu Piippo <teemu@hecknology.net>
parents: 109
diff changeset
297 list.append(shapes[row['shape_id']], (row['shape_pt_lat'], row['shape_pt_lon']))
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
298 shape_distances[row['shape_id']] = max(shape_distances.get(row['shape_id'], 0), float(row['shape_dist_traveled']))
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
299 except KeyError:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
300 pass
29
2c78e68d7363 Mööö
Teemu Piippo <teemu@hecknology.net>
parents: 28
diff changeset
301
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
302 with gtfs_zip.open('trips.txt') as file:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
303 for row in read_csv(map(bytes.decode, file)):
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
304 if row['service_id'] not in services:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
305 services[row['service_id']] = BusService(row['service_id'])
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
306 route = routes_per_id[row['route_id']]
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
307 trip = BusTrip(
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
308 reference = row['trip_id'],
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
309 route = route,
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
310 service = services[row['service_id']],
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
311 length = shape_distances.get(row.get('shape_id'), 1) * float(profile['metrics']['shape-modifier']),
90
Teemu Piippo <teemu@hecknology.net>
parents: 88
diff changeset
312 block_id = row.get('block_id') or row['service_id'],
114
b736478416d4 added map to trip view
Teemu Piippo <teemu@hecknology.net>
parents: 109
diff changeset
313 shape = row.get('shape_id')
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
314 )
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
315 route.trips.add(trip)
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
316 if trip.name in all_trips:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
317 print('Trip %s already exists' % trip.name)
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
318 else:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
319 all_trips[trip.name] = trip
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
320 print('%d trips' % len(all_trips), file = stderr)
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
321
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
322 def read_date(teksti):
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
323 return date(int(teksti[:4]), int(teksti[4:6]), int(teksti[6:]))
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
324
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
325 def read_time(teksti):
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
326 hour, minute, second = map(int, teksti.split(':'))
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
327 return timedelta(hours = hour, minutes = minute, seconds = second)
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
328
93
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
329 print('Loading dates... ', file = stderr, flush = True)
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
330 viimeinen_käyttöpäivä = date.today()
29
2c78e68d7363 Mööö
Teemu Piippo <teemu@hecknology.net>
parents: 28
diff changeset
331
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
332 def date_range(start_date, end_date, *, include_end = False):
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
333 ''' Generates date from start_date to end_date. If include_end is True, then end_date will be yielded. '''
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
334 current_date = start_date
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
335 while current_date < end_date:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
336 yield current_date
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
337 current_date += timedelta(1)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
338 if include_end:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
339 yield end_date
29
2c78e68d7363 Mööö
Teemu Piippo <teemu@hecknology.net>
parents: 28
diff changeset
340
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
341 def add_day_to_service(service_name, day):
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
342 try:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
343 service = services[service_name]
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
344 except KeyError:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
345 return
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
346 else:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
347 service.dates.add(day)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
348 if day not in services_for_day:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
349 services_for_day[day] = set()
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
350 services_for_day[day].add(service)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
351 global viimeinen_käyttöpäivä
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
352 viimeinen_käyttöpäivä = max(day, viimeinen_käyttöpäivä)
29
2c78e68d7363 Mööö
Teemu Piippo <teemu@hecknology.net>
parents: 28
diff changeset
353
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
354 def filter_day(row, day):
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
355 day_names = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
356 return int(row[day_names[day.isoweekday() - 1]])
0
fc48613c73e5 Alustava versio
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
357
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
358 with gtfs_zip.open('calendar.txt') as file:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
359 for row in read_csv(map(bytes.decode, file)):
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
360 for day in date_range(read_date(row['start_date']), read_date(row['end_date']), include_end = True):
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
361 if filter_day(row, day):
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
362 add_day_to_service(service_name = row['service_id'], day = day)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
363
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
364 with gtfs_zip.open('calendar_dates.txt') as file:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
365 for row in read_csv(map(bytes.decode, file)):
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
366 add_day_to_service(service_name = row['service_id'], day = read_date(row['date']))
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
367
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
368 def services_available_at(day):
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
369 for service in services.values():
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
370 if day in service.dates:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
371 yield service
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
372
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
373 print('Loading stops... ', file = stderr, end = '', flush = True)
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
374 with gtfs_zip.open('stops.txt') as file:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
375 for row in read_csv(map(bytes.decode, file)):
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
376 location = Location(float(row['stop_lat']), float(row['stop_lon']))
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
377 stop = BusStop(
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
378 reference = row['stop_id'],
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
379 name = row['stop_name'],
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
380 location = location,
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
381 code = row.get('stop_code', row['stop_id']),
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
382 )
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
383 bus_stops[stop.reference] = stop
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
384 if profile['regions']['use-regions']:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
385 with open('regions-per-stop.json') as file:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
386 for stop_reference, region in json.load(file).items():
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
387 try:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
388 bus_stops[stop_reference].region = region
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
389 except KeyError:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
390 pass
81
Teemu Piippo <teemu@hecknology.net>
parents: 80
diff changeset
391 for bus_stop in bus_stops.values():
Teemu Piippo <teemu@hecknology.net>
parents: 80
diff changeset
392 if not hasattr(bus_stop, 'region'):
Teemu Piippo <teemu@hecknology.net>
parents: 80
diff changeset
393 bus_stop.region = None
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
394 print('%d stops' % len(bus_stops), file = stderr)
21
6a0394d5a159 Yleistä päivittelyä
Teemu Piippo <teemu@hecknology.net>
parents: 20
diff changeset
395
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
396 from collections import defaultdict
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
397 bus_stops_by_name = defaultdict(set)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
398 for bus_stop in bus_stops.values():
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
399 bus_stops_by_name[bus_stop.name].add(bus_stop)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
400 bus_stops_by_name = dict(bus_stops_by_name)
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
401
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
402 # ryhmittele bus_stops nimen mukaan
41
Teemu Piippo <teemu@hecknology.net>
parents: 31
diff changeset
403 global all_clusters
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
404 all_clusters = []
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
405 def cluster_bus_stops():
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
406 sorted_bus_stops = sorted(bus_stops.values(), key = lambda bus_stop: bus_stop.name)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
407 for bus_stop in sorted_bus_stops:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
408 if not bus_stop.cluster:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
409 stops_to_cluster = {bus_stop}
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
410 # etsi pysäkin samannimiset vastaparit
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
411 for pair_candidate in bus_stops_by_name[bus_stop.name]:
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
412 distance = pair_candidate.location.distance(bus_stop.location)
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
413 if pair_candidate is not bus_stop and distance <= 0.4:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
414 stops_to_cluster.add(pair_candidate)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
415 for stop_to_cluster in stops_to_cluster:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
416 if stop_to_cluster.cluster:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
417 cluster = stop_to_cluster.cluster
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
418 break
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
419 else:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
420 cluster = BusStopCluster()
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
421 all_clusters.append(cluster)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
422 for stop_to_cluster in stops_to_cluster:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
423 if not stop_to_cluster.cluster:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
424 cluster.add_stop(stop_to_cluster)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
425 # Merkitse muistiin pysäkkien vastaparit käyttäen hyväksi tämänhetkistä ryhmittelytietoa
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
426 for bus_stop in bus_stops.values():
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
427 if bus_stop.cluster:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
428 bus_stop.pairs = bus_stop.cluster.stops - {bus_stop}
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
429 # Ryhmitä ne bus_stops, joilla ei ollut omaa vastaparia, muiden pysäkkien kanssa
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
430 for bus_stop in sorted_bus_stops:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
431 if len(bus_stop.cluster.stops) == 1:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
432 possibilities = set()
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
433 for cluster in all_clusters:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
434 if cluster is not bus_stop.cluster:
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
435 distance = cluster.center.distance(bus_stop.location)
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
436 if distance <= 0.4:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
437 possibilities.add((distance, cluster))
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
438 if possibilities:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
439 best = min(possibilities)[1]
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
440 all_clusters.remove(bus_stop.cluster)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
441 best.merge(bus_stop.cluster)
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
442
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
443 def shared_elements_in_n_sets(sets):
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
444 from itertools import combinations
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
445 result = set()
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
446 for pair in combinations(sets, 2):
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
447 result |= pair[0] & pair[1]
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
448 return result
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
449
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
450 def name_clusters():
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
451 from collections import defaultdict
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
452 clusters_per_name = defaultdict(set)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
453 for cluster in all_clusters:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
454 name_representing_stop = min((len(stop.reference), stop.reference, stop) for stop in cluster.stops)[2]
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
455 clusters_per_name[name_representing_stop.name].add(cluster)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
456 for name, clusters in clusters_per_name.items():
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
457 if len(clusters) == 1:
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
458 # Simple case: this cluster is the only one that wants this name.
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
459 next(iter(clusters)).name = name
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
460 else:
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
461 if profile['regions']['use-regions']:
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
462 # Find out if all clusters are in different areas
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
463 common_regions = shared_elements_in_n_sets({stop.region for stop in cluster.stops} for cluster in clusters)
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
464 # Proposal: cluster -> the areas unique to the cluster
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
465 proposal = {
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
466 cluster: {stop.region for stop in cluster.stops} - common_regions - {None}
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
467 for cluster in clusters
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
468 }
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
469 # If at most one cluster is without its own unique region, name the others by region and this one without any.
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
470 if sum([1 for unique_areas in proposal.values() if not unique_areas]) <= 1:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
471 for cluster, unique_areas in proposal.items():
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
472 individual_cluster_name = name
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
473 if unique_areas:
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
474 individual_cluster_name += ' (' + min(unique_areas) + ')'
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
475 cluster.name = individual_cluster_name
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
476 break
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
477 # If all else fails, just number them.
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
478 for n, (_, cluster) in enumerate(sorted(
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
479 min((stop.reference.lower(), cluster) for stop in cluster.stops)
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
480 for cluster in clusters
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
481 ), 1):
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
482 individual_cluster_name = name + '-' + str(n)
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
483 cluster.name = individual_cluster_name
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
484
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
485 print('Clustering bus stops...')
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
486 cluster_bus_stops()
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
487 name_clusters()
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
488
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
489 for cluster in all_clusters:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
490 if cluster.url_name in clusters_by_name:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
491 print('Warning: Clusters %r and %r share the same URL name: %r' % (cluster.name, clusters_by_name[cluster.url_name].name, cluster.url_name))
15
a22cdf28930f Lisätty bussipysäkkien ryhmittely
Teemu Piippo <teemu@hecknology.net>
parents: 7
diff changeset
492 else:
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
493 clusters_by_name[cluster.url_name] = cluster
19
16fa9fb20b32 Lisätty pysäkkiryhmän aikataulunäkymä
Teemu Piippo <teemu@hecknology.net>
parents: 18
diff changeset
494
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
495 print('Loading schedules... ', end = '', flush = True, file = stderr)
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
496 with gtfs_zip.open('stop_times.txt') as file:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
497 row_count = sum(line.count(b'\n') for line in file)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
498 with gtfs_zip.open('stop_times.txt') as file:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
499 progress = 0
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
500 for row in read_csv(map(bytes.decode, file)):
80
0773b4e5fd10 fix parsing
Teemu Piippo
parents: 77
diff changeset
501 if int(row.get('pickup_type', '') or '0') and int(row.get('drop_off_type', '') or '0'):
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
502 continue
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
503 trip = all_trips[transform_trip_reference(row['trip_id'])]
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
504 arrival_time = read_time(row['arrival_time'])
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
505 departure_time = read_time(row['departure_time'])
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
506 stop = bus_stops[row['stop_id']]
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
507 traveled_distance = float(row.get('shape_dist_traveled', 1)) * float(profile['metrics']['shape-modifier'])
134
4ac0f2e2ec4e removed uuid mapping
Teemu Piippo <teemu@hecknology.net>
parents: 127
diff changeset
508 visitnumber = len(trip.schedule) + 1
4ac0f2e2ec4e removed uuid mapping
Teemu Piippo <teemu@hecknology.net>
parents: 127
diff changeset
509 trip.schedule.append(BusHalt(arrival_time, departure_time, stop, trip, traveled_distance, visitnumber))
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
510 stop.involved_trips.add(trip)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
511 progress += 1
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
512 if progress % 1000 == 0:
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
513 print('\rLoading schedules... %.1f%%' % (progress * 100 / row_count), end = ' ', file = stderr)
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
514 print('\rLoading schedules... complete', file = stderr)
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
515
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
516 for trip in all_trips.values():
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
517 from busroute import simplify_name
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
518 schedule = trip.concise_schedule()
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
519 try:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
520 trip.from_place = simplify_name(schedule[0])
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
521 trip.to_place = simplify_name(schedule[-1])
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
522 except IndexError:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
523 trip.from_place = ''
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
524 trip.to_place = ''
28
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
525
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
526 for route in routes.values():
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
527 from collections import Counter
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
528 from busroute import simplify_name
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
529 tally = Counter()
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
530 for trip in route.trips:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
531 schedule = trip.concise_schedule()
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
532 places = set(schedule)
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
533 do_add = True
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
534 assert type(schedule) is list
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
535 for candidate in tally:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
536 if places.issubset(set(candidate)):
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
537 do_add = False
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
538 tally.update({tuple(candidate)})
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
539 if do_add:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
540 tally.update({tuple(schedule)})
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
541 try:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
542 most_common_route = tally.most_common(1)[0][0]
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
543 route.description = simplify_name(most_common_route[0]) + ' - ' + simplify_name(most_common_route[-1])
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
544 except:
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
545 route.description = ''
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
546 route.trips = sorted(route.trips, key = lambda trip: trip.schedule and trip.schedule[0].departure_time or timedelta())
28
670ffa424ded Bussipysäkit tallentavat ajovuoronsa välimuistiin suoritusajan nopeuttamiseksi
Teemu Piippo <teemu@hecknology.net>
parents: 26
diff changeset
547
72
65408ed066b3 Refactor
Teemu Piippo <teemu@hecknology.net>
parents: 71
diff changeset
548 if 'compatibility' in profile and profile['compatibility'].get('fix-destination-times', False):
65408ed066b3 Refactor
Teemu Piippo <teemu@hecknology.net>
parents: 71
diff changeset
549 # Fölin datassa on jotain tosi kummaa. Ilmeisesti ajovuoron viimeisen pysähdyksen saapumisaika on ihan täysin
65408ed066b3 Refactor
Teemu Piippo <teemu@hecknology.net>
parents: 71
diff changeset
550 # väärin. Arvaan että se on seuraavan lähdön aika, mutta joka tapauksessa se on väärin.
65408ed066b3 Refactor
Teemu Piippo <teemu@hecknology.net>
parents: 71
diff changeset
551 # Arvataan mikä se todellinen saapumisaika on. Se ei voi mennä kauhean paljon pahemmin vikaan kuin alkuperäinen
65408ed066b3 Refactor
Teemu Piippo <teemu@hecknology.net>
parents: 71
diff changeset
552 # väärin oleva data.
65408ed066b3 Refactor
Teemu Piippo <teemu@hecknology.net>
parents: 71
diff changeset
553 for trip in all_trips.values():
65408ed066b3 Refactor
Teemu Piippo <teemu@hecknology.net>
parents: 71
diff changeset
554 if len(trip.schedule) >= 2:
65408ed066b3 Refactor
Teemu Piippo <teemu@hecknology.net>
parents: 71
diff changeset
555 bus_speed_coefficient = 750 # metriä minuutissa
65408ed066b3 Refactor
Teemu Piippo <teemu@hecknology.net>
parents: 71
diff changeset
556 last_leg_distance = trip.schedule[-1].traveled_distance - trip.schedule[-2].traveled_distance
65408ed066b3 Refactor
Teemu Piippo <teemu@hecknology.net>
parents: 71
diff changeset
557 trip.schedule[-1].arrival_time = trip.schedule[-2].departure_time + timedelta(minutes = last_leg_distance / bus_speed_coefficient)
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
558
93
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
559 # Add services to all bus stops
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
560 for route in routes.values():
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
561 for trip in route.trips:
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
562 for halt in trip.schedule:
53ee9e945673 added ferry support
Teemu Piippo <teemu@hecknology.net>
parents: 90
diff changeset
563 halt.stop.services.add(route.service)
30
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
564
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
565 if __name__ == '__main__':
a5bfd99bc2a3 Lisää päivityksiä
Teemu Piippo <teemu@hecknology.net>
parents: 29
diff changeset
566 profile.read('profiles/föli.ini')
71
d2e19670b772 Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents: 42
diff changeset
567 load_buses('gtfs.zip')
88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
568 import busroute
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
569 from regions import parse_regions
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
570 busroute.regions = parse_regions('föli.osm')

mercurial