Extension : Recherche ds deux valeurs les plus proches
Développement possible
Il s'agit d'une suite possible, si vous êtes assez en avance, de l'exercice 2.
Supposons que nous disposions d'un fichier contenant des informations sur les villes du monde. Ce fichier pourrait prendre la forme suivante :
| city | city_ascii | lat | lng | country | iso2 | iso3 | admin_name | capital | population | id |
|---|---|---|---|---|---|---|---|---|---|---|
| Tokyo | Tokyo | 35.6850 | 139.7514 | Japan | JP | JPN | Tōkyō | primary | 35676000 | 1392685764 |
| New York | New York | 40.6943 | -73.9249 | United States | US | USA | New York | 19354922.0 | 1840034016 | |
| Mexico City | Mexico City | 19.4424 | -99.1310 | Mexico | MX | MEX | Ciudad de México | primary | 19028000 | 1484247881 |
Le fichier brut – c'est à dire ouvert sans mise en forme – aurait la forme suivante :
city;city_ascii;lat;lng;country;iso2;iso3;admin_name;capital;population;id Tokyo;Tokyo;35.6850;139.7514;Japan;JP;JPN;Tōkyō;primary;35676000;1392685764 New York;New York;40.6943;-73.9249;United States;US;USA;New York;;19354922.0;1840034016 Mexico City;Mexico City;19.4424;-99.1310;Mexico;MX;MEX;Ciudad de México;primary;19028000;1484247881 ...
Ce fichier est disponible ici : worldcities.csv. Vous pouvez le télécharger et le déposer à côté de votre fichier programme.
Pour charger les données de ce fichier dans votre programme, vous pouvez procéder ainsi :
import csv
file = open('worldcities.csv', 'r', encoding='utf8')
reader = csv.DictReader(file, delimiter=';')
villes = []
for row in reader:
formated_row = {"city":row["city"],
"country":row["country"],
"lat":float(row["lat"]),
"lng":float(["lng"])}
villes.append(formated_row)
file.close()
Comme souvent, ce fichier issu de base de données contient des informations sans intérêt pour nous. De plus l'extraction du fichier requiert que nous identifions les nombres en tant que tels. C'est la raison de la ligne de formatage, formated_row.
À l'issue de ces lignes, vous disposez d'un tableau villes dont chaque item est un dictionnaire contenant toutes les informations pertinentes sur une ville et en particulier sa latitude (lat) et sa longitude (lng).
Exemple d'item obtenu :
{"city":"Mumbai", "lat":19.0170, "lng":72.8570, "country":"India"}
Nous avons donc maintenant un tableau villes pour lequel le calcul de distances entre deux items a et b sera plus compliqué :
$$D_{ab} = R \arccos(\sin(latitude_a) \sin(latitude_b) + \cos(longitude_a - longitude_b) \cos(latitude_a) \cos(latitude_b))$$
Les angles doivent être convertis en radians. Avec pour la Terre, $R \simeq 6\,378\,km$.
En python, on pourra importer : from math import cos, sin, acos, radians. La fonction radians assure la conversion degrés → radians.
- Écrire une fonction
distance_villes(a,b)qui calcule la distance entre deux villesaetbdonnées sont forme de dictionnaires. - Écrire une version
ppd2deppdpour laquelle on ajoute comme argument le nom de la fonction à utiliser pour calculer la distance entre deux items. Utilisez cette fonction pour trouver les deux villes les plus proches.
