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.
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 y 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:
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:
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:
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.
Por solicitar asesoría, tengo unos archivos en excel sin coordenadas, pero tengo el nombre de la localidad, ya se que puedo hacer un join entre una base de datos georeferenciada y estos, mi pregunta, es como realizar la unión de 1 a muchos (exagerando tengo un registro que en cada localidad hay hasta treinta caso para una localidad). existe algun algoritmo, o opción que me permita mapificar esto. (para un proyecto de salud)
Buenas Fabián,
lo que comentas se corresponde con el funcionamiento normal de un JOIN de SQL, puedes verlo en la documentación de PostgreSQL en un caso similar al tuyo. Si quisieras profundizar en tus conocimientos de bases de datos y PostGIS puedes matricularte en este curso.
Hola,
Me parece muy interesante esta entrada, quiero probar con mis datos descargados de google maps, pero se descargan en JSON y no puedo convertirlos a GPX. ¿Me recomiendas una alternativa? Gracias
Buenas Sabina,
los ficheros GPX tienen la estructura de un XML que hemos explorando hasta encontrar la información de las coordenadas. Puedes abrir el fichero JSON con un editor de texto o con tu editor de código de preferencia y explorar la estructura de los datos, luego solo tendrás que modificar la parte que se corresponde para ir almacenando las coordenadas y la elevación en sus respectivas listas. En Python trabajar con ficheros JSON es muy sencillo a través de la librería json. Un saludo
Hola, intento subir mi archivo GPX pero solo carga una linea de texto que no es propiamente el texto. La muestro a continuacion:
Si lo cargo como gpx_file.read() la grafica sale vacia!
Buenas Esteban,
me faltan datos para ayudarte con el problema. En la entrada a la función parse de ET se le pasa la ruta del fichero. Si usas cualquier otro método para leerlo, deberás también crear tu propia forma de acceder a las etiquetas XML, sin esta información no habrá nada que mostrar en la gráfica. Un saludo.
pero pongan el link al repositorio o algo por fis