Outils pour utilisateurs

Outils du site


itc:tps:tp2:exercice2_plus

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 :

citycity_asciilatlngcountryiso2iso3admin_namecapitalpopulationid
TokyoTokyo35.6850139.7514JapanJPJPNTōkyōprimary356760001392685764
New YorkNew York40.6943-73.9249United StatesUSUSANew York19354922.01840034016
Mexico CityMexico City19.4424-99.1310MexicoMXMEXCiudad de Méxicoprimary190280001484247881

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.

  1. Écrire une fonction distance_villes(a,b) qui calcule la distance entre deux villes a et b données sont forme de dictionnaires.
  2. Écrire une version ppd2 de ppd pour 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.
itc/tps/tp2/exercice2_plus.txt · Dernière modification : de goupillwiki