En esta entrada vas a aprender a explorar el poder de Python para leer datos de GPS y de matplotlib para representarlo. El primer paso va a ser a explorar datos de GPS en formato .gpx con Python y el segundo paso explorar las posibilidades de representación de datos con matplotlib.

ruta sobre 0

Leer un fichero .gpx

Antes de nada vamos a importar todos los módulos que serán necesarios:

from matplotlib import cm
from mpl_toolkits.mplot3d import axes3d, Axes3D
import matplotlib.pyplot as plt
import numpy as np
import xml.etree.ElementTree as ET

Los ficheros .gpx siguen la estructura de un .xml y por lo tanto podemos usar la librería xml.etree.ElementTree. Podemos abrir el fichero .gpx para conocer su estructura con un editor de texto o en el navegador. Mediante el siguiente código accedemos a los puntos que contienen las coordenadas y la elevación:

# f es la variable que contiene la ruta a nuestro fichero .gpx
tree = ET.parse(f)
root = tree.getroot()

ydata = []
xdata = []
zdata = []
for elem in root[0][1]:
    lat = elem.attrib['lat']
    ydata.append(float(lat.replace('"', '').replace(',', '')))
    lon = elem.attrib['lon']
    xdata.append(float(lon.replace('"', '').replace(',', '')))
    # este condicional nos permite rellenar las coordenadas que por algún motivo no tengan
    # elevación con la elevación de la anterior y así tener datos para todos los puntos
    if (str(elem[0]).find('ele') != -1):
        elev = elem[0].text
        zdata.append(float(elev.replace('"', '').replace(',', '')))
    else:
        elev = elev
        zdata.append(float(elev.replace('"', '').replace(',', '')))

Ahora ya tenemos los datos geográficos almacenados en las variables xdata, ydata zdata. Pasaremos ahora a hacer magia con matplotlib y a divertirnos probando diferentes estilos de representación de datos.

Explorando matplotlib (otra vez)

Sí, otra vez, no te pierdas la vez anterior. Te esperamos aquí.

Seguimos. Vamos ahora a representar estos datos de GPS, la primera idea es representarlos en tres dimensiones, usaremos las siguientes líneas:

fig = plt.figure()
ax = Axes3D(fig)
ax.plot(xdata, ydata, zdata)
plt.show()

Y obtendremos el siguiente resultado:

ruta gpx primer intento

Esta bien, ¿no?, pero los datos dan más de sí. Vamos intentar colorear la gráfica en función de la elevación. Para ello usaremos las siguientes líneas:

for i in range(len(zdata)-1):
    ax.plot(xdata[i:i+2], ydata[i:i+2], zdata[i:i+2], color = plt.cm.jet(zdata[i]/max(zdata)))
# vamos a establecer unos límites para el dibujo de la gráfica
ax.set_xlim([min(xdata), max(xdata)])
ax.set_ylim([min(ydata), max(ydata)])
ax.set_zlim([min(zdata), max(zdata)])
plt.show()

Con color estamos usando la paleta jet de matplotlib y asignándole de rango los valores contenidos en zdata (desde el cero). Obtendremos este resultado en el que los valores de la elevación están relacionados con una rampa de color:altura gps 1

La cosa no termina aquí, matplotlib ofrece muchas posibilidades de representación que podemos encontrar en su página. Aquí hemos dibujado la elevación de otra forma:

ruta elevada con caras

Se nos ocurre que podríamos combinar los ejercicios hechos con matplotlib y colocar una traza de GPS sobre un MDT, pero por hoy lo vamos a dejar aquí. Como puedes ver Python no solo son letras sobre un fondo negro, anímate a explorar matplotlib para darle vida a tu información geográfica. Si quieres aprender más apúntate a alguno de nuestros cursos y recibirás formación de calidad impartida por profesionales. Para obtener más información sobre los trámites puedes escribir a formacion@tycgis.com.

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (8 votos, promedio: 4,63 de 5)

Cargando...

Formación de calidad impartida por profesionales