Archivo de la categoría: Joanillo Productions

RutasGPS, nueva versión

Se ha publicado la nueva versión de mis rutas en bici. De la v5 a la v7 hay muchos cambios significativos: cambio total del diseño, responsive, Javascript con módulos, Openlayers v6 en la parte de mapas, se ha eliminado toda la parte de PHP (ahora es una webapp).

La lista de rutas se había hecho muy larga, y por tanto ahora las rutas se agrupan por zonas geográficas, que es un desplegable. Podemos filtrar por las rutes que se han hecho, y distinguirlas de las rutas ToDo, que son las que queremos hacer próximamente, si todo va bien. Las capas de render que se han escogido son el estandard de OSM, el TOPOTRESC, la OrtoFoto del ICGC, y el estandard del ICGC.
La única funcionalidad que queda por implementar es la Búsqueda de rutas, a ver si lo puedo hacer antes de las vacaciones.

Todo el código está colgador en el github. En la foto se puede apreciar el cambio de diseño de la versión anterior a la actual. Otra mejora importante que se ha implementado es la automatización del despliegue al servidor, de manera que ahora es más fácil y está más documentado publicar los cambios en la nueva versión.

Referencias:

Portfolio de proyectos

He ordenado un poco todo lo que tengo hecho, y lo he puesto en un portfolio de proyectos, bien claro. Enlaces a la wiki y a este mismo bloc (que ya tienen más de 12 años), la web de insectos, la de retroplaneta, y programación de diversas cosas, sobretodo mapas.

Quería un diseño muy minimalista, en blanco y negro, y creo que lo he conseguido.

Recordando la KKH-Karakorum Highway

El año 1997 hicimos con Jordi la KKH-Karakorum Highway, desde Chilas (en Pakistán) hasta Kashgar (en China), pasando por el Khunjerab Pass, el punto fronterizo de casi 4700m de altura.
Ahora que estoy ordenando las rutas de montaña, y recuperando rutas antiguas, era el momento de trazar la ruta y recordar las etapas que vivimos aquel verano. Qué emociones! Acampar al lado del lago Kara-Kul… La visión desde la carretera del Nanga Parbat (8125 m). Éramos jóvenes! Qué aventuras!

Podría haberme descargado la ruta de wikiloc, pero he preferido trazar yo mismo la ruta y así ir repasando los sitios por donde se pasa. Al final fueron casi 800 Km de recorrido. En aquella época no había el GPS. Creo que esta ruta ahora mismo no se puede hacer por problemas de seguridad. Por la parte de Pakistan creo que ahora la cosa islámica está más tranquila. Por otra partem en el bando chino hay problemas por la represión constante de China sobre la población uygur, tajik, y en general en la provincia de Xinjiang.

Municipios de Catalunya (Openlayers)

Hemos cogido del IDESCAT los datos de los municipios de más de 20.000 habitantes de Cataluña (una setantena de municipios), y los hemos geolocalizado.
En esta ocasión se quería practicar la selección de capas, y lo quería hacer todo con módulos (imports) de Javascript, y el código los más limpio posible.
Se puede ver el resultado en este video.

Cataluña Mágica

Se ha publicado la web de la Cataluña Mágica: demonios, infierno, brujas y diablos, con información extraída de OpenStreetMap.

Hemos utiltzado OpenLayers 6.5.0 (con el paradigma de imports), y los tiles estandard de OSM y también TRESC, una capa de visualización que me gusta mucho. Los datos que se obtienen pueden ser nodos o vías, y ha habido un trabajo previo de limpiar un poco los datos, pero todo ha sido un proceso muy rápido.

Referencias:

Gráficos interactivos con Jupyter Notebooks: tiro parabólico

Ahora que ya he empezado a hacer pruebas con Jupyter Notebook, el siguiente paso que quiero probar es hacer gráficos interactivos. Pues ha resultado ser más fácil y rápido de lo que pensaba.

Partimos de un script python que simula los datos experimentales de una trayectoria parabólica, y calcula la parábola que mejor se ajusta (regresión cuadrática). A partir de la ecuación de la parábola se puede deducir la constante g (=9,81 m/s2). Simulamos los datos experimentales introduciendo un error de ruido en los datos teóricos. Pues bien, con mi gráfico interactivo puedo jugar con el nivel de ruido y con el número de puntos del muestreo, tal com se ve en el video. El código queda de la siguiente forma:

%matplotlib inline
from ipywidgets import interactive
import numpy as np
import pylab as plt
from IPython.display import display, Math, Latex

# tir parabòlic: y = vy*t - .5gt^2
vy = 10 # 10m/s
g = 9.81 # m/s^2
t_max = 2*vy/g

def f(nivell_soroll, num_punts):
    t = np.linspace(0, t_max, num_punts)
    y_or = vy*t - .5*g*t**2
    noise = np.random.normal(0, nivell_soroll, num_punts) # simulem dades experimentals
    y = y_or + noise

    # ajustament a una paràbola
    z = np.polyfit(t, y, 2)
    g_exp = 2.0*z[0]

    t_ = np.linspace(0, t_max, 100)
    y_ = z[0]*t_**2 + z[1]*t_ + z[2]

    fig, ax = plt.subplots()
    plt.plot(t_, y_, t, y, 'bo')
    plt.suptitle("Tir parabòlic. Regressió quadràtica")
    plt.title("y = " + str(round(z[0],3)) + "t^2 + " + str(round(z[1],3)) + "t + " + str(round(z[2],3)) + " -> g exp = " + str(round(g_exp,3)) + " m/s^2")
    ax.set(xlabel='temps (s)', ylabel='y (m)')
    ax.grid()
    plt.show()
    
interactive_plot = interactive(f, nivell_soroll=(0.0, 2.0),  num_punts=(10, 50))
interactive_plot

Otra cosa que me interesa es la manera de exportar estos Jupyter Notebooks a una web, conservando las gráficas y las fórmulas en format Latex (aunque se pierda la interacció con las gráficas). Esto se consigue directamente exportando el Notebook a html:

$ jupyter nbconvert --execute tir_parabolic.ipynb --to html

e integrando este código en una web donde haya más texto y explicaciones, y con la librería Bootstrap.

Extraer información de un track GPX

Estaba haciendo un pequeño script en NodeJS para extraer la información de mis tracks de BTT. Esta es la información básica que se puede extraer:

$ node xml_stats.js ../rutesgps/montnegreopenmtb_32.gpx
track: ../rutesgps/montnegreopenmtb_32.gpx
2020-11-05
29.4 Km (distància total)
02:25:40 (temps en moviment)
02:58:01 (temps total)
1121 m (desnivell acumulat)
886 m (desnivell acumulat amb filtre)
143m -> 650m (altitud min and max)

La dificultad principal está en entender qué significa y cómo se calcula el desnivel acumulado. Pongamos por ejemplo una excursión bastante plana com puede ser el Passeig de les Aigües de Barcelona. Teniendo en cuenta que la resolución de mi GPS es de 1 metro (sin decimales), el hecho de recorrer una superficie plana hace que se vaya acumulando los metros de desnivel de una manera exagerada (aunque el GPS tuviera más resolución también pasaría). Lo primero que haremos es recalcular las elevaciones de mi track con algún servicio online que dé las alturas exactas, y con algún decimal. Después, la solución pasa por filtrar los datos, hacer un suavizado, es decir, hacer una media. Por ejemplo, por cada punto cogemos el valor de la elevación haciendo la media entre el punto actual y los puntos anterior y posterior. Sería una media de tres puntos. Como cada punto se graba a los 4 segundos, sería una media de 12 segundos. Ahora bien, puedo hacer filtrados de 5, 7, 9 o 11 puntos, i da como resultado valores de pendient acumulado cada vez más pequeños. ¿Qué criterio seguir? El caso es que los diferentes sistemas (mi GPS, wikiloc, etc…) dan valores diferentes. Esto hace que medir la elevación acumulada en una excursión no sea una medida demasiado fiable. Este efecto no es demasiado problemático en las excursiones con bajadas y subidas largas y constantes. Por contra, con excursiones con zonas llanas y terreno irregular el efecto se acumula más.

Todos estos cálculos dan pie a programar otro script para calcular subidas donde podemos definir unas cronoescaladas, subidas que se van repitiendo en los entrenamientos y se podrá extraer información para comparar. De ello hablaremos en un próximo post…

Virtual Pinball basado en Superman (Atari, 1979)

Finalmente ya he acabado el virtual pinball de Superman que irá hacia el País Vasco. Esta vez he mejorado diversos aspectos en el proceso de fabricación: perfiles de acero inoxidable, fijación de la TV, monedero de Industrias Lorenzo, diseño de los vinilos, paletización de la máquina. Y también he incorporado el simulador VPX además del VP9. Pero qué queréis que os diga, no he notado especialmente las mejoras que supuestamente incorpora el VPX.

También he cogido unas cuantas ideas por si he de coger una nueva máquina, que creo que podría hacer más rápidamente que esta última, que se me ha alargado demasiado. Así que ya está, sólo hace falta enviarla.

Referencias:

Proyectar imágenes del móvil

Cogiendo una idea que encontré por Internet, me he construido este no tan pequeño mueble para proyectar imágenes del móvil hacia el papel, y así de manera rápida poder dibujar una imagen del móvil a papel.

La calidad no es nada buena porque la óptica de que dispongo tampoco lo es, pero es suficiente para poder hacer el dibujo. Una ventaja es que moviendo la distancia del móvil a la lente, y de la lente al papel, se puede conseguir diferentes tamaños, con un enfoque más o menos bueno.

Como se ve en la foto, dibujar un ciclista no es una tarea fácil, y con este sistema se puede hacer rápidamente y con las proporciones correctas.

Calas de Menorca

Con motivo del #30DAYMAPCHALLENGE (Noviembre de 2020), el día 16 toca hacer un mapa de una isla. Participo enviando al Twitter un mapa de las calas de la isla de Menorca.

I en este mapa tengo dos objetivos. El primero, utilizar un ángulo para pintar los labels de las calas, de forma que los nombres estén bien orientados alrededor de la isla; y también quiero que al hacer zoom, el font size de los labels sea más grande o más pequeño.

Para encontrar todas las calas he hecho una consulta a Overpass Turbo. La cosa no ha sido fàcil, pues las calas las he buscado con el tag «natural»=»beach», pero después he visto que también es importante el tag «natural»=»bay». Además, no sólo hay que buscar por Cala, sino también por Cales y Caló

La idea inicial era hacer un posicionamient y orientación automático de los nombres de las calas. Pero no es una cosa fácil y rápida, o sea que al final lo he hecho manualmente, y el resultado se puede ver en la foto.

El mapa se ha programado con OpenLayers sobre la base de los mapes de OpenStreetMap.

Referencias: