Arxiu de la categoria: BTT

Simular el posicionament GPS (problemes en el desplegament al núvol, OVH)

Tenim una REST API amb MongoDB. Tenim un front-end per generar posicions i gravar-les a la bd. I tenim un altre front-end per visualitzar les posicions i veure com van evolucionant.

La part de generar les posicions i enviar-les al servidor de moment no és una aplicació mòbil, sinó que és una pàgina web. Openlayers té la possibilitat de fer geolocation, i per tant tenim una precisió molt bona (uns 15 m). No cal per tant una aplicació mòbil. Ara bé, s’ha de fer amb 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.

Fins aquí cap problema quan es desenvolupa localment (localhost). Però el problema està quan es desplega al servidor, en aquest cas un VPS a OVH. Per tant, la part de generar les posicions GPS ha d’anar al servidor OVH on hi ha instal·lat el certificat SSL. Ara bé, no es poden generar certificats per al domini ovh.net (es denega perquè s’han passat de la quota, lògic). Així doncs, primer m’he hagut de registrar a noip.com i ara tinc el domini jquintana.ddns.net.

Posar el MongoDB al servidor no ha tingut cap problema. El problema està en la API REST, feta amb Express. La API REST s’ha hagut de fer segura (https), doncs no podia ser que cridéssim a la API des de https, i que aquest servidor respongués amb http. Aquest ha sigut el problema principal.

Finalment la part del front-end de visualitzar les posicions no ha tingut especial problema. Les crides a la API http://localhost:3000 s’han de canviar a les crides a la API https://jquintana.ddns.net:8080.

En resum, tu pots tenir una aplicació funcionant amb localhost sense especials problemes, i quan la vols desplegar al núvol comencen els problemes de CORS, seguretat, protocols que no t’havies plantejat.

Ara l’últim pas és tenir un codi que funcioni igual de bé a localhost i al núvol, que això en principi no serà problema. I la reflexió és que quan desenvolupes un projecte, no s’ha d’esperar al final de tot a desplegar-lo a la infraestructura del núvol. S’ha de fer ja en les primeres fases: és el desplegament continu. Encara que l’aplicació no tingui moltes funcionalitats, ja s’ha pogut afrontar tots els problemes de seguretat i infraestructura al provar de desplegar-ho en l’entorn real en les primeres fases. I així ens estalviem problemes al final del projecte.

Programant el tracking de rutes

Exemple canònic OpenlayersAhir al vespre estava programant, i estava gravant posicions simulades des de casa. Com a casa no em moc, vaig simular un cert moviment. Les dades es graven en una base de dades MongoDB.

Avui estava continuant una mica, des de l’institut, i voilà, hi ha un salt de casa a l’institut. Lògic però divertit.

rutesgps, versió 16

Aquí una nova versió de rutesgps.joanillo.org, implementant unes poques opcions que tenia ganes de fer:

  • Cada excursió té una url que la identifica. Per exemple, la última ruta que he fet: Igualada-Calaf-Manresa-Igualada: igualada-manresa-igualada
  • Un botonet per copiar directament l’enllaç de l’excursió.
  • He afegit dos markers, per tal de què quedi clar on comença la ruta i on acaba

Referències:

RutesGPS, nova versió

S’ha publicat la nova versió de les meves rutes amb bici. De la v5 a la v7 hi ha molts canvis significatius: canvi total del disseny, responsive, Javascript amb mòduls, Openlayers v6 en la part de mapes, s’ha eliminat tota la part de PHP (és una webapp).

La llista de rutes s’havia fet molt llarga, i per tant ara les rutes s’agrupen per zones geogràfiques, que és un desplegable. Podem filtrar per les rutes que s’han fet, i distingir-les de les rutes ToDo, que són les que volem fer properament, si tot va bé. Les capes de render que s’han triat són el estàndard de OSM, el TOPOTRESC, la OrtoFoto del ICGC, i el estàndard del ICGC.
La única funcionalitat que queda per implementar és la Cerca de rutes, a veure si ho puc fer abans de les vacances.

Tot el codi està penjat en el github. En la foto es pot apreciar el canvi de disseny de la versió anterior a l’actual. Una altra millora important que s’ha implementat és l’automatització del desplegament al servidor, de manera que ara és més fàcil i està més documentat publicar els canvis en la nova versió.

Referències:

Recordant la KKH-Karakorum Highway

L’any 1997 vam fer amb el Jordi la KKH-Karakorum Highway, des de Chilas (al Pakistan) fins a Kashgar (a la Xina), passant pel Khunjerab Pass, el punt fronterer a quasi 4700m d’altura.
Ara que estic ordenant les rutes de muntanya, i recuperant rutes antigues, era el moment de traçar la ruta i recordar les etapes que vam viure aquell estiu. Quines emocions! Acampar al costat del llac Kara-Kul… La visió des de la carretera del Nanga Parbat (8125 m). Érem joves! Quines aventures!

Podria haver-me descarregat la ruta del wikiloc, però he preferit traçar jo mateix la ruta i així anar repassant els llocs per on es passa. Al final van ser quasi 800Km de recorregut. En aquella època no teníem el GPS. Em sembla que aquesta ruta ara mateix no es pot fer per problemes de seguretat. A la banda del Pakistan crec que ara la cosa islàmica està més tranquila. D’altra banda, a la banda xina hi ha problemes per la repressió constant de la Xina sobre la població uygur, tajik, i en general a la província de Xinjiang.

Segments de ciclisme amb la API de Strava

De la API de Strava m’interessa sobretot la part de segments, que són trossos de rutes en què la gent es cronometra i es publica els rankings. Malauradament, sense una subscripció Premium no es pot accedir a tota la informació. Jugant una estona amb la API de Strava he arribat a poder veure els segments que hi ha en una zona geogràfica, i poder veure els punts d’aquest segment, que es poden representar en qualsevol mapa.

Per accedir a la informació d’un segment:

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

I el resultat:

{"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"}}

Veiem que la polilínia està codificada en una cadena de text. La podem decodificar i obtenir-ne les coordenades:

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

Extreure informació d’un track gpx

Estava fent un petit script amb NodeJS per extreure la informació dels meus tracks de BTT. Aquesta és la informació bàsica que es pot extreure:

$ 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 dificultat principal està en entendre què significa i com es calcula el desnivell acumulat. Posem per cas una excursió bastant planera com fer tot el Passeig de les Aigües de Barcelona. Tenint en compte que la resolució del meu GPS és de 1 metre (sense decimals), el fet de recórrer una superfície plana fa que es vagi acumulant els metres de desnivell d’una manera exagerada (encara que el GPS tingués més resolució també passaria). El primer que hauríem de fer és recalcular les elevacions del meu track amb algun servei online que doni les altures exactes, i amb algun decimal. Després, la solució passa per filtrar les dades, fer un suavitzat, és a dir, fer una mitjana. Per exemple, per cada punt agafem el valor de l’elevació fent la mitjana entre el punt actual i els punts anterior i posterior. Seria una mitjana de tres punts. Com que cada punt es grava als 4 segons, seria una mitjana de 12 segons. Ara bé, puc fer filtrats de 5, 7, 9 o 11 punts, i dóna com a resultat valors de pendent acumulat cada vegada més petits. Quin criteri seguir? El cas és que els diferents sistemes (el meu GPS, el wikiloc, etc…) donen valors diferents. Això fa que la mesura de l’elevació acumulada en una excursió no sigui una mesura massa fiable. Aquest efecte no és massa problemàtic en les excursions amb baixades i pujades llargues i constants. Per contra, amb excursions amb zones planes i terreny irregular l’efecte s’acumula més.

Tots aquests càlculs donen peu a programar un altre script per calcular pujades on podem definir unes cronoescalades, pujades que es van repetint en els entrenaments i es podrà extreure informació per comparar. En parlarem en el proper post…

Cap de Creus amb BTT

L’estiu s’ha acabat, i enguany al Port de la Selva m’he emportat la bici de muntanya. He posat tots els tracks gravats en un sol mapa, utilitzant el package de OpenLayers i partint de l’exemple de la documentació. D’aquesta manera puc posar en perspectiva els camins que he recorregut, i sobretot ja pensar en nous camins i zones per explorar l’any vinent.

web de Rutes BTT, nova versió (v4)

Fa anys que publico les excursions amb BTT al subdomini rutesgps.joanillo.org.

Tot va començar amb la programació de la API de Google Maps. Més endavant vaig migrar a OpenStreetMap. I durant aquest temps he anat afegint funcionalitats. També, durant aquests anys sempre he fet amb els alumnes pràctiques de geolocalització, en el marc de l’assignatura de Javascript de DAW.

Així que ara he afegit unes quantes funcionalitats més: els videos de Relive; els punts d’interès; icones d’inici i final de ruta; 3 capes de visualització del terreny; aspectes de disseny; etc. Ara, cada cop que afegeixi una ruta, tinc un protocol consistent per tal de no cometre errors.

La passada tardor em vaig comprar un GPS de ciclisme, el Bryton 450E (que està basat en mapes de OpenStreetMaps), i tot i les seves limitacions, li estic treient el màxim profit. I tot plegat no tindria cap sentit si això no es traduís en kilòmetres de bicicleta i disfrutar de la natura.

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

El Jordi m’ha comentat aquesta aplicació molt xul·la per visualitzar amb 3D les rutes de bici: relive. Vull mirar en aquest post si és fàcil incrustar el video que es genera de la ruta dins d’una pàgina web com ara és aquest bloc. Doncs sí, és fàcil. El contenidor senzillament és un iframe com quan incrusto un video de Youtube. I d’altra banda es necessita la URL del video. Aquesta url s’aconsegueix mirant el codi font de la pàgina de Relive, i cercar per contentURL. Per exemple:

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

i obtinc la url:

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

El resultat és molt espectacular. En aquest cas es tracta d’una excursió que vaig fer el 2013, i la gràcia estava en baixar en bici pels Empedrats. Com que era Setmana Santa i baixava molta aigua de la fosa de neu, va ser una bona aventura. No cal dir que baixar en bici pels Empedrats era impracticable i vaig haver de fer molts equilibris per no mullar-me.