busroute.py

changeset 52
cab8d38fe5c6
parent 46
548b526ded3b
child 53
1c934953c3e6
equal deleted inserted replaced
51:145b453ba8f2 52:cab8d38fe5c6
1 #!/usr/bin/env python3 1 #!/usr/bin/env python3
2 2
3 from configparser import ConfigParser
4
3 replacements = { 5 replacements = {
4 "Ylioppilaskylä-Itä": "Ylioppilaskylä", 6 "ylioppilaskylä-itä": "ylioppilaskylä",
5 "Ylioppilaskylä-Länsi": "Ylioppilaskylä", 7 "ylioppilaskylä-länsi": "ylioppilaskylä",
6 "Caribia": "Ylioppilaskylä", 8 "jokila": "lieto",
7 "Jokila": "Lieto", 9 "piispala": "lieto",
8 "Piispala": "Lieto", 10 'saaro': 'ruissalo',
9 'Saaro': 'Ruissalo', 11 'silvola': 'vahto',
10 'Silvola': 'Vahto', 12 'hemmola': 'vahto',
11 'Hemmola': 'Vahto', 13 'paasniittu': 'ruskon keskusta',
12 'Paasniittu': 'Ruskon keskusta', 14 'kahari': 'ruskon keskusta',
13 'Kahari': 'Ruskon keskusta', 15 'kemiö': 'kemiönsaari',
14 'Kemiö': 'Kemiönsaari', 16 'kasnäs': 'kemiönsaari',
15 'Kasnäs': 'Kemiönsaari', 17 'pernon telakka': 'perno',
16 'Pernon telakka': 'Perno',
17 } 18 }
18 19
19 # nimiä joista voidaan joustaa tarvittaessa 20 # nimiä joista voidaan joustaa tarvittaessa
20 abbreviations = { 21 abbreviations = {
21 'Raision keskusta': 'Raisio', 22 'raision keskusta': 'raisio',
22 'Ruskon keskusta': 'Rusko', 23 'ruskon keskusta': 'rusko',
23 'Naantalin keskusta': 'Naantali', 24 'naantalin keskusta': 'naantali',
24 'Kaarinan keskusta': 'Kaarina', 25 'kaarinan keskusta': 'kaarina',
25 'Kauppakeskus Mylly': 'Mylly', 26 'kauppakeskus mylly': 'mylly',
26 } 27 }
28
29 region_info = ConfigParser()
30 region_info.read('regions.ini')
31 municipalities = set(region_info.sections())
32 municipalities_per_region = {}
33
34 for municipality in municipalities:
35 for region in region_info[municipality].keys():
36 municipalities_per_region[region] = municipality
37
38 for place_from, place_to in replacements.items():
39 municipalities_per_region[place_to] = municipalities_per_region[place_from]
27 40
28 def simplify_name(name): 41 def simplify_name(name):
29 name = replacements.get(name, name) 42 name = replacements.get(name, name)
30 name = abbreviations.get(name, name) 43 name = abbreviations.get(name, name)
31 return name 44 return name
32 45
33 def reduce_schedule(reitti, trip_length, whole = False): 46 def reduce_schedule(reitti, trip_length, whole = False):
34 length = ((trip_length / 600) + len(reitti)) / 2 47 length = ((trip_length / 600) + len(reitti)) / 2
35 if not reitti: 48 if not reitti:
36 return '' 49 return ''
37 eksoalueet = {
38 'Turku', 'Naantali', 'Lieto', 'Aura', 'Kaarina', 'Pargas', 'Marttila', 'Somero', 'Koski Tl', 'Tarvasjoki',
39 'Kaivopuisto',
40 }
41 have_already = set() 50 have_already = set()
42 i = 0 51 i = 0
43 while i < len(reitti): 52 while i < len(reitti):
44 if reitti[i] in replacements: 53 if reitti[i] in replacements:
45 reitti[i] = replacements[reitti[i]] 54 reitti[i] = replacements[reitti[i]]
47 del reitti[i] 56 del reitti[i]
48 else: 57 else:
49 have_already.add(reitti[i]) 58 have_already.add(reitti[i])
50 i += 1 59 i += 1
51 priorities = { 60 priorities = {
52 'Ihala': 150, 61 'ihala': 150,
53 'Kauppakeskus Mylly': 200, 62 'kauppakeskus mylly': 200,
54 'Kuninkoja': 80, 63 'kuninkoja': 80,
55 'Moikoinen': 80, 64 'moikoinen': 80,
56 'Raision keskusta': 150, 65 'raision keskusta': 150,
57 'Kukola': 50, 66 'kukola': 50,
58 'Kaistarniemi': 50, 67 'kaistarniemi': 50,
59 'Papinsaari': 50, 68 'papinsaari': 50,
60 'Oriniemi': 50, 69 'oriniemi': 50,
61 'Pikisaari': 50, 70 'pikisaari': 50,
62 'Häppilä': 20, 71 'häppilä': 20,
63 'Haarla': 80, 72 'haarla': 80,
64 'Ylioppilaskylä': 50, 73 'ylioppilaskylä': 50,
65 'Halinen': 70, 74 'halinen': 70,
66 'Kakskerta': 200, 75 'kakskerta': 200,
67 'Pansio': 50, 76 'pansio': 50,
68 'Räntämäki': 10, 77 'räntämäki': 10,
69 'Verkahovi': 20, 78 'verkahovi': 20,
70 'Skanssi': 200, 79 'skanssi': 200,
71 'Vaala': 20, 80 'vaala': 20,
72 'Varissuo': 60, 81 'varissuo': 60,
73 'Kohmo': 80, 82 'kohmo': 80,
74 'Kupittaa': 70, 83 'kupittaa': 70,
75 'Kauppatori': 1e15, 84 'kauppatori': 1e15,
76 'Lentoasema': 50, 85 'lentoasema': 50,
77 'Runosmäki': 50, 86 'runosmäki': 50,
78 'Lieto': 100, 87 'lieto': 100,
79 'Lieto as': 200, 88 'lieto as': 200,
80 'Ilmarinen': 50, 89 'ilmarinen': 50,
81 'Vahto': 50, 90 'vahto': 50,
82 'Ruskon keskusta': 200, 91 'ruskon keskusta': 200,
83 'Oriketo': 50, 92 'oriketo': 50,
84 'Harittu': 40, 93 'harittu': 40,
85 'Jäkärlä': 50, 94 'jäkärlä': 50,
86 'Paattinen': 100, 95 'paattinen': 100,
87 'Kaarinan keskusta': 200, 96 'kaarinan keskusta': 200,
88 'Naantalin keskusta': 200, 97 'naantalin keskusta': 200,
89 'Uittamo': 50, 98 'uittamo': 50,
90 'Piikkiö': 100, 99 'piikkiö': 100,
91 'Paimio': 100, 100 'paimio': 100,
92 'Pargas': 100, 101 'pargas': 100,
93 'Nagu': 100, 102 'nagu': 100,
94 'Yli-Maaria': 70, 103 'yli-maaria': 70,
95 'Saramäki': 50, 104 'saramäki': 50,
96 'Tarvasjoki': 100, 105 'tarvasjoki': 100,
97 'Marttila': 100, 106 'marttila': 100,
98 'Koski Tl': 100, 107 'koski tl': 100,
99 'Katariina': 50, 108 'katariina': 50,
100 'Länsikeskus': 50, 109 'länsikeskus': 50,
101 'Kaanaa': 100, 110 'kaanaa': 100,
102 'Satava': 50, 111 'satava': 50,
103 'Suikkila': 50, 112 'suikkila': 50,
104 'Raunistula': 50, 113 'raunistula': 50,
105 'Räntämäki': 50, 114 'räntämäki': 50,
106 'Moisio': 25, 115 'moisio': 25,
107 'Pääskyvuori': 100, 116 'pääskyvuori': 100,
108 'Rautatieasema': 50, 117 'rautatieasema': 50,
109 'Logomo': 100, 118 'logomo': 100,
110 'Rymättylä': 50, 119 'rymättylä': 50,
111 "Sauvo": 500, 120 "sauvo": 500,
112 "Kemiönsaari": 500, 121 "kemiönsaari": 500,
113 'Suovuori': 300, 122 'suovuori': 300,
114 'Eerikvalla': 50, 123 'eerikvalla': 50,
115 'Petäsmäki': 50, 124 'petäsmäki': 50,
116 'Tortinmäki': 50, 125 'tortinmäki': 50,
117 'Aura': 100, 126 'aura': 100,
118 'Friskala': -1, 127 'friskala': -1,
128 'merimasku': 50,
119 } 129 }
120 130
121 if 'Kauppatori' not in reitti: 131 if 'kauppatori' not in reitti:
122 priorities['Länsikeskus'] = priorities['Skanssi'] = priorities['Kauppatori'] 132 priorities['länsikeskus'] = priorities['skanssi'] = priorities['kauppatori']
123 133
124 from_place = reitti[0] 134 from_place = reitti[0]
125 destination = reitti[-1] 135 destination = reitti[-1]
126 reitti_arvot = {} 136 reitti_arvot = {}
127 f = lambda i: i**-0.3 137 f = lambda i: i**-0.3
158 if weights[1][0] != destination and weights[1][1] < (500 / length ** 1.15): 168 if weights[1][0] != destination and weights[1][1] < (500 / length ** 1.15):
159 del weights[1] 169 del weights[1]
160 except IndexError: 170 except IndexError:
161 pass 171 pass
162 # lajitellaan painoarvot uudestaan reittijärjestykseen jotta sign tulee oikeinpäin 172 # lajitellaan painoarvot uudestaan reittijärjestykseen jotta sign tulee oikeinpäin
163 weights = sorted(weights, key = lambda paino: paino[2]) 173 weights = sorted(weights, key = lambda weight_data: weight_data[2])
164 # muodostetaan sign.. 174 # muodostetaan sign..
165 sign = [paino[0] for paino in weights] 175 sign = [paino[0] for paino in weights]
166 # supista nimet jos mahdollista 176 to_place = sign[-1]
167 def finalise(sign, abbreviation_level = 0): 177 if from_place != to_place:
168 if abbreviation_level > 0: 178 municipality_from = municipalities_per_region.get(from_place)
169 sign = [abbreviations.get(paikka, paikka) for paikka in sign] 179 municipality_to = municipalities_per_region.get(to_place)
170 return sign 180 if municipality_from and municipality_to and municipality_from not in ['Turku', municipality_to]:
171 result = finalise(sign) 181 def convert_region(region):
172 for i in range(len(sign) - 1): 182 municipality = municipalities_per_region.get(region, region)
173 if sign[i + 1].startswith(sign[i]): 183 if municipality != municipality_from:
174 del sign[i] 184 return municipality
185 else:
186 return region
187 sign = [convert_region(region) for region in sign]
188 # supista nimet tarvittaessa
175 if len(' - '.join(sign)) > 20: 189 if len(' - '.join(sign)) > 20:
176 result = finalise(sign, abbreviation_level = 1) 190 sign = [abbreviations.get(place, place) for place in sign]
191 old_sign = sign.copy()
192 sign = []
193 for place in old_sign:
194 if place not in sign:
195 sign.append(place)
177 if whole: 196 if whole:
178 result = [from_place] + result 197 sign = [from_place] + sign
179 if not result: 198 if not sign:
180 result = [destination] 199 sign = [destination]
181 short_from_place = replacements.get(from_place, from_place) 200 return sign
182 if (
183 short_from_place != result[-1]
184 and abbreviations.get(short_from_place, short_from_place) in eksoalueet | {'Kauppatori'}
185 and result[-1] in eksoalueet | {'Kauppatori'}
186 ):
187 result = ['Turku' if k == 'Kauppatori' else k for k in result]
188 return result

mercurial