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 |
|