busroute.py

changeset 52
cab8d38fe5c6
parent 46
548b526ded3b
child 53
1c934953c3e6
--- a/busroute.py	Tue Aug 29 17:34:09 2017 +0300
+++ b/busroute.py	Tue Aug 29 21:01:57 2017 +0300
@@ -1,30 +1,43 @@
 #!/usr/bin/env python3
 
+from configparser import ConfigParser
+
 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',
-	'Kemiö': 'Kemiönsaari',
-	'Kasnäs': 'Kemiönsaari',
-	'Pernon telakka': 'Perno',
+	"ylioppilaskylä-itä": "ylioppilaskylä",
+	"ylioppilaskylä-länsi": "ylioppilaskylä",
+	"jokila": "lieto",
+	"piispala": "lieto",
+	'saaro': 'ruissalo',
+	'silvola': 'vahto',
+	'hemmola': 'vahto',
+	'paasniittu': 'ruskon keskusta',
+	'kahari': 'ruskon keskusta',
+	'kemiö': 'kemiönsaari',
+	'kasnäs': 'kemiönsaari',
+	'pernon telakka': 'perno',
 }
 
 # nimiä joista voidaan joustaa tarvittaessa
 abbreviations = {
-	'Raision keskusta': 'Raisio',
-	'Ruskon keskusta': 'Rusko',
-	'Naantalin keskusta': 'Naantali',
-	'Kaarinan keskusta': 'Kaarina',
-	'Kauppakeskus Mylly': 'Mylly',
+	'raision keskusta': 'raisio',
+	'ruskon keskusta': 'rusko',
+	'naantalin keskusta': 'naantali',
+	'kaarinan keskusta': 'kaarina',
+	'kauppakeskus mylly': 'mylly',
 }
 
+region_info = ConfigParser()
+region_info.read('regions.ini')
+municipalities = set(region_info.sections())
+municipalities_per_region = {}
+
+for municipality in municipalities:
+	for region in region_info[municipality].keys():
+		municipalities_per_region[region] = municipality
+
+for place_from, place_to in replacements.items():
+	municipalities_per_region[place_to] = municipalities_per_region[place_from]
+
 def simplify_name(name):
 	name = replacements.get(name, name)
 	name = abbreviations.get(name, name)
@@ -34,10 +47,6 @@
 	length = ((trip_length / 600) + len(reitti)) / 2
 	if not reitti:
 		return ''
-	eksoalueet = {
-		'Turku', 'Naantali', 'Lieto', 'Aura', 'Kaarina', 'Pargas', 'Marttila', 'Somero', 'Koski Tl', 'Tarvasjoki',
-		'Kaivopuisto',
-	}
 	have_already = set()
 	i = 0
 	while i < len(reitti):
@@ -49,77 +58,78 @@
 			have_already.add(reitti[i])
 			i += 1
 	priorities = {
-		'Ihala': 150,
-		'Kauppakeskus Mylly': 200,
-		'Kuninkoja': 80,
-		'Moikoinen': 80,
-		'Raision keskusta': 150,
-		'Kukola': 50,
-		'Kaistarniemi': 50,
-		'Papinsaari': 50,
-		'Oriniemi': 50,
-		'Pikisaari': 50,
-		'Häppilä': 20,
-		'Haarla': 80,
-		'Ylioppilaskylä': 50,
-		'Halinen': 70,
-		'Kakskerta': 200,
-		'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,
-		'Lieto as': 200,
-		'Ilmarinen': 50,
-		'Vahto': 50,
-		'Ruskon keskusta': 200,
-		'Oriketo': 50,
-		'Harittu': 40,
-		'Jäkärlä': 50,
-		'Paattinen': 100,
-		'Kaarinan keskusta': 200,
-		'Naantalin keskusta': 200,
-		'Uittamo': 50,
-		'Piikkiö': 100,
-		'Paimio': 100,
-		'Pargas': 100,
-		'Nagu': 100,
-		'Yli-Maaria': 70,
-		'Saramäki': 50,
-		'Tarvasjoki': 100,
-		'Marttila': 100,
-		'Koski Tl': 100,
-		'Katariina': 50,
-		'Länsikeskus': 50,
-		'Kaanaa': 100,
-		'Satava': 50,
-		'Suikkila': 50,
-		'Raunistula': 50,
-		'Räntämäki': 50,
-		'Moisio': 25,
-		'Pääskyvuori': 100,
-		'Rautatieasema': 50,
-		'Logomo': 100,
-		'Rymättylä': 50,
-		"Sauvo": 500,
-		"Kemiönsaari": 500,
-		'Suovuori': 300,
-		'Eerikvalla': 50,
-		'Petäsmäki': 50,
-		'Tortinmäki': 50,
-		'Aura': 100,
-		'Friskala': -1,
+		'ihala': 150,
+		'kauppakeskus mylly': 200,
+		'kuninkoja': 80,
+		'moikoinen': 80,
+		'raision keskusta': 150,
+		'kukola': 50,
+		'kaistarniemi': 50,
+		'papinsaari': 50,
+		'oriniemi': 50,
+		'pikisaari': 50,
+		'häppilä': 20,
+		'haarla': 80,
+		'ylioppilaskylä': 50,
+		'halinen': 70,
+		'kakskerta': 200,
+		'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,
+		'lieto as': 200,
+		'ilmarinen': 50,
+		'vahto': 50,
+		'ruskon keskusta': 200,
+		'oriketo': 50,
+		'harittu': 40,
+		'jäkärlä': 50,
+		'paattinen': 100,
+		'kaarinan keskusta': 200,
+		'naantalin keskusta': 200,
+		'uittamo': 50,
+		'piikkiö': 100,
+		'paimio': 100,
+		'pargas': 100,
+		'nagu': 100,
+		'yli-maaria': 70,
+		'saramäki': 50,
+		'tarvasjoki': 100,
+		'marttila': 100,
+		'koski tl': 100,
+		'katariina': 50,
+		'länsikeskus': 50,
+		'kaanaa': 100,
+		'satava': 50,
+		'suikkila': 50,
+		'raunistula': 50,
+		'räntämäki': 50,
+		'moisio': 25,
+		'pääskyvuori': 100,
+		'rautatieasema': 50,
+		'logomo': 100,
+		'rymättylä': 50,
+		"sauvo": 500,
+		"kemiönsaari": 500,
+		'suovuori': 300,
+		'eerikvalla': 50,
+		'petäsmäki': 50,
+		'tortinmäki': 50,
+		'aura': 100,
+		'friskala': -1,
+		'merimasku': 50,
 	}
 
-	if 'Kauppatori' not in reitti:
-		priorities['Länsikeskus'] = priorities['Skanssi'] = priorities['Kauppatori']
+	if 'kauppatori' not in reitti:
+		priorities['länsikeskus'] = priorities['skanssi'] = priorities['kauppatori']
 
 	from_place = reitti[0]
 	destination = reitti[-1]
@@ -160,29 +170,31 @@
 	except IndexError:
 		pass
 	# lajitellaan painoarvot uudestaan reittijärjestykseen jotta sign tulee oikeinpäin
-	weights = sorted(weights, key = lambda paino: paino[2])
+	weights = sorted(weights, key = lambda weight_data: weight_data[2])
 	# muodostetaan sign..
 	sign = [paino[0] for paino in weights]
-	# supista nimet jos mahdollista
-	def finalise(sign, abbreviation_level = 0):
-		if abbreviation_level > 0:
-			sign = [abbreviations.get(paikka, paikka) for paikka in sign]
-		return sign
-	result = finalise(sign)
-	for i in range(len(sign) - 1):
-		if sign[i + 1].startswith(sign[i]):
-			del sign[i]
+	to_place = sign[-1]
+	if from_place != to_place:
+		municipality_from = municipalities_per_region.get(from_place)
+		municipality_to = municipalities_per_region.get(to_place)
+		if municipality_from and municipality_to and municipality_from not in ['Turku', municipality_to]:
+			def convert_region(region):
+				municipality = municipalities_per_region.get(region, region)
+				if municipality != municipality_from:
+					return municipality
+				else:
+					return region
+			sign = [convert_region(region) for region in sign]
+	# supista nimet tarvittaessa
 	if len(' - '.join(sign)) > 20:
-		result = finalise(sign, abbreviation_level = 1)
+		sign = [abbreviations.get(place, place) for place in sign]
+	old_sign = sign.copy()
+	sign = []
+	for place in old_sign:
+		if place not in sign:
+			sign.append(place)
 	if whole:
-		result = [from_place] + result
-	if not result:
-		result = [destination]
-	short_from_place = replacements.get(from_place, from_place)
-	if (
-		short_from_place != result[-1]
-		and abbreviations.get(short_from_place, short_from_place) in eksoalueet | {'Kauppatori'}
-		and result[-1] in eksoalueet | {'Kauppatori'}
-	):
-		result = ['Turku' if k == 'Kauppatori' else k for k in result]
-	return result
+		sign = [from_place] + sign
+	if not sign:
+		sign = [destination]
+	return sign

mercurial