Paljon asioita

Thu, 25 May 2017 16:41:21 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Thu, 25 May 2017 16:41:21 +0300
changeset 5
a65b680f1774
parent 4
312c432bb9e6
child 6
88cfb916c852

Paljon asioita

alue-edustajat.json file | annotate | diff | comparison | revisions
alueet.gmp file | annotate | diff | comparison | revisions
alueet.py file | annotate | diff | comparison | revisions
bussireitti.py file | annotate | diff | comparison | revisions
bussit.py file | annotate | diff | comparison | revisions
en.ini file | annotate | diff | comparison | revisions
fi.ini file | annotate | diff | comparison | revisions
geometria.py file | annotate | diff | comparison | revisions
misc.py file | annotate | diff | comparison | revisions
palvelu.py file | annotate | diff | comparison | revisions
sv.ini file | annotate | diff | comparison | revisions
templates/pysäkki.html file | annotate | diff | comparison | revisions
--- a/alue-edustajat.json	Fri May 19 21:15:12 2017 +0300
+++ b/alue-edustajat.json	Thu May 25 16:41:21 2017 +0300
@@ -1,4 +1,5 @@
 {
+	"Kaarinan keskusta": "6043",
 	"Piikkiö": "6175",
 	"Hadvala": "6171",
 	"Puosta": "6351",
@@ -13,7 +14,36 @@
 	"Hanhijoki": "6657",
 	"Naskarla": "6638",
 	
+	"Lieto": "5021",
+	"Pompo": "6112",
+	"Tammi": "6117",
+	"Hakkinen": "5004",
+	"Loukinainen": "5009",
+	"Sillilä": "5011",
+	"Piispala": "5029",
+	"Jokila": "5035",
+	"Vieru": "5018",
+	"Ilmarinen": "5070",
+	"Liedon asemanseutu": "5112",
+	"Tarvasjoki": "5423",
+	"Avanti": "5470",
 
+	"Aura": "8024",
+	"Salo": "8900",
+	"Korpo": "8960",
+	
+	"Marttila": "8800",
+
+	"Raision keskusta": "2010",
+	"Kauppakeskus Mylly": "2117",
+	"Petäsmäki": "2063",
+	"Kaanaa": "2037",
+	
+	"Koski Tl": "8810",
+	
+	"Somero": "8820",
+
+	"Naantalin keskusta": "3016",
 	"Ahteentaka": "3290",
 	"Kurala (Naantali)": "3196",
 	"Haapala": "3283",
@@ -87,15 +117,14 @@
 	"Martti": "74",
 	"Metsäaro": "2089",
 	"Mäntymäki": "1800",
-	"Moikoinen": "90",
+	"Moikoinen": "91",
 	"Moisio": "1066",
 	"Muhkuri": "899",
 	"Munittula": "4012",
-	"Mylly": "2117",
 	"Mälikkälä": "781",
-	"Naantali": "3016",
 	"Nuorikkala": "2079",
 	"Nummenmäki": "62",
+	"Nummen koulu": "1826",
 	"Nättinummi": "30",
 	"Ojanto": "4004",
 	"Oriniemi": "316",
@@ -119,7 +148,6 @@
 	"Puutori": "286",
 	"Pyöli": "3247",
 	"Pääskyvuori": "879",
-	"Raision keskusta": "2010",
 	"Raunistula": "224",
 	"Rautatieasema": "144",
 	"Ruissalo": "666",
@@ -143,7 +171,7 @@
 	"Suutarla": "3286",
 	"Särkilahti": "404",
 	"Aaslaluoto": "3308",
-	"Teräsrautela": "476",
+	"Länsikeskus": "476",
 	"Tikanmaa": "2136",
 	"Toijainen": "424",
 	"Tortinmäki": "1149",
--- a/alueet.gmp	Fri May 19 21:15:12 2017 +0300
+++ b/alueet.gmp	Thu May 25 16:41:21 2017 +0300
@@ -1,24 +1,22 @@
-roadmap^60.430274530422295, 22.693504910984647^15@undefined^#FF0000,5,1,#ff8800,0.4^^60.39482,22.2577~60.40037,22.27521~60.39147,22.28456~60.38851,22.27179
+roadmap^60.40918767732357, 22.258026819744718^14@undefined^#FF0000,5,1,#ff8800,0.4^^60.39482,22.2577~60.40037,22.27521~60.39147,22.28456~60.38851,22.27179
 polygon^#FF0000,5,1,#ff8800,0.4^^60.3977,22.24465~60.40772,22.24046~60.40792,22.26057~60.40076,22.27409~60.3952,22.25642
 polygon^#FF0000,5,1,#ff8800,0.4^^60.3977,22.22706~60.38719,22.23676~60.38341,22.22466~60.38518,22.21205~60.39359,22.20706~60.39816,22.21341
-polygon^#FF0000,5,1,#ff8800,0.4^^60.39868,22.21599~60.39804,22.22852~60.38876,22.23916~60.38952,22.24843~60.39329,22.25135~60.40217,22.23474~60.4019,22.21689
-polygon^#FF0000,5,1,#ff8800,0.4^^60.38871,22.16432~60.39236,22.18483~60.39972,22.188~60.40171,22.1823~60.39919,22.15413~60.39151,22.15633
-polygon^#FF0000,5,1,#ff8800,0.4^^60.42123,22.17264~60.41472,22.15422~60.40622,22.14277~60.40003,22.15599~60.40577,22.17143~60.41357,22.18174
-polygon^#FF0000,5,1,#ff8800,0.4^^60.43275,22.20869~60.4239,22.21632~60.41889,22.19831~60.42495,22.19216~60.43033,22.19648
-polygon^#FF0000,5,1,#ff8800,0.4^^60.42148,22.17333~60.42584,22.18964~60.41902,22.1971~60.41534,22.18056
-polygon^#FF0000,5,1,#ff8800,0.4^^60.51616,22.23289~60.50782,22.23676~60.50492,22.27787~60.50936,22.29718~60.51901,22.29847~60.51961,22.26218
-polygon^#FF0000,5,1,#ff8800,0.4^^60.49702,22.21496~60.49936,22.22028~60.50048,22.23744~60.49676,22.2392~60.49373,22.23435~60.49306,22.23554~60.49178,22.23402~60.48872,22.22903~60.48729,22.2221~60.49085,22.21505
-polygon^#FF0000,5,1,#ff8800,0.4^^60.47182,22.29006~60.47585,22.29014~60.48198,22.29898~60.4786,22.30708~60.47647,22.31503~60.4748,22.31928~60.47057,22.30316~60.47158,22.29897
-polygon^#FF0000,5,1,#ff8800,0.4^^60.46443,22.27208~60.47176,22.2828~60.47215,22.28351~60.47295,22.28976~60.47586,22.28966~60.47505,22.27803~60.47529,22.26612~60.47341,22.26482~60.47244,22.26502~60.47,22.26609~60.46873,22.26701~60.46674,22.26877~60.46574,22.26934~60.46434,22.27049~60.46395,22.27063~60.46343,22.27033~60.46395,22.27112
-polygon^#FF0000,5,1,#ff8800,0.4^^60.45901,22.268~60.45994,22.26648~60.46324,22.27012~60.46392,22.27117~60.46441,22.2721~60.47172,22.28286~60.4721,22.28353~60.47232,22.2854~60.46842,22.28529~60.4655,22.28372~60.46387,22.28141~60.46168,22.27527
-polygon^#FF0000,5,1,#ff8800,0.4^^60.45775,22.29049~60.4599,22.29787~60.45951,22.29945~60.45688,22.3026~60.45537,22.29751~60.45501,22.29585~60.45465,22.29285~60.45619,22.29141
-polygon^#FF0000,5,1,#ff8800,0.4^^60.45331,22.2865~60.45033,22.29068~60.45113,22.29322~60.45198,22.29413~60.45225,22.29741~60.45399,22.29853~60.45529,22.2975~60.45495,22.29585~60.45446,22.2915~60.45386,22.28832~60.45369,22.28748
-polygon^#FF0000,5,1,#ff8800,0.4^^60.4445,22.25538~60.44359,22.25256~60.44121,22.24824~60.43617,22.25517~60.43897,22.26358
-polygon^#FF0000,5,1,#ff8800,0.4^^60.42205,22.23332~60.41743,22.22843~60.41462,22.23002~60.41226,22.23362~60.40794,22.23766~60.40841,22.26324~60.41685,22.25384~60.42155,22.24643~60.42243,22.23594
-polygon^#FF0000,5,1,#ff8800,0.4^^60.4537,22.25043~60.45203,22.25283~60.45345,22.25685~60.45493,22.25432
-polygon^#FF0000,5,1,#ff8800,0.4^^60.45224,22.29757~60.4499,22.32448~60.4569,22.32432~60.4621,22.31703~60.45992,22.29862~60.45961,22.29964~60.45684,22.30304~60.45528,22.29775~60.45402,22.29882
-polygon^#FF0000,5,1,#ff8800,0.4^^60.45206,22.29738~60.45137,22.2971~60.44687,22.30439~60.44232,22.3131~60.43895,22.31757~60.44625,22.3267~60.44913,22.32902
-polygon^#FF0000,5,1,#ff8800,0.4^^60.35447,22.12646~60.34122,22.13676~60.33714,22.17865~60.35634,22.30671~60.36475,22.31056~60.38221,22.2982~60.37208,22.22194~60.3631,22.16082
+undefined^#FF0000,5,1,#ff8800,0.4^^60.39868,22.21599~60.39804,22.22852~60.38876,22.23916~60.38952,22.24843~60.39329,22.25135~60.40217,22.23474~60.4019,22.21689
+undefined^#FF0000,5,1,#ff8800,0.4^^60.38871,22.16432~60.39236,22.18483~60.39972,22.188~60.40171,22.1823~60.39919,22.15413~60.39151,22.15633
+undefined^#FF0000,5,1,#ff8800,0.4^^60.42123,22.17264~60.41472,22.15422~60.40622,22.14277~60.40003,22.15599~60.40577,22.17143~60.41357,22.18174
+undefined^#FF0000,5,1,#ff8800,0.4^^60.43275,22.20869~60.4239,22.21632~60.41889,22.19831~60.42495,22.19216~60.43033,22.19648
+undefined^#FF0000,5,1,#ff8800,0.4^^60.42148,22.17333~60.42584,22.18964~60.41902,22.1971~60.41534,22.18056
+undefined^#FF0000,5,1,#ff8800,0.4^^60.49702,22.21496~60.49936,22.22028~60.50048,22.23744~60.49676,22.2392~60.49373,22.23435~60.49306,22.23554~60.49178,22.23402~60.48872,22.22903~60.48729,22.2221~60.49085,22.21505
+undefined^#FF0000,5,1,#ff8800,0.4^^60.47182,22.29006~60.47585,22.29014~60.48198,22.29898~60.4786,22.30708~60.47647,22.31503~60.4748,22.31928~60.47057,22.30316~60.47158,22.29897
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46443,22.27208~60.47176,22.2828~60.47215,22.28351~60.47295,22.28976~60.47586,22.28966~60.47505,22.27803~60.47529,22.26612~60.47341,22.26482~60.47244,22.26502~60.47,22.26609~60.46873,22.26701~60.46674,22.26877~60.46574,22.26934~60.46434,22.27049~60.46395,22.27063~60.46343,22.27033~60.46395,22.27112
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45901,22.268~60.45994,22.26648~60.46324,22.27012~60.46392,22.27117~60.46441,22.2721~60.47172,22.28286~60.4721,22.28353~60.47232,22.2854~60.46842,22.28529~60.4655,22.28372~60.46387,22.28141~60.46168,22.27527
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45775,22.29049~60.4599,22.29787~60.45951,22.29945~60.45688,22.3026~60.45537,22.29751~60.45501,22.29585~60.45465,22.29285~60.45619,22.29141
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45331,22.2865~60.45033,22.29068~60.45113,22.29322~60.45198,22.29413~60.45225,22.29741~60.45399,22.29853~60.45529,22.2975~60.45495,22.29585~60.45446,22.2915~60.45386,22.28832~60.45369,22.28748
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4445,22.25538~60.44359,22.25256~60.44121,22.24824~60.43617,22.25517~60.43897,22.26358
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4537,22.25043~60.45203,22.25283~60.45345,22.25685~60.45493,22.25432
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45224,22.29757~60.4499,22.32448~60.4569,22.32432~60.4621,22.31703~60.45992,22.29862~60.45961,22.29964~60.45684,22.30304~60.45528,22.29775~60.45402,22.29882
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45206,22.29738~60.45137,22.2971~60.44687,22.30439~60.44232,22.3131~60.43895,22.31757~60.44625,22.3267~60.44913,22.32902
+undefined^#FF0000,5,1,#ff8800,0.4^^60.35447,22.12646~60.34122,22.13676~60.33714,22.17865~60.35634,22.30671~60.36475,22.31056~60.38221,22.2982~60.37208,22.22194~60.3631,22.16082
 undefined^#FF0000,5,1,#ff8800,0.4^^60.36483,22.11222~60.35498,22.12595~60.34539,22.09816~60.35061,22.08758
 undefined^#FF0000,5,1,#ff8800,0.4^^60.35557,22.12732~60.36614,22.11211~60.37617,22.11563~60.38197,22.13505~60.38392,22.1608~60.38367,22.21058~60.38265,22.23049~60.37467,22.23427~60.36377,22.15899
 undefined^#FF0000,5,1,#ff8800,0.4^^60.44513,22.32739~60.4509,22.33176~60.45303,22.33709~60.45193,22.34516~60.44766,22.34725~60.44482,22.35053~60.44204,22.35147~60.44187,22.33875~60.44334,22.33174
@@ -35,9 +33,6 @@
 undefined^#FF0000,5,1,#ff8800,0.4^^60.45857,22.22045~60.46175,22.23684~60.46635,22.24233~60.46999,22.22342~60.46663,22.21524~60.4656,22.21092~60.46162,22.21221
 undefined^#FF0000,5,1,#ff8800,0.4^^60.4697,22.22131~60.46693,22.21517~60.46528,22.20514~60.47272,22.19522~60.47605,22.20406~60.47122,22.21328
 undefined^#FF0000,5,1,#ff8800,0.4^^60.4705,22.21951~60.48023,22.22414~60.48044,22.21169~60.47626,22.20483~60.47169,22.21384
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4848,22.22929~60.4745,22.23281~60.47744,22.25101~60.48083,22.25006~60.48293,22.24869~60.48568,22.24715
-undefined^#FF0000,5,1,#ff8800,0.4^^60.47431,22.23298~60.4707,22.23392~60.4664,22.2498~60.47087,22.2528~60.47636,22.25137~60.47635,22.24784
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48011,22.225~60.48002,22.23015~60.4683,22.23427~60.47094,22.22069
 undefined^#FF0000,5,1,#ff8800,0.4^^60.45191,22.2745~60.44999,22.27746~60.44796,22.2706~60.44837,22.26998~60.44934,22.272
 undefined^#FF0000,5,1,#ff8800,0.4^^60.4457,22.19908~60.44249,22.20603~60.43554,22.20629~60.43394,22.19696~60.44188,22.18918
 undefined^#FF0000,5,1,#ff8800,0.4^^60.4219,22.10621~60.4208,22.13539~60.40461,22.11823~60.40554,22.10579
@@ -71,7 +66,6 @@
 undefined^#FF0000,5,1,#ff8800,0.4^^60.45853,22.19019~60.45508,22.19054~60.45053,22.19882~60.44925,22.21523~60.45314,22.22142~60.45383,22.22435
 undefined^#FF0000,5,1,#ff8800,0.4^^60.46113,22.19127~60.46132,22.19824~60.46001,22.2073~60.45919,22.21152~60.45652,22.2088~60.45931,22.19073
 undefined^#FF0000,5,1,#ff8800,0.4^^60.46139,22.19131~60.46428,22.19195~60.46767,22.194~60.47022,22.19663~60.46369,22.20573~60.45959,22.21049~60.46167,22.19811
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4591,22.21187~60.45665,22.20955~60.4533,22.23375~60.4536,22.23839~60.4543,22.24281~60.45478,22.24573~60.45789,22.2266~60.45939,22.21217
 undefined^#FF0000,5,1,#ff8800,0.4^^60.45675,22.24015~60.45438,22.2495~60.45887,22.26658~60.45998,22.26577~60.46269,22.26488
 undefined^#FF0000,5,1,#ff8800,0.4^^60.45876,22.22345~60.45709,22.23877~60.46232,22.2613~60.46574,22.24292~60.46138,22.23705
 undefined^#FF0000,5,1,#ff8800,0.4^^60.47602,22.25242~60.47484,22.26457~60.47306,22.26336~60.46917,22.26521~60.46496,22.26894~60.46259,22.26148~60.46492,22.24917~60.47087,22.25384~60.47163,22.25338
@@ -137,7 +131,6 @@
 undefined^#FF0000,5,1,#ff8800,0.4^^60.48615,22.14136~60.48618,22.15052~60.48319,22.15037~60.48113,22.14966~60.47855,22.14669~60.48296,22.13831
 undefined^#FF0000,5,1,#ff8800,0.4^^60.46621,22.01291~60.4756,22.03136~60.46964,22.04724~60.45966,22.02782
 undefined^#FF0000,5,1,#ff8800,0.4^^60.48839,22.11325~60.48786,22.11544~60.48829,22.11771~60.48993,22.11788~60.49843,22.11377~60.49917,22.10025~60.49584,22.08536~60.4908,22.08252~60.48687,22.07969~60.48549,22.08037~60.48585,22.09461~60.48687,22.09672~60.48795,22.10552~60.48788,22.10548
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48539,22.08031~60.48569,22.09469~60.48678,22.09683~60.48766,22.10531~60.48835,22.11316~60.4877,22.11514~60.48809,22.11745~60.48705,22.1193~60.48378,22.10835~60.48163,22.09588~60.48026,22.08837~60.48112,22.08156
 undefined^#FF0000,5,1,#ff8800,0.4^^60.48793,22.05986~60.48292,22.06321~60.48423,22.07634~60.4891,22.07471
 undefined^#FF0000,5,1,#ff8800,0.4^^60.47963,22.0434~60.48179,22.04952~60.48136,22.05795~60.47832,22.06057~60.47644,22.05118~60.4777,22.04725
 undefined^#FF0000,5,1,#ff8800,0.4^^60.47451,22.05205~60.47139,22.04357~60.47441,22.03658~60.47698,22.04613
@@ -201,4 +194,33 @@
 undefined^#FF0000,5,1,#ff8800,0.4^^60.46799,22.7305~60.46779,22.73739~60.465,22.74003~60.46261,22.73803~60.46217,22.73225~60.4629,22.72985
 undefined^#FF0000,5,1,#ff8800,0.4^^60.45777,22.70256~60.45065,22.7114~60.46046,22.73801~60.46591,22.71834
 undefined^#FF0000,5,1,#ff8800,0.4^^60.43692,22.68321~60.43455,22.69084~60.42925,22.69067~60.42557,22.6866~60.42517,22.68029~60.42591,22.67351~60.42804,22.66844~60.43214,22.66584~60.43605,22.67028~60.43688,22.67745
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4826,22.371~60.47977,22.38142~60.47488,22.38627~60.47167,22.37992~60.47257,22.36853~60.4745,22.36182
+undefined^#FF0000,5,1,#ff8800,0.4^^60.47141,22.35692~60.46921,22.37027~60.4605,22.35851~60.46692,22.34488
+undefined^#FF0000,5,1,#ff8800,0.4^^60.49049,22.3955~60.48326,22.40232~60.47488,22.38705~60.48028,22.38164~60.48316,22.37111
+undefined^#FF0000,5,1,#ff8800,0.4^^60.49036,22.39645~60.49004,22.40401~60.49285,22.41177~60.49002,22.42026~60.48729,22.42443~60.48303,22.40307
+undefined^#FF0000,5,1,#ff8800,0.4^^60.49323,22.41323~60.49226,22.41872~60.48829,22.42606~60.49018,22.4337~60.49554,22.43417~60.49989,22.42843~60.49778,22.41595
+undefined^#FF0000,5,1,#ff8800,0.4^^60.50025,22.43061~60.49552,22.43605~60.49056,22.43513~60.49038,22.45086~60.49707,22.44944~60.50221,22.44357
+undefined^#FF0000,5,1,#ff8800,0.4^^60.51397,22.46206~60.50845,22.46544~60.50864,22.45903~60.50805,22.44888~60.51385,22.449
+undefined^#FF0000,5,1,#ff8800,0.4^^60.51392,22.46251~60.50851,22.46565~60.50827,22.46807~60.51109,22.47562~60.51545,22.46873
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45911,22.21202~60.45806,22.22069~60.4563,22.23515~60.45568,22.23772~60.45322,22.23343~60.45646,22.20923
+undefined^#FF0000,5,1,#ff8800,0.4^^60.49742,22.14861~60.50046,22.16552~60.50749,22.16646~60.51229,22.15288~60.51079,22.12724~60.5046,22.11986~60.49856,22.12634~60.49676,22.13936
+undefined^#FF0000,5,1,#ff8800,0.4^^60.5154,22.37237~60.5143,22.39314~60.50793,22.40026~60.50015,22.38808~60.49888,22.37503~60.50081,22.36358~60.50646,22.359~60.51193,22.3607
+undefined^#FF0000,5,1,#ff8800,0.4^^60.55994,22.41537~60.555,22.44945~60.57174,22.46909~60.57958,22.43482~60.57043,22.42093
+undefined^#FF0000,5,1,#ff8800,0.4^^60.65712,22.51081~60.62803,22.52145~60.62278,22.60523~60.64753,22.63429~60.6662,22.61381~60.66486,22.54679
+undefined^#FF0000,5,1,#ff8800,0.4^^60.41478,22.35632~60.40355,22.35623~60.40425,22.39331~60.41563,22.39314
+undefined^#FF0000,5,1,#ff8800,0.4^^60.37586,23.08399~60.40826,23.09137~60.40088,23.20724~60.35661,23.16847
+undefined^#FF0000,5,1,#ff8800,0.4^^60.17772,21.45699~60.20832,21.56301~60.21663,21.71242~60.19172,21.88408~60.06724,21.92322~60.0621,21.4532~60.12773,21.4083
+undefined^#FF0000,5,1,#ff8800,0.4^^60.5184,22.29066~60.50809,22.2868~60.50501,22.26305~60.50686,22.23835~60.51316,22.23453~60.51705,22.24268
+undefined^#FF0000,5,1,#ff8800,0.4^^60.58368,22.71183~60.5907,22.72732~60.58924,22.75895~60.57904,22.75406~60.57702,22.72431
+undefined^#FF0000,5,1,#ff8800,0.4^^60.66418,23.1142~60.64273,23.11944~60.645,23.1651~60.66338,23.1621
+undefined^#FF0000,5,1,#ff8800,0.4^^60.47127,22.38121~60.46374,22.39039~60.46065,22.42348~60.46995,22.43357~60.48456,22.4226~60.48176,22.40141
+undefined^#FF0000,5,1,#ff8800,0.4^^60.59725,22.8871~60.59487,22.92104~60.58161,22.9095~60.57626,22.87997~60.58278,22.86698~60.59122,22.87079
+undefined^#FF0000,5,1,#ff8800,0.4^^60.47522,22.2368~60.4772,22.24399~60.4774,22.25062~60.4708,22.25337~60.46795,22.25135~60.4713,22.23669~60.47455,22.23838
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48497,22.23079~60.47757,22.23225~60.47539,22.23637~60.47755,22.24371~60.47765,22.25101~60.4807,22.2507~60.48555,22.24749
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4803,22.22448~60.47454,22.23796~60.46833,22.23435~60.47094,22.22033
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48533,22.08042~60.48055,22.08599~60.48721,22.11904~60.48744,22.11588~60.48825,22.11327~60.4878,22.10522~60.48675,22.09685~60.48575,22.09462
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46405,22.09132~60.4627,22.11106~60.47455,22.11768~60.4849,22.11197~60.48188,22.09514~60.47191,22.09863
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46224,22.29508~60.46122,22.29679~60.4604,22.29517~60.46062,22.29415~60.46164,22.29403~60.46233,22.29434
+undefined^#FF0000,5,1,#ff8800,0.4^^60.6386,23.48019~60.64036,23.54104~60.61247,23.55108~60.60559,23.51006~60.61444,23.45856~60.62842,23.45907
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4222,22.23671~60.41807,22.23096~60.41564,22.23169~60.4083,22.23886~60.40847,22.26201~60.42222,22.24487
 @@@@@@
--- a/alueet.py	Fri May 19 21:15:12 2017 +0300
+++ b/alueet.py	Thu May 25 16:41:21 2017 +0300
@@ -1,12 +1,7 @@
 #!/usr/bin/env python3
-from pprint import pprint
-from PyQt5.QtCore import QPointF, Qt
-from PyQt5.QtGui import QPolygonF
-from PyQt5.QtWidgets import QApplication
 import sys, json
 from misc import *
-
-app = QApplication(sys.argv)
+from geometria import *
 
 with open('alueet.gmp') as file:
 	data = file.read().split('@')
@@ -18,7 +13,7 @@
 
 with open('gtfs/stops.txt') as file:
 	for rivi in lue_csv(file):
-		sijainti = QPointF(float(rivi['stop_lat']), float(rivi['stop_lon']))
+		sijainti = Sijainti(float(rivi['stop_lat']), float(rivi['stop_lon']))
 		tunniste = rivi['stop_id']
 		pysäkit[tunniste] = sijainti
 
@@ -28,8 +23,8 @@
 	coordinates = []
 	for point in polygon[3].split('~'):
 		x, y = point.split(',')
-		coordinates.append(QPointF(float(x), float(y)))
-	district_shapes.append(QPolygonF(coordinates))
+		coordinates.append(Sijainti(float(x), float(y)))
+	district_shapes.append(Monikulmio(*coordinates))
 
 districts = {}
 bus_stop_districts = {}
@@ -38,7 +33,7 @@
 	if stop_id is None:
 		continue
 	for district_shape in district_shapes:
-		if district_shape.containsPoint(pysäkit[stop_id], Qt.OddEvenFill):
+		if district_shape.sisältää_pisteen(pysäkit[stop_id]):
 			assert name not in districts
 			districts[name] = district_shape
 			district_shapes.remove(district_shape)
@@ -49,7 +44,7 @@
 
 for stop_id, stop_position in pysäkit.items():
 	for district, shape in districts.items():
-		if shape.containsPoint(stop_position, Qt.OddEvenFill):
+		if shape.sisältää_pisteen(stop_position):
 			bus_stop_districts[stop_id] = district
 			break
 	else:
@@ -58,5 +53,4 @@
 covered = sum(int(bool(k)) for k in bus_stop_districts.values())
 total = len(pysäkit)
 print('%.1f%% bus stops covered.' % (covered * 100 / total), file = sys.stderr)
-
 json.dump(bus_stop_districts, sys.stdout, indent = 2)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bussireitti.py	Thu May 25 16:41:21 2017 +0300
@@ -0,0 +1,155 @@
+#!/usr/bin/env python3
+def supista_reitti(reitti, kokonainen = False):
+	if not reitti:
+		return ''
+	kunnat = {'Turku', 'Naantali', 'Lieto', 'Aura', 'Kaarina', 'Pargas', 'Marttila', 'Somero', 'Koski Tl', 'Tarvasjoki'}
+	replacements = {
+		"Ylioppilaskylä-Itä": "Ylioppilaskylä",
+		"Ylioppilaskylä-Länsi": "Ylioppilaskylä",
+		"Caribia": "Ylioppilaskylä",
+		"Jokila": "Lieto",
+		"Piispala": "Lieto",
+		'Saaro': 'Ruissalo',
+		'Silvola': 'Vahto',
+		'Hemmola': 'Vahto',
+		'Paasniittu': 'Ruskon keskusta',
+		'Kahari': 'Ruskon keskusta',
+	}
+	have_already = set()
+	i = 0
+	while i < len(reitti):
+		if reitti[i] in replacements:
+			reitti[i] = replacements[reitti[i]]
+		if reitti[i] in have_already:
+			del reitti[i]
+		else:
+			have_already.add(reitti[i])
+			i += 1
+	prioriteetit = {
+		'Ihala': 150,
+		'Kauppakeskus Mylly': 200,
+		'Kuninkoja': 80,
+		'Moikoinen': 50,
+		'Raision keskusta': 100,
+		'Friskala': 30,
+		'Kukola': 50,
+		'Kaistarniemi': 50,
+		'Papinsaari': 50,
+		'Oriniemi': 50,
+		'Pikisaari': 50,
+		'Häppilä': 50,
+		'Haarla': 50,
+		'Ylioppilaskylä': 50,
+		'Halinen': 70,
+		'Kakskerta': 50,
+		'Pansio': 50,
+		'Räntämäki': 10,
+		'Verkahovi': 20,
+		'Skanssi': 200,
+		'Vaala': 20,
+		'Varissuo': 60,
+		'Kohmo': 80,
+		'Kupittaa': 70,
+		'Kauppatori': 1e15,
+		'Lentoasema': 50,
+		'Runosmäki': 50,
+		'Lieto': 100,
+		'Liedon asemanseutu': 200,
+		'Ilmarinen': 100,
+		'Vahto': 50,
+		'Ruskon keskusta': 200,
+		'Oriketo': 50,
+		'Harittu': 40,
+		'Jäkärlä': 50,
+		'Paattinen': 100,
+		'Kaarinan keskusta': 200,
+		'Naantalin keskusta': 200,
+		'Uittamo': 50,
+		'Piikkiö': 40,
+		'Paimio': 50,
+		'Pargas': 50,
+		'Yli-Maaria': 50,
+		'Saramäki': 50,
+		'Tarvasjoki': 100,
+		'Marttila': 100,
+		'Koski Tl': 100,
+		'Katariina': 50,
+		'Länsikeskus': 50,
+		'Kaanaa': 100,
+		'Satava': 50,
+	}
+
+	if 'Kauppatori' not in reitti:
+		prioriteetit['Länsikeskus'] = prioriteetit['Skanssi'] = prioriteetit['Kauppatori']
+
+	# nimiä joista voidaan joustaa tarvittaessa
+	helpot_supistukset = {
+		'Raision keskusta': 'Raisio',
+		'Ruskon keskusta': 'Rusko',
+		'Naantalin keskusta': 'Naantali',
+		'Kaarinan keskusta': 'Kaarina',
+		'Liedon asemanseutu': 'Lieto as.',
+		'Kauppakeskus Mylly': 'Mylly',
+	}
+
+	# jos ei nyt millään vaan mahdu muuten...
+	vakavat_supistukset = {
+		'Kauppatori': 'Tori',
+		'Ylioppilaskylä': 'Yo-kylä',
+	}
+
+	lähtö = reitti[0]
+	määränpää = reitti[-1]
+	reitti_arvot = {}
+	f = lambda i: i**-0.6
+	jakaja = max(f(i + 1) for i in range(len(reitti)))
+	for i, pysäkki in enumerate(reitti):
+		# muunna indeksi siten että myöhemmät alueet korostuvat
+		i = f(i + 1) / jakaja
+		# ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset
+		i *= prioriteetit.get(pysäkki, 1)
+		reitti_arvot[pysäkki] = i
+	# nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin
+	if lähtö in reitti_arvot:
+		reitti_arvot[lähtö] = 0
+	# varmista että määränpää tulee kylttiin
+	reitti_arvot[määränpää] = 1e10
+	# muodosta kyltti-tiedot järjestettynä reittiarvon mukaan
+	painot = sorted([
+		(pysäkki, reitti_arvot[pysäkki], i) \
+		for i, pysäkki in enumerate(reitti) \
+		if reitti_arvot[pysäkki] >= 1
+		], key = lambda pysäkki: -pysäkki[1])
+	# enintään neljä tulee kylttiin
+	painot = painot[:4]
+	# jos neljäs kylttiarvo ei ole tarpeeksi merkittävä suhteessa reitin pituuteen niin otetaan neljäs pois
+	if len(painot) == 4 and painot[3][0] != määränpää and painot[3][1] < (4000 / len(reitti) ** 1.5):
+		del painot[3]
+	# sama kolmannelle
+	if len(painot) == 3 and painot[2][0] != määränpää and painot[2][1] < (500 / len(reitti) ** 1.5):
+		del painot[2]
+	if len(painot) == 2 and painot[1][0] != määränpää and painot[1][1] < (100 / len(reitti) ** 1.5):
+		del painot[1]
+	# lajitellaan painoarvot uudestaan reittijärjestykseen jotta kyltti tulee oikeinpäin
+	painot = sorted(painot, key = lambda paino: paino[2])
+	# muodostetaan kyltti..
+	kyltti = [paino[0] for paino in painot]
+	
+	# supista nimet jos mahdollista
+	def viimeistele(kyltti, supistus_taso = 0):
+		if supistus_taso > 0:
+			kyltti = [helpot_supistukset.get(paikka, paikka) for paikka in kyltti]
+		if supistus_taso > 1:
+			kyltti = [vakavat_supistukset.get(paikka, paikka) for paikka in kyltti]
+		return kyltti
+	tulos = viimeistele(kyltti)
+	if len(' - '.join(kyltti)) > 20:
+		tulos = viimeistele(kyltti, supistus_taso = 1)
+	if len(' - '.join(kyltti)) > 70:
+		tulos = viimeistele(kyltti, supistus_taso = 2)
+	if kokonainen:
+		tulos = [lähtö] + tulos
+	lyhyt_lähtö = replacements.get(lähtö, lähtö)
+	if lyhyt_lähtö != tulos[-1] and helpot_supistukset.get(lyhyt_lähtö, lyhyt_lähtö) in kunnat | {'Kauppatori'} and tulos[-1] in kunnat | {'Kauppatori'}:
+		tulos = ['Turku' if k == 'Kauppatori' else k for k in tulos]
+	return tulos
--- a/bussit.py	Fri May 19 21:15:12 2017 +0300
+++ b/bussit.py	Thu May 25 16:41:21 2017 +0300
@@ -2,7 +2,9 @@
 import enum, json
 from sys import stderr
 from datetime import date, time, datetime, timedelta
+from copy import copy
 from misc import *
+from geometria import *
 Suunta = enum.Enum('Suunta', [('Taaksepäin', 0), ('Eteenpäin', 1)])
 
 def muunna_ajovuoro_tunniste(tunniste):
@@ -27,6 +29,20 @@
 			return self.palvelu in palvelut_per_päivä[päivä]
 		except KeyError:
 			return False
+	def suppea_reitti(self, pysäkistä = None):
+		if pysäkistä and pysäkistä in self.reitti:
+			reitti = copy(self.reitti)
+			reitti = reitti[reitti.index(pysäkistä):]
+		else:
+			reitti = self.reitti
+		käytetyt_alueet = set()
+		tulos = []
+		for pysähdys in reitti:
+			pysäkki = pysähdys.pysäkki
+			if pysäkki.alue and pysäkki.alue not in käytetyt_alueet:
+				käytetyt_alueet.add(pysäkki.alue)
+				tulos.append(pysäkki.alue)
+		return tulos
 
 class Linja:
 	def __init__(self, tietue):
@@ -98,6 +114,9 @@
 			päivä += timedelta(1)
 		# Typistä lopputulos haluttuun tulosmäärään.
 		return taulu[:määrä]
+	@property
+	def linkki_karttaan(self):
+		return 'http://www.openstreetmap.org/#map=19/%f/%f' % (self.sijainti.leveys, self.sijainti.pituus)
 
 class Pysähdys:
 	def __init__(self, saapumisaika, lähtöaika, pysäkki, ajo):
@@ -167,7 +186,7 @@
 print('Ladataan pysäkit... ', file = stderr, end = '', flush = True)
 with open('gtfs/stops.txt') as file:
 	for rivi in lue_csv(file):
-		sijainti = (float(rivi['stop_lat']), float(rivi['stop_lon']))
+		sijainti = Sijainti(float(rivi['stop_lat']), float(rivi['stop_lon']))
 		pysäkki = Pysäkki(rivi['stop_id'], rivi['stop_name'], sijainti)
 		pysäkit[pysäkki.tunniste] = pysäkki
 with open('pysäkkialueet.json') as file:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/en.ini	Thu May 25 16:41:21 2017 +0300
@@ -0,0 +1,10 @@
+[paikat]
+satama = ⚓ Harbor
+kauppatori = City Centre
+lentoasema = ✈ Airport
+ylioppilaskylä = Student Village
+kauppakeskus mylly = Shopping Center Mylly
+raision keskusta = Raisio Centrum
+naantalin keskusta = Naantali Centrum
+linja-autoasema = Bus Station
+rautatieasema = Central Railway Station
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fi.ini	Thu May 25 16:41:21 2017 +0300
@@ -0,0 +1,6 @@
+[paikat]
+Korpo = Korppoo
+Pargas = Parainen
+lentoasema = ✈ Lentoasema
+satama = ⚓ Satama
+kauppakeskus mylly = Mylly
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/geometria.py	Thu May 25 16:41:21 2017 +0300
@@ -0,0 +1,121 @@
+from math import sqrt, hypot, radians, sin, cos, atan2
+
+class Sijainti:
+	def __init__(self, leveys, pituus):
+		self.leveys, self.pituus = leveys, pituus
+	def etäisyys(tämä, toinen):
+		# https://stackoverflow.com/a/365853
+		a = sin(radians(tämä.leveys - toinen.leveys) / 2) ** 2
+		a += sin(radians(tämä.pituus - toinen.pituus) / 2) ** 2 * cos(radians(tämä.leveys)) * cos(radians(toinen.leveys))
+		return 6371 * 2 * atan2(sqrt(a), sqrt(1 - a))
+	def __repr__(self):
+		return '%s(%r, %r)' % (type(self).__name__, self.leveys, self.pituus)
+	def __str__(self):
+		return '%.5f, %.5f' % (self.leveys, self.pituus)
+	@property
+	def x(self):
+		return self.leveys
+	@property
+	def y(self):
+		return self.pituus
+
+class Rengas:
+	def __init__(tämä, säiliö):
+		tämä.säiliö = säiliö
+	def __getitem__(tämä, indeksi):
+		while indeksi < 0:
+			indeksi += len(tämä.säiliö)
+		while indeksi >= len(tämä.säiliö):
+			indeksi -= len(tämä.säiliö)
+		return tämä.säiliö[indeksi]
+	def __iter__(tämä):
+		return iter(tämä.säiliö)
+	def __len__(tämä):
+		return len(tämä.säiliö)
+
+class Monikulmio:
+	def __init__(self, *pisteet):
+		self.pisteet = pisteet
+	def __repr__(self):
+		return '%s(%s)' % (type(self).__name__, ', '.join(map(repr, self.pisteet)))
+	def pinta_ala(self):
+		rengas = Rengas(self.pisteet)
+		return sum(
+			rengas[i].x * rengas[i + 1].y - rengas[i + 1].x * rengas[i].y
+			for i in range(len(rengas))
+		) / 2
+	def piiri(self):
+		rengas = Rengas(self.pisteet)
+		return sum(
+			sqrt((rengas[i + 1].x - rengas[i].x)**2 + (rengas[i + 1].y - rengas[i].y)**2)
+			for i in range(len(rengas))
+		)
+	def painopiste(self):
+		rengas = Rengas(self.pisteet)
+		x = sum(
+			(rengas[i].x + rengas[i + 1].x) * (rengas[i].x * rengas[i + 1].y - rengas[i + 1].x * rengas[i].y)
+			for i in range(len(rengas))
+		) / 6 / self.pinta_ala()
+		y = sum(
+			(rengas[i].y + rengas[i + 1].y) * (rengas[i].x * rengas[i + 1].y - rengas[i + 1].x * rengas[i].y)
+			for i in range(len(rengas))
+		) / 6 / self.pinta_ala()
+		return self.pistetyyppi()(x, y)
+	def pistetyyppi(self):
+		if len(self.pisteet):
+			return type(self.pisteet[0])
+		else:
+			return Piste
+	def piiri_janat(self):
+		rengas = Rengas(self.pisteet)
+		for i in range(len(rengas)):
+			yield Jana(rengas[i], rengas[i + 1])
+	def sisältää_pisteen(self, piste):
+		ulkopiste = self.pistetyyppi()(
+			min(piste.x for piste in self.pisteet) - 1,
+			min(piste.y for piste in self.pisteet) - 1
+		)
+		ulkojana = Jana(piste, ulkopiste)
+		leikkauksia = 0
+		for jana in self.piiri_janat():
+			if jana.leikkauspiste(ulkojana) is not None:
+				leikkauksia += 1
+		return bool(leikkauksia & 1)
+
+class Jana:
+	def __init__(self, alkupiste, päätepiste):
+		self.alkupiste, self.päätepiste = alkupiste, päätepiste
+	def __repr__(self):
+		return 'Jana(%r, %r)' % (self.alkupiste, self.päätepiste)
+	def pituus(self):
+		return hypot(self.alkupiste.x - self.päätepiste.x, self.alkupiste.y - self.päätepiste.y)
+	def leikkauspiste(tämä, toinen):
+		pistetyyppi = type(tämä.alkupiste)
+		x = (tämä.alkupiste.x, tämä.päätepiste.x, toinen.alkupiste.x, toinen.päätepiste.x)
+		y = (tämä.alkupiste.y, tämä.päätepiste.y, toinen.alkupiste.y, toinen.päätepiste.y)
+		try:
+			jakaja = (x[0] - x[1]) * (y[2] - y[3]) - (y[0] - y[1]) * (x[2] - x[3])
+			Px = ((x[0] * y[1] - y[0] * x[1]) * (x[2] - x[3]) - (x[0] - x[1]) * (x[2] * y[3] - y[2] * x[3])) / jakaja
+			Py = ((x[0] * y[1] - y[0] * x[1]) * (y[2] - y[3]) - (y[0] - y[1]) * (x[2] * y[3] - y[2] * x[3])) / jakaja
+			etäisyys = lambda n: (Px - x[n]) ** 2 + (Py - y[n]) ** 2
+			if max(etäisyys(0), etäisyys(1)) <= tämä.pituus() ** 2 and max(etäisyys(2), etäisyys(3)) <= toinen.pituus() ** 2:
+				return pistetyyppi(Px, Py)
+			else:
+				return None
+		except ZeroDivisionError:
+			return None
+
+class Piste:
+	def __init__(self, x, y):
+		self.x, self.y = x, y
+	def __repr__(self):
+		return 'Piste(%r, %r)' % (self.x, self.y)
+
+A = Monikulmio(
+	Piste(2,3),
+	Piste(1,1),
+	Piste(4,0),
+	Piste(6,2),
+	Piste(4,4))
+L1 = Jana(Piste(1, 1), Piste(-1, 5))
+L2 = Jana(Piste(1, 5), Piste(5, 1))
--- a/misc.py	Fri May 19 21:15:12 2017 +0300
+++ b/misc.py	Thu May 25 16:41:21 2017 +0300
@@ -2,7 +2,7 @@
 
 def tänään():
 	return date.today()
-	#return date(2017, 4, 10)
+	#return date(2017, 1, 10)
 
 def nyt():
 	return datetime.now()
@@ -10,7 +10,9 @@
 
 def muotoile_aika(aika, suhteellinen = True):
 	erotus = aika - nyt()
-	if suhteellinen and erotus < timedelta(minutes = 30):
+	if suhteellinen and erotus < timedelta(minutes = 1):
+		return 'nyt'
+	elif suhteellinen and erotus < timedelta(minutes = 10):
 		return '%dm' % round(erotus.seconds / 60)
 	elif aika.date() == tänään():
 		return '%d:%02d' % (aika.hour, aika.minute)
--- a/palvelu.py	Fri May 19 21:15:12 2017 +0300
+++ b/palvelu.py	Thu May 25 16:41:21 2017 +0300
@@ -3,27 +3,71 @@
 from datetime import datetime, date, time, timedelta
 from misc import *
 import locale
+from bussireitti import supista_reitti
+from configparser import ConfigParser
 
 app = Flask(__name__)
 locale.setlocale(locale.LC_ALL, locale.getdefaultlocale())
 
+kielet = ['fi', 'sv', 'en', 'ru']
+kieli_ini = {}
+for kieli in kielet:
+	ini = ConfigParser()
+	ini.read(kieli + '.ini')
+	kieli_ini[kieli] = ini
+
+def käännä(nimi, osio):
+	kieli = sivun_kieli()
+	try:
+		return kieli_ini[kieli][osio][nimi]
+	except KeyError:
+		return nimi
+
+def sivun_kieli():
+	from flask import request
+	if request.args.get('sv') is not None:
+		return 'sv'
+	elif request.args.get('en') is not None:
+		return 'en'
+	elif request.args.get('ru') is not None:
+		return 'ru'
+	elif request.args.get('kääntämätön') is None:
+		return 'fi'
+	else:
+		return None
+
 @app.route('/pysäkki/<tunniste>')
 def pysäkkiaikataulu(tunniste):
 	from bussit import pysäkit
+	from math import ceil
 	aikataulu = []
 	try:
 		pysäkki = pysäkit[tunniste]
 	except KeyError:
 		abort(404)
 	for (aika, pysähdys) in pysäkki.aikataulu(100):
+		kyltti = supista_reitti(pysähdys.ajo.suppea_reitti(pysähdys))
+		kyltti = [käännä(paikka, 'paikat') for paikka in kyltti]
+		kylttiesitys = ' - '.join(kyltti)
+		if len(kylttiesitys) > 25:
+			k = ceil(len(kyltti) / 2)
+			kylttiesitys = ' - '.join(kyltti[:k]) + '\n' + ' - '.join(kyltti[k:])
 		aikataulu.append({
 			'aika': muotoile_aika(aika),
 			'linja': pysähdys.ajo.linja.viite,
-			'kyltti': pysähdys.ajo.kyltti,
+			'kyltti': kylttiesitys,
 			'ajovuoro': pysähdys.ajo.nimi,
 			'yö': yö(aika),
 		})
-	return render_template('pysäkki.html', aikataulu = aikataulu, viite = tunniste, nimi = pysäkki.nimi)
+	return render_template(
+		'pysäkki.html',
+		aikataulu = aikataulu,
+		viite = tunniste,
+		nimi = käännä(pysäkki.nimi, 'pysäkit'),
+		linkki_karttaan = pysäkki.linkki_karttaan,
+		alue = pysäkki.alue,
+		sijainti = pysäkki.sijainti,
+	)
 
 @app.route('/ajovuoro/<numero>')
 def ajoreitti(numero):
@@ -43,21 +87,24 @@
 		reitti.append({
 			'aika': muotoiltu_aika,
 			'tunniste': pysähdys.pysäkki.tunniste,
-			'alue': pysähdys.pysäkki.alue,
-			'nimi': pysähdys.pysäkki.nimi,
+			'alue': käännä(pysähdys.pysäkki.alue or '', 'paikat'),
+			'nimi': käännä(pysähdys.pysäkki.nimi, 'pysäkit'),
 		})
 		alue = pysähdys.pysäkki.alue
 		if alue:
 			if alue not in käydyt_alueet:
 				suppea_reitti.append({
 					'aika': muotoiltu_aika,
-					'alue': alue
+					'alue': alue,
 				})
 				käydyt_alueet.add(alue)
+	kyltti = supista_reitti([k['alue'] for k in suppea_reitti], kokonainen = True)
 	sivu = suppea and 'ajovuoro-suppea.html' or 'ajovuoro.html'
 	return render_template(sivu, reitti = reitti, suppea_reitti = suppea_reitti,
-						numero = numero, linja = ajovuoro.linja.viite, selite = ajovuoro.kyltti,
-						yö = yö(datetime.combine(tänään(), time()) + ajovuoro.reitti[-1].saapumisaika))
+						numero = numero, linja = ajovuoro.linja.viite,
+						selite = ' - '.join(käännä(paikka, 'paikat') for paikka in kyltti),
+						yö = yö(datetime.combine(tänään(), time()) + ajovuoro.reitti[-1].saapumisaika),
+						)
 
 if __name__ == '__main__':
 	from argparse import ArgumentParser
--- a/sv.ini	Fri May 19 21:15:12 2017 +0300
+++ b/sv.ini	Thu May 25 16:41:21 2017 +0300
@@ -1,4 +1,5 @@
 [pysäkit]
+korppoo = Korpo
 artukainen = Artukais
 artukaisten tehtaat = Artukais fabriker
 urusvuori = Urusberget
@@ -62,13 +63,18 @@
 ihalan koulu = Ihala skolan
 kela = Fpa
 lentoasema = Flygplatsen
-cygnaeuksen koulu = Cygnaeus skolan
 koski tl = Koskis
 kupittaan asema = Kuppis station
 yliopisto = Universitet
 ylioppilaskylä = Studentbyn
 satama = Hamnen
 haarla = Harlax
+rahtiasema = Fraktstation
+ispoinen = Ispois
+itäinen pitkäkatu = Österlånggatan
+raisionjoki = Reso å
+patterinhaka = Batterihagen
+kt terveyskeskus = Hälsovärdcentralen
 
 
 
@@ -84,7 +90,6 @@
 ahmankatu = Ahmankatu
 ahola = Ahola
 ahteentaanranta = Ahteentaanranta
-ahteentaka = Ahteentaka
 ahtolantie = Ahtolantie
 ahtonkaari = Ahtonkaari
 ahvenanmaankatu = Ahvenanmaankatu
@@ -333,8 +338,6 @@
 isosuontie = Isosuontie
 isotalontie = Isotalontie
 isovuorentie = Isovuorentie
-ispoinen = Ispoinen
-itäinen pitkäkatu = Itäinen Pitkäkatu
 itäkaari = Itäkaari
 itäkeskus = Itäkeskus
 itäniityntie = Itäniityntie
@@ -552,7 +555,6 @@
 korpelantie = Korpelantie
 korpoström = Korpoström
 korppolaismäki = Korppolaismäki
-korppoo = Korppoo
 korvenmäki = Korvenmäki
 koskela = Koskela
 kostilantie = Kostilantie
@@ -579,7 +581,6 @@
 kruunutilankatu = Kruunutilankatu
 kruuvainen = Kruuvainen
 kräkiläntie = Kräkiläntie
-kt terveyskeskus = Kt terveyskeskus
 kuhilaspelto = Kuhilaspelto
 kuhilastie = Kuhilastie
 kuivalahti = Kuivalahti
@@ -1028,7 +1029,6 @@
 parmaharju = Parmaharju
 parolanpuisto = Parolanpuisto
 parrantie = Parrantie
-patterinhaka = Patterinhaka
 paunankatu = Paunankatu
 pellavakatu = Pellavakatu
 pellervonkatu = Pellervonkatu
@@ -1139,7 +1139,6 @@
 raatimiehenkatu = Raatimiehenkatu
 rahinpolku = Rahinpolku
 rahkasammaleenkatu = Rahkasammaleenkatu
-rahtiasema = Rahtiasema
 raidetie = Raidetie
 raidistontie = Raidistontie
 raikonkuja = Raikonkuja
@@ -1153,7 +1152,6 @@
 raision sairaala = Raision sairaala
 raision tehtaat = Raision tehtaat
 raision vesitorni = Raision vesitorni
-raisionjoki = Raisionjoki
 rajalahti = Rajalahti
 rakennusmestarintie = Rakennusmestarintie
 rakentajantie = Rakentajantie
@@ -1260,7 +1258,6 @@
 sammonkatu = Sammonkatu
 samppa = Samppa
 samppalinna = Samppalinna
-samppalinna   = Samppalinna  
 samppalinnan koulu = Samppalinnan koulu
 sampsankatu = Sampsankatu
 sannainen = Sannainen
@@ -1642,19 +1639,22 @@
 artukainen = Artukais
 eerikvalla = Erikvalla
 haarla = Harlax
-halinen = Halinen
+halinen = Hallis
 härkämäki = Oxbacka
 illoinen = Illois
 ilpoinen = Ilpois
 itäharju = Österås
 itäranta = Öststranden
 ispoinen = Ispois
+kaarina = S:t Karins
+kaarinan keskusta = S:t Karins centrum
 kaistarniemi = Kaistarudden
 katariina = Katarina
 kauppatori = Salutorget
 kerttuli = Gertrudsbacken
 koivula = Björkas
 konserttitalo = Konserthuset
+koroinen = Korois
 kuninkoja = Kungsbäcken
 kupittaa = Kuppis
 kurala (naantali) = Kurala
@@ -1664,31 +1664,39 @@
 isokylä = Storby
 lauste = Laustis
 lauttaranta = Färjstranden
-lentoasema = Flygplatsen
+lentoasema = ✈ Flygplatsen
 liljalaakso = Liljedalen
 linja-autoasema = Linjebilstationen
 littoinen = Littois
+länsiranta = Väststranden
+länsikeskus = Västcentrum
 majakkaranta = Fyrstranden
+metsämäki = Skogsbacka
+mäntymäki = Tallbacka
 moikoinen = Moikois
 naantali = Nådendal
-nummenmäki = Nummisbacken
+nummenmäki = Nummis
 paattinen = Patis
 papinsaari = Prästholmen
 patterinhaka = Batterihagen
 pernon telakka = Perno varvet
 pikisaari = Beckholmen
+pitkämäki = Långbacka
+pläkkikaupunki = Bleckstaden
 pohjola = Norrstan
 puutori = Trätorget
 pääskyvuori = Svalberga
-raision keskusta = 
+raisio = Reso
+raision keskusta = Reso centrum
 rautatieasema = Järnvägsstation
 ruissalo = Runsala
 runosmäki = Runosbacken
 ruskon keskusta = Rusko centrum
 rymättylä = Rimito
 saramäki = Starrbacka
-satama = Hamnen
+satama = ⚓ Hamnen
 skanssi = Skansen
+toijainen = Toijais
 tuomiokirkkotori = Domkyrkotorget
 tyks = ÅUCS
 urusvuori = Urusberget
@@ -1700,6 +1708,16 @@
 vähä-heikkilä = Lillheikkilä
 yli-maaria = Övre S:t Marie
 yliopistonmäki = Universitetsbacken
+ylioppilaskylä = Studentbyn
 ylioppilaskylä-länsi = Västra Studentbyn
 ylioppilaskylä-itä = Östra Studentbyn
 caribia = Spa Caribia
+lieto as. = Lundo stn.
+kauppakeskus mylly = Köpcentrum Mylly
+turku = Åbo
+piikkiö = Pikis
+paimio = Pemar
+paimion sairaala = Pemar sjukhus
+lieto = Lundo
+koski tl = Koskis
+marttila = S:t Mårtens
--- a/templates/pysäkki.html	Fri May 19 21:15:12 2017 +0300
+++ b/templates/pysäkki.html	Thu May 25 16:41:21 2017 +0300
@@ -35,10 +35,17 @@
 		width:100%;
 		margin: auto;
 	}
-	#aikataulu td
+	
+	.sarake-aika, .sarake-linja
 	{
 		text-align: center;
 	}
+	
+	.sarake-määränpää
+	{
+		text-align: left;
+	}
+	
 	td, th, body
 	{
 		font-size: 24pt;
@@ -46,44 +53,80 @@
 	
 	.sarake-aika, .sarake-linja
 	{
-		width: 15%;
+		width: 25%;
 	}
 	
 	h1
 	{
 		font-variant: small-caps;
 	}
-
-	.yölinja
+	
+	.sarake-määränpää a
+	{
+		white-space: pre-wrap;
+	}
+	
+	#aikataulu tr td
+	{
+		padding-bottom: 10px;
+		padding-top: 10px;
+		padding-left: 0px;
+		padding-right: 0px;
+		margin: 0px;
+		border-top: 1px solid gray;
+	}
+	
+	#aikataulu tr:nth-child(even) {
+		background-color: #F8F8F8;
+	}
+	
+	#aikataulu tr.yö td
 	{
-		background-color: #AAF;
-		color: #00A;
-		padding-left: 6px;
-		padding-right: 6px;
-		border: 1px solid #00A;
+		/*
+		background-color: #d8d8ff;
+		color: #008;
+		border-bottom: 1px solid #00A;
+		*/
+		background-color: #004;
+		color: #bef;
+		border-top: 1px solid #008;
+	}
+	
+	#aikataulu tr.yö:nth-child(even) td
+	{
+		background-color: #003;
+	}
+	
+	#pysäkki-info
+	{
+		text-align: center
+	}
+	
+	.pysäkki-sijainti
+	{
+		font-size: smaller;
 	}
 	</style>
 	<title>{{viite}} {{nimi}}</title>
 </head>
 <body>
 	<h1>{{viite}} {{nimi}}</h1>
-	<table id='aikataulu'>
+	<p id="pysäkki-info">
+	{{alue or ""}}
+	—
+	<a class="pysäkki-sijainti" href="{{linkki_karttaan}}" target="_blank">📌 ({{sijainti}})</a>
+	</p>
+	<table id='aikataulu' cellspacing="0">
 		<tr>
 			<th class='sarake-aika'>Aika</th>
 			<th class='sarake-linja'>Linja</th>
 			<th class='sarake-määränpää'>Määränpää</th>
 		</tr>
 		{% for rivi in aikataulu %}
-		<tr>
+		<tr class="{% if rivi['yö'] %} yö {% endif %}">
 			<td class='sarake-aika'>{{rivi['aika']}}</td>
 			<td class='sarake-linja linja'>
-				{% if rivi['yö'] %}
-				<span class="yölinja">
-				{% endif %}
 				<a href="/ajovuoro/{{rivi['ajovuoro']}}">{{rivi['linja']}}</a>
-				{% if rivi['yö'] %}
-				</span>
-				{% endif %}
 			</td>
 			<td class='sarake-määränpää'>
 				<a href="/ajovuoro/{{rivi['ajovuoro']}}">{{rivi['kyltti']}}</a>

mercurial