1 #!/usr/bin/env python3 |
1 #!/usr/bin/env python3 |
2 import enum, json |
2 import enum, json |
3 from sys import stderr |
3 from sys import stderr |
4 from datetime import date, time, datetime, timedelta |
4 from datetime import date, time, datetime, timedelta |
|
5 from copy import copy |
5 from misc import * |
6 from misc import * |
|
7 from geometria import * |
6 Suunta = enum.Enum('Suunta', [('Taaksepäin', 0), ('Eteenpäin', 1)]) |
8 Suunta = enum.Enum('Suunta', [('Taaksepäin', 0), ('Eteenpäin', 1)]) |
7 |
9 |
8 def muunna_ajovuoro_tunniste(tunniste): |
10 def muunna_ajovuoro_tunniste(tunniste): |
9 return tunniste |
11 return tunniste |
10 |
12 |
25 def ajetaan_päivänä(self, päivä): |
27 def ajetaan_päivänä(self, päivä): |
26 try: |
28 try: |
27 return self.palvelu in palvelut_per_päivä[päivä] |
29 return self.palvelu in palvelut_per_päivä[päivä] |
28 except KeyError: |
30 except KeyError: |
29 return False |
31 return False |
|
32 def suppea_reitti(self, pysäkistä = None): |
|
33 if pysäkistä and pysäkistä in self.reitti: |
|
34 reitti = copy(self.reitti) |
|
35 reitti = reitti[reitti.index(pysäkistä):] |
|
36 else: |
|
37 reitti = self.reitti |
|
38 käytetyt_alueet = set() |
|
39 tulos = [] |
|
40 for pysähdys in reitti: |
|
41 pysäkki = pysähdys.pysäkki |
|
42 if pysäkki.alue and pysäkki.alue not in käytetyt_alueet: |
|
43 käytetyt_alueet.add(pysäkki.alue) |
|
44 tulos.append(pysäkki.alue) |
|
45 return tulos |
30 |
46 |
31 class Linja: |
47 class Linja: |
32 def __init__(self, tietue): |
48 def __init__(self, tietue): |
33 self.tunniste = tietue['route_id'] |
49 self.tunniste = tietue['route_id'] |
34 self.viite = tietue['route_short_name'] |
50 self.viite = tietue['route_short_name'] |
96 break |
112 break |
97 # ja siirry seuraavaan päivään. |
113 # ja siirry seuraavaan päivään. |
98 päivä += timedelta(1) |
114 päivä += timedelta(1) |
99 # Typistä lopputulos haluttuun tulosmäärään. |
115 # Typistä lopputulos haluttuun tulosmäärään. |
100 return taulu[:määrä] |
116 return taulu[:määrä] |
|
117 @property |
|
118 def linkki_karttaan(self): |
|
119 return 'http://www.openstreetmap.org/#map=19/%f/%f' % (self.sijainti.leveys, self.sijainti.pituus) |
101 |
120 |
102 class Pysähdys: |
121 class Pysähdys: |
103 def __init__(self, saapumisaika, lähtöaika, pysäkki, ajo): |
122 def __init__(self, saapumisaika, lähtöaika, pysäkki, ajo): |
104 self.saapumisaika, self.lähtöaika, self.pysäkki, self.ajo = saapumisaika, lähtöaika, \ |
123 self.saapumisaika, self.lähtöaika, self.pysäkki, self.ajo = saapumisaika, lähtöaika, \ |
105 pysäkki, ajo |
124 pysäkki, ajo |
165 yield palvelu |
184 yield palvelu |
166 |
185 |
167 print('Ladataan pysäkit... ', file = stderr, end = '', flush = True) |
186 print('Ladataan pysäkit... ', file = stderr, end = '', flush = True) |
168 with open('gtfs/stops.txt') as file: |
187 with open('gtfs/stops.txt') as file: |
169 for rivi in lue_csv(file): |
188 for rivi in lue_csv(file): |
170 sijainti = (float(rivi['stop_lat']), float(rivi['stop_lon'])) |
189 sijainti = Sijainti(float(rivi['stop_lat']), float(rivi['stop_lon'])) |
171 pysäkki = Pysäkki(rivi['stop_id'], rivi['stop_name'], sijainti) |
190 pysäkki = Pysäkki(rivi['stop_id'], rivi['stop_name'], sijainti) |
172 pysäkit[pysäkki.tunniste] = pysäkki |
191 pysäkit[pysäkki.tunniste] = pysäkki |
173 with open('pysäkkialueet.json') as file: |
192 with open('pysäkkialueet.json') as file: |
174 for pysäkkitunniste, alue in json.load(file).items(): |
193 for pysäkkitunniste, alue in json.load(file).items(): |
175 pysäkit[pysäkkitunniste].alue = alue |
194 pysäkit[pysäkkitunniste].alue = alue |