Archivo de la categoría: BTT

Simular el posicionamient GPS (problemas en el despliegue a la nube, OVH)

Tenemos una REST API con MongoDB. Tenemos un front-end para generar posiciones y grabarlas en la bd. Y tenemos otro front-end para visualizar las posiciones y ver cómo van evolucionando.

La parte de generar las posiciones y enviarlas al servidor de momento no es una aplicación móvil, sino que es una página web. Openlayers tiene la posibilidad de hacer geolocation, y por tanto tenemos una precisión muy buena (unos 15 m). No es necesario por tanto una aplicación móvil. Ahora bien, hay que hacerlo con https.

(ref): https://stackoverflow.com/questions/39366758/geolocation-without-ssl-connection:

Warning by Chrome : getCurrentPosition() and watchPosition() no longer work on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS.

Hasta aquí ningún problema especial cuando se desarrolla localmente (localhost). Pero el problema esté cuando se despliega en el servidor, en este caso un VPS en OVH. Por tanto, la parte de generar las posiciones GPS tiene que ir al servidor OVH donde hay instalado el certificado SSL. Ahora bien, no se pueden generar certificados para el dominio ovh.net con noip.com (se han pasado de la cuota, lógico). Así pues, primero me he tenido que registrar en noip.com y ahora tengo el dominio jquintana.ddns.net.

Poner el MongoDB en el servidor no ha sido ningún problema. El problema está en la API REST, hecha con Express. La API REST se ha tenido que hacer segura (https), pues no podía ser que llamásemos a la API desde https, y que este servidor respondiese com http. Este ha sido el problema principal.

Finalmente la parte del front-end de visualizar las posiciones no ha tenido especial problema. Las llamadas a la API http://localhost:3000 se han de cambiar a les llamadas a la API https://jquintana.ddns.net:8080.

En resumen, tú puedes tener una aplicación funcionando con localhost sin especiales problemas, y cuando la quieres desplegar en la nube empiezan los problemas de CORS, seguridad, protocolos que no te habías planteado.

Ahora el último paso es tener un código que funcione igual de bien en localhost y en la nube, que esto en principio no será problema. Y la reflexión es que cuando se desarrolla un proyecto, no hay que esperar al final de tot para desplegarlo a la infraestructura de la nube. Hay que hacerlo ya en las primeras fases: es el despliegue continuo. Aunque la aplicación no tenga muchas funcionalidades, ya se ha podido afrontar todos los problemas de seguridad e infraestructura al intentar desplegar en un entorno real en las primeras fases. Y así nos ahorramos problemas al final del proyecto.

Programando el tracking de rutas

Programando casa-insitutoAyer por la noche estaba programando, y estaba grabando posiciones simuladas desde casa. Como en casa no me muevo, tuve que simular cierto movimiento. Los datos se graban en una base de datos MongoDB.

Hoy estaba continuando un rato, desde el instituto, y voilà, hay un salto desce casa al instituto. Lógico pero divertido.

rutesgps, versión 16

Aquí una nueva versión de rutesgps.joanillo.org, implementando unas pocas opciones que tenía ganas de hacer:

  • Cada excursión tiene una url que la identifica. Por ejemplo, la última ruta que he hecho: Igualada-Calaf-Manresa-Igualada: igualada-manresa-igualada
  • Un botoncito para copiar directamente el enlace de la excursión.
  • He añadido dos markers, para que quede claro dónde comienza y dónde acaba la excursión.

Referencies:

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:

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.

Segmentos de ciclismo con la API de Strava

De la API de Strava me interesa sobretodo la parte de segmentos, que son trozos de rutas donde la gent se cronometra y se publican los rankings. Sin una subscripción Premium no se puede acceder a toda la información. Jugando un rato con la API de Strava he llegado a poder ver los segmentos que hay en una zona geográfica, y poder ver los puntos de este segmento, que se pueden representar en cualquier mapa.

Para acceder a la información de un segmento:

$ curl -X GET https://www.strava.com/api/v3/segments/229781 -H 'Authorization: Bearer *******************'

Y el resultado:

{"id":229781,"resource_state":3,"name":"Hawk Hill","activity_type":"Ride","distance":2684.82,"average_grade":5.8,"maximum_grade":10.9,"elevation_high":247.2,"elevation_low":92.0,"start_latlng":[37.833112,-122.483436],"end_latlng":[37.828072,-122.498139],"elevation_profile":"https://d3o5xota0a1fcr.cloudfront.net/v6/charts/KO5P7GCFLK5P5NF5GNUX3D6IVFLIEYRYD6JRBEGMXHOCPENJUQZXD5IIEJOYINQE2HX3XLZMYRTF5GHG5JLQ====","start_latitude":37.833112,"start_longitude":-122.483436,"end_latitude":37.828072,"end_longitude":-122.498139,"climb_category":1,"city":"San Francisco","state":"CA","country":"United States","private":false,"hazardous":false,"starred":false,"created_at":"2009-09-21T20:29:41Z","updated_at":"2021-03-13T09:01:33Z","total_elevation_gain":155.2,

"map":{"id":"s229781","polyline":"}g|eFnpqjVl@En@Md@HbAd@d@^h@Xx@VbARjBDh@OPQf@w@d@k@XKXDFPF\\CbGT`AV`@v@|@NTNb@?XOb@cAxAWLuE@eAFMBoAv@eBt@q@b@}@tAeAt@i@dAC`AFZj@dBA~@Yh@MbAVn@b@b@\\d@Ef@Qd@_@d@eB|@c@h@YfBI|AMpA?VF\\\\t@f@t@h@j@|@b@hCb@b@XTd@Bl@GtA?jAL`ALp@Tr@RXd@Rx@Pn@^Zh@Tx@Zf@`@FTCzDy@f@Yx@m@n@Op@VJr@","resource_state":3},

"effort_count":556805,"athlete_count":49100,"star_count":5022,"athlete_segment_stats":{"pr_elapsed_time":null,"pr_date":null,"pr_activity_id":null,"effort_count":0},"xoms":{"kom":"5:37","qom":"6:42","destination":{"href":"strava://segments/229781/leaderboard","type":"overall","name":"All-Time"}},"local_legend":{"athlete_id":54312907,"title":"Dalton Nonweiler","profile":"https://dgalywyr863hv.cloudfront.net/pictures/athletes/54312907/14907176/5/large.jpg","effort_description":"86 efforts in the last 90 days","effort_count":"86","effort_counts":{"overall":"86 efforts","female":"41 efforts"},"destination":"strava://segments/229781/local_legend?categories%5B%5D=overall"}}

Vemos que la polilinea está codificada en una cadena de texto. La podemos decodificar y obtener las coordenadas:

$ pip3 install polyline

$ python3
>> import polyline
>> #polyline.decode(summary_polyline)
>> polyline.decode("gxu{Fem|Kc@fAq@fAoApAMR[ZMXw@v@a@VQZi@j@sAhAk@hA_@f@oDxCiAhA_@j@a@~@{@pCC`@EFD^H`B?`@BNNZV@JGDMEqA@q@H]NOFSLo@t@eB^i@d@i@t@m@n@Yz@EHBR\\`AdDFdEJ`@RNHIVGf@ATH`At@VXDl@GJU@WY[e@YSKC_@GgA@YMKMc@eBYeBSWg@AUTSVa@|@[tAAPDb@Nr@@TCb@[bACd@BNJ^Xh@N^BNB`@Nn@DJTNZ\\Rn@?\\c@zAA^B\\JZHHh@NZDVHTRHJBNAb@I|@B\\Th@PTVf@F`@Cl@Sj@WJ{Ae@{@OKBSPOr@IvA[z@UTw@JWE_@]QUUKKCu@Hs@NMEIIi@kAOUGE]OUMGIGY?y@XiB@]E]U[SGU?c@XcA`Aw@|@i@~@WbASPK?IC_Au@q@_@SAI@g@Lo@XK?YB[MYOQSQYi@Y_@AK@CDg@X]Bg@KUMi@e@[k@GU@MHQb@a@DIFU@WIYg@u@]y@IqAP{ABq@Is@e@iB}@wAw@oBk@aAa@g@g@w@Km@Q{AYkB_AmCc@eB?]H]NWxAiBZq@JYFm@@m@C[G]OWa@k@eAu@o@k@iBkCm@k@SKc@CK@]LS@e@]]]E@GDEH@`@PZJd@CHEFI?OSMe@Uk@")

[(41.40436, 2.11683), (41.40454, 2.11647), (41.40479, 2.11611), (41.40519, 2.1157), (41.40526, 2.1156), (41.4054, 2.11546), (41.40547, 2.11533), 
...
(41.41868, 2.11667), (41.41859, 2.11653), (41.41853, 2.11634), (41.41855, 2.11629), (41.41858, 2.11625), (41.41863, 2.11625), (41.41871, 2.11635), (41.41878, 2.11654), (41.41889, 2.11676)]

Referències:

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…

Cap de Creus en BTT

El verano se acaba, y estos días en el Port de la Selva me he llevado la bici de montaña. He puesto todos los tracks grabados en un solo mapa, utilizando el package de OpenLayers y partiendo del ejemplo de la documentación. De esta manera puedo poner en perspectiva los caminos que he recorrido, y sobretodo ya puedo pensar en nuevos caminos y zonas para explorar el año próximo.

web de Rutas BTT, nueva versión (v4)

Hace años que publico las excursiones con BTT en el subdominio rutesgps.joanillo.org.

Todo empezó con la programación de la API de Google Maps. Más adelante se hizo la migración a OpenStreetMap. Y durante este tiempo he ido añadiendo funcionalidades. También, durante estos años siempre he hecho con los alumnos prácticas de geolocalización, en el marco de la asignatura de Javascript de DAW.

Así que ahora he añadido unas cuantas funcionalidades más: los videos de Relive; los puntos de interés; iconos de inicio y fin de ruta; 3 capas de visualización del terreno; aspectos de diseño; etc. Ahora, cada vez que añada una ruta, tengo un protocolo consistente para no cometer errores.

El pasado otoño me compré un GPS de ciclismo, el Bryton 450E (que está basado en mapas de OpenStreetMaps), y a pesar de sus limitaciones, le estoy sacando el máximo provecho. Y todo este trabajo no tendría ningíun sentido si esto no se tradujese en kilómetros de bicicleta y disfrutar de la naturaleza.

Visualización de rutas GPX con Relive. Bagà-Gréixer-Empedrats

Jordi me ha comentado esta aplicación muy chula para visualizar en 3D las rutas de bici: relive. Quiero mirar en este post si es fácil incrustar el video que se genera de la ruta dentro de una página web como puede ser este bloc. Pues sí, es fácil. El contenedor sencillamente es un iframe como cuando incrusto un video de Youtube. I por otra parte se necesita la URL del video. Esta url se consigue mirando el código fuente de la página de Relive, y buscar por contentURL. Por ejemplo:

itemProp=»contentURL» content=»https://www.relive.cc/view/vXOnEkVyQBv/mp4?x-ref=sc»

y obtengo la url:

https://www.relive.cc/view/vXOnEkVyQBv/mp4?x-ref=sc

El resultado es muy espectacular. En este caso se trata de una excursión que hice eb 2013, y la gracia estaba en bajar en bici por los Empedrats. Como era Semana Santa y bajaba mucha agua del fundido de la nieve, fue una aventura divertida. Imposible bajar en bici por los Empedrats, y tuve que hacer muchos equilibrios para no mojarme.