L'objectif est d'afficher une trace GPS (au format GPX) sur un fond de carte. Ce dernier sera obtenu par le biais du service en ligne MapQuest (ou un autre serveur de tuiles [[http://openstreetmap.org|OpenStreetMap]]) Un système de cache permettra d'économiser les accès réseau. Le principe général de fonctionnement sera le suivant:
Le format GPX est un des standards pour la représentations de points, chemins et routes acquis par un GPS. Il contient essentiellement des positions (en 2D ou 3D) datées. Un fichier GPX est un fichier XML.
La lecture des fichiers GPX peut être réalisée de trois façons :
Un fichier GPX de test est disponible ici : [[files>melu.gpx]]. Ce fichier contient 1 chemin (track), aucun waypoint, et aucune route. Le chemin en question est composé d'un seul segment, et ce segment contient 3983 points. Chacun de ces points contient une latitude, une longitude, une élévation et une date.
La page d'accueil de Gpxpy (cf plus haut) contient un fichier d'exemple, que nous adaptons ici pour relire notre fichier particulier :
import gpxpy gpx_file = open('melu.gpx', 'r') gpx = gpxpy.parse(gpx_file) points=gpx.tracks[0].segments[0].points for i,point in enumerate(points): print('Point at ({0},{1},{2}) : {3}'.format(point.latitude, point.longitude, point.elevation,point.time))
L'exécution du programme produit :
... Point at (46.439992,0.115957,146.0) : 2013-04-14 08:38:51 Point at (46.439977,0.11594,146.0) : 2013-04-14 08:38:52 Point at (46.43996,0.115923,146.0) : 2013-04-14 08:38:53 Point at (46.439945,0.115908,146.0) : 2013-04-14 08:38:54 Point at (46.439932,0.115887,146.0) : 2013-04-14 08:38:55 Point at (46.439915,0.115868,146.0) : 2013-04-14 08:38:56 ...
À partir de là, il est déjà possible de tracer ces points (par exemple avec matplotlib
).
Pour de petites traces, il n'est pas nécessaire de se documenter sur les différentes projections cartographiques : on pourra assimiler longitude et latitude à des coordonnées cartésiennes sans commettre une trop grosse erreur. Le lecteur intéressé pourra toutefois se reporter à :
Les tuiles sont de petites images de 256x256 qui contiennent des portions de cartes. Elles existent en différents facteurs de zoom. Les tuiles sont indexées par un doublet de nombres (x,y). Étant données une latitude et une longitude particulière, ainsi qu'un certain niveau de zoom, des fonctions documentées (voir [[http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Python|Calculer (xtile,ytile)]]) permettent de calculer le doublet (x,y) qui identifie la tuile contenant le point. Enfin, les tuiles se recollent ainsi : la tuile (x+1,y) est à l'est de la tuile (x,y), la tuile (x,y+1) est au sud de la tuile (x,y).
Il y a plusieurs serveurs de tuiles, mais on pourra par exemple essayer
http://otile1.mqcdn.com
.
La tuile contenant l'Ensip, de niveau de zoom 17 est la (65675, 46330)
.
Elle est accessible à l'URL :
http://otile1.mqcdn.com/tiles/1.0.0/map/17/65675/46330.jpg
Finalement, étant donnée une trace GPS, on peut connaître les latitudes min,max et les longitudes min,max qui lui correspondent. Puis on peut en déduire la liste des tuiles qui recouvrent cette zone (on prendra toujours une zone rectangulaire, c'est plus facile). Il reste alors à télécharger les tuiles, et à éventuellement les mettre en cache pour ne pas trop solliciter le serveur de tuiles.
Une fois la trace affichée sur la carte, on peut ajouter des possibilités :
Pour réaliser ce projet, il est nécessaire d'avoir un toolkit graphique à disposition (PySide, Tkinter… pour Python). Il est aussi nécessaire de réaliser des requêtes HTTP pour récupérer les images (le module python ''requests'' permet de faire ça très simplement, voir par exemple : [[stu:python_reseau:webapis|Python et les Apis Web]]). Si, comme conseillé, on gère un cache, il faut aussi pouvoir accéder au système de fichiers (standard dans tous les langages).