Tue, 20 Jun 2017 09:37:43 +0300
lisää muutoksia
5 | 1 | #!/usr/bin/env python3 |
22 | 2 | def supista_reitti(reitti, ajomatka, kokonainen = False): |
3 | length = ((ajomatka / 600) + len(reitti)) / 2 | |
12
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
4 | def abstract_sign(sign): |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
5 | abstractions = { |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
6 | 'Moikoinen': 'Hirvensalo', |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
7 | 'Maanpää': 'Hirvensalo', |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
8 | 'Papinsaari': 'Hirvensalo', |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
9 | 'Häppilä': 'Hirvensalo', |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
10 | 'Friskala': 'Hirvensalo', |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
11 | 'Kukola': 'Hirvensalo', |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
12 | 'Oriniemi': 'Hirvensalo', |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
13 | 'Haarla': 'Hirvensalo', |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
14 | 'Lauttasaari': 'Hirvensalo', |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
15 | 'Pikisaari': 'Hirvensalo', |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
16 | 'Pernon telakka': 'Perno', |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
17 | } |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
18 | try: |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
19 | start = sign.index('Kauppatori') |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
20 | except ValueError: |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
21 | return sign |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
22 | result = [] |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
23 | for i, place in enumerate(sign): |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
24 | if i >= start: |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
25 | abstract_place = abstractions.get(place, place) |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
26 | if abstract_place not in result: |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
27 | result.append(abstract_place) |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
28 | else: |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
29 | result.append(place) |
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
Teemu Piippo <teemu@hecknology.net>
parents:
7
diff
changeset
|
30 | return result |
5 | 31 | if not reitti: |
32 | return '' | |
22 | 33 | eksoalueet = { |
34 | 'Turku', 'Naantali', 'Lieto', 'Aura', 'Kaarina', 'Pargas', 'Marttila', 'Somero', 'Koski Tl', 'Tarvasjoki', | |
35 | 'Kaivopuisto', | |
36 | } | |
5 | 37 | replacements = { |
38 | "Ylioppilaskylä-Itä": "Ylioppilaskylä", | |
39 | "Ylioppilaskylä-Länsi": "Ylioppilaskylä", | |
40 | "Caribia": "Ylioppilaskylä", | |
41 | "Jokila": "Lieto", | |
42 | "Piispala": "Lieto", | |
43 | 'Saaro': 'Ruissalo', | |
44 | 'Silvola': 'Vahto', | |
45 | 'Hemmola': 'Vahto', | |
46 | 'Paasniittu': 'Ruskon keskusta', | |
47 | 'Kahari': 'Ruskon keskusta', | |
22 | 48 | 'Kemiö': 'Kemiönsaari', |
49 | 'Kasnäs': 'Kemiönsaari', | |
5 | 50 | } |
51 | have_already = set() | |
52 | i = 0 | |
53 | while i < len(reitti): | |
54 | if reitti[i] in replacements: | |
55 | reitti[i] = replacements[reitti[i]] | |
56 | if reitti[i] in have_already: | |
57 | del reitti[i] | |
58 | else: | |
59 | have_already.add(reitti[i]) | |
60 | i += 1 | |
61 | prioriteetit = { | |
62 | 'Ihala': 150, | |
63 | 'Kauppakeskus Mylly': 200, | |
64 | 'Kuninkoja': 80, | |
22 | 65 | 'Moikoinen': 35, |
5 | 66 | 'Raision keskusta': 100, |
6 | 67 | 'Friskala': 20, |
5 | 68 | 'Kukola': 50, |
69 | 'Kaistarniemi': 50, | |
70 | 'Papinsaari': 50, | |
71 | 'Oriniemi': 50, | |
72 | 'Pikisaari': 50, | |
73 | 'Häppilä': 50, | |
74 | 'Haarla': 50, | |
75 | 'Ylioppilaskylä': 50, | |
76 | 'Halinen': 70, | |
21 | 77 | 'Kakskerta': 200, |
5 | 78 | 'Pansio': 50, |
79 | 'Räntämäki': 10, | |
80 | 'Verkahovi': 20, | |
81 | 'Skanssi': 200, | |
82 | 'Vaala': 20, | |
83 | 'Varissuo': 60, | |
84 | 'Kohmo': 80, | |
85 | 'Kupittaa': 70, | |
86 | 'Kauppatori': 1e15, | |
87 | 'Lentoasema': 50, | |
88 | 'Runosmäki': 50, | |
89 | 'Lieto': 100, | |
22 | 90 | 'Lieto as': 200, |
6 | 91 | 'Ilmarinen': 50, |
5 | 92 | 'Vahto': 50, |
93 | 'Ruskon keskusta': 200, | |
6 | 94 | 'Oriketo': 30, |
5 | 95 | 'Harittu': 40, |
96 | 'Jäkärlä': 50, | |
97 | 'Paattinen': 100, | |
98 | 'Kaarinan keskusta': 200, | |
99 | 'Naantalin keskusta': 200, | |
100 | 'Uittamo': 50, | |
6 | 101 | 'Piikkiö': 100, |
102 | 'Paimio': 100, | |
5 | 103 | 'Pargas': 50, |
104 | 'Yli-Maaria': 50, | |
105 | 'Saramäki': 50, | |
106 | 'Tarvasjoki': 100, | |
107 | 'Marttila': 100, | |
108 | 'Koski Tl': 100, | |
109 | 'Katariina': 50, | |
110 | 'Länsikeskus': 50, | |
111 | 'Kaanaa': 100, | |
112 | 'Satava': 50, | |
6 | 113 | 'Suikkila': 50, |
114 | 'Raunistula': 50, | |
115 | 'Räntämäki': 50, | |
116 | 'Moisio': 25, | |
13
55241f0e1079
Rajattu Pääskyvuoren ja Varissuon alueet ja lisätty Pääskyvuoren prioriteettia. Nyt Pääskyvuori näkyy niissä P2:n kylteissä jotka menevät Pääskyvuoreen
Teemu Piippo <teemu@hecknology.net>
parents:
12
diff
changeset
|
117 | 'Pääskyvuori': 100, |
22 | 118 | 'Rautatieasema': 50, |
20
3199e289ae62
- Sivusto hieman edustuksellisempi
Teemu Piippo <teemu@hecknology.net>
parents:
16
diff
changeset
|
119 | 'Rymättylä': 50, |
22 | 120 | "Sauvo": 500, |
121 | "Kemiönsaari": 500, | |
5 | 122 | } |
123 | ||
124 | if 'Kauppatori' not in reitti: | |
125 | prioriteetit['Länsikeskus'] = prioriteetit['Skanssi'] = prioriteetit['Kauppatori'] | |
126 | ||
127 | # nimiä joista voidaan joustaa tarvittaessa | |
128 | helpot_supistukset = { | |
129 | 'Raision keskusta': 'Raisio', | |
130 | 'Ruskon keskusta': 'Rusko', | |
131 | 'Naantalin keskusta': 'Naantali', | |
132 | 'Kaarinan keskusta': 'Kaarina', | |
133 | 'Kauppakeskus Mylly': 'Mylly', | |
134 | } | |
135 | ||
136 | # jos ei nyt millään vaan mahdu muuten... | |
137 | vakavat_supistukset = { | |
138 | 'Kauppatori': 'Tori', | |
139 | 'Ylioppilaskylä': 'Yo-kylä', | |
140 | } | |
141 | ||
142 | lähtö = reitti[0] | |
143 | määränpää = reitti[-1] | |
144 | reitti_arvot = {} | |
22 | 145 | f = lambda i: i**-0.3 |
5 | 146 | jakaja = max(f(i + 1) for i in range(len(reitti))) |
147 | for i, pysäkki in enumerate(reitti): | |
148 | # muunna indeksi siten että myöhemmät alueet korostuvat | |
149 | i = f(i + 1) / jakaja | |
150 | # ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset | |
151 | i *= prioriteetit.get(pysäkki, 1) | |
152 | reitti_arvot[pysäkki] = i | |
153 | # nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin | |
154 | if lähtö in reitti_arvot: | |
155 | reitti_arvot[lähtö] = 0 | |
156 | # varmista että määränpää tulee kylttiin | |
157 | reitti_arvot[määränpää] = 1e10 | |
158 | # muodosta kyltti-tiedot järjestettynä reittiarvon mukaan | |
159 | painot = sorted([ | |
160 | (pysäkki, reitti_arvot[pysäkki], i) \ | |
161 | for i, pysäkki in enumerate(reitti) \ | |
162 | if reitti_arvot[pysäkki] >= 1 | |
163 | ], key = lambda pysäkki: -pysäkki[1]) | |
164 | # enintään neljä tulee kylttiin | |
22 | 165 | painot = painot[:3] |
166 | # jos kolmas kylttiarvo ei ole tarpeeksi merkittävä suhteessa reitin pituuteen niin otetaan se pois | |
167 | try: | |
168 | if painot[2][0] != määränpää and painot[2][1] < (1000 / length ** 1.15): | |
169 | del painot[2] | |
170 | except IndexError: | |
171 | pass | |
172 | try: | |
173 | if painot[1][0] != määränpää and painot[1][1] < (500 / length ** 1.15): | |
174 | del painot[1] | |
175 | except IndexError: | |
176 | pass | |
5 | 177 | # lajitellaan painoarvot uudestaan reittijärjestykseen jotta kyltti tulee oikeinpäin |
178 | painot = sorted(painot, key = lambda paino: paino[2]) | |
179 | # muodostetaan kyltti.. | |
180 | kyltti = [paino[0] for paino in painot] | |
22 | 181 | #kyltti = abstract_sign(kyltti) |
5 | 182 | # supista nimet jos mahdollista |
183 | def viimeistele(kyltti, supistus_taso = 0): | |
184 | if supistus_taso > 0: | |
185 | kyltti = [helpot_supistukset.get(paikka, paikka) for paikka in kyltti] | |
186 | if supistus_taso > 1: | |
187 | kyltti = [vakavat_supistukset.get(paikka, paikka) for paikka in kyltti] | |
188 | return kyltti | |
189 | tulos = viimeistele(kyltti) | |
22 | 190 | for i in range(len(kyltti) - 1): |
191 | if kyltti[i + 1].startswith(kyltti[i]): | |
192 | del kyltti[i] | |
5 | 193 | if len(' - '.join(kyltti)) > 20: |
194 | tulos = viimeistele(kyltti, supistus_taso = 1) | |
195 | if len(' - '.join(kyltti)) > 70: | |
196 | tulos = viimeistele(kyltti, supistus_taso = 2) | |
197 | if kokonainen: | |
198 | tulos = [lähtö] + tulos | |
199 | lyhyt_lähtö = replacements.get(lähtö, lähtö) | |
22 | 200 | if lyhyt_lähtö != tulos[-1] and helpot_supistukset.get(lyhyt_lähtö, lyhyt_lähtö) in eksoalueet | {'Kauppatori'} and tulos[-1] in eksoalueet | {'Kauppatori'}: |
5 | 201 | tulos = ['Turku' if k == 'Kauppatori' else k for k in tulos] |
202 | return tulos |