Outils pour utilisateurs

Outils du site


tp:python:gpxviewer

Affichage de traces GPS sur un fond de carte

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:

  1. L'utilisateur choisit un fichier GPS (au format GPX).
  2. Ce fichier est lu et on relève les latitudes et longitudes du rectangle englobant la trace.
  3. À partir de ces bornes, on calcule la liste des dalles (ou tuiles) de carte nécessaires.
  4. On télécharge les dalles
  5. On les affiche, puis on affiche la trace par dessus

Relire le fichier GPS

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 :

  • comme lecture d'un fichier texte, puis repérage des balises, décomposition en arbre XML, décodage des informations : cette solution est la plus difficile, mais elle ne nécessite aucun module extérieur
  • lecture d'un fichier GPX en tant que fichier XML (avec le module ElementTree par exemple, qui peut manipuler l'arbre XML)
  • utilisation d'un module spécifique pour relire les fichiers GPX : par exemple GpxPy

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 à :

Récupérer les tuiles

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.

Pour aller plus loin

Une fois la trace affichée sur la carte, on peut ajouter des possibilités :

  • scroller sur la carte
  • zoomer ou dézoomer
  • charger des tuiles hors de la trace
  • afficher des courbes de vitesse, d'altitude etc… (matplotlib)
  • etc…

Outils nécessaires

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).

Solution Visualiseur GPX Pyside

tp/python/gpxviewer.txt · Dernière modification: 2014/09/14 16:54 (modification externe)