Arxiu de la categoria: General

Col·lecció de rutes BTT

Estic programant amb OpenLayers, últimament he fet els projectes de Catalunya Màgica i Quintana. Aprofitant que a OpenLayers és fàcil pintar una ruta GPX, volia posar totes les rutes BTT que he anat fent en un mateix mapa, i així dóna la idea d’activitat. Bé, no totes les rutes són de BTT, també n’hi ha de senderisme, i tampoc són totes les rutes que he fet, però dóna una idea.
El següent pas serà posar unes capes que es puguin activar/desactivar, per seleccionar BTT/senderisme, o bé per zona geogràfica.

Topònim Quintana a Catalunya

Seguint el mateix esquema i codi que hem fet amb la Catalunya Màgica en el post anterior, he publicat ràpidament els topònims Quintana que hi ha a Catalunya.

Una Quintana o quintà fa referència a la cinquena part que havien de pagar els pagesos d’impostos, i amb el temps una Quintana va acabar significant una masia i els camps que l’envolten, és a dir, el que avui en diríem una finca. D’aquí ve el cognom Quintana, tant en català com en castellà, que s’escriuen igual i ve directament del llatí. El meu cognom Quintana ve de la masia La Quintana d’Oristà, que vam tenir la sort de visitar fa uns anys, amb el meus pares, germans, cosins i família. Els Quintana de Cabrianes vénen d’aquesta casa de pagès d’Oristà. El meu besavi (l’avi del meu pare alcelsiga) era de Cabrianes i es va casar a Bagà. D’aquí el cognom Quintana de Bagà, Guardiola i Berguedà. Jo sóc de Barcelona, però aquestes són les meves arrels per part del meu avi patern.

Referències:

Catalunya Màgica

S’ha publicat la web de la Catalunya Màgica: dimonis, infern, bruixes i diables, amb informació agafada de OpenStreetMap.

Hem utiltizat OpenLayers 6.5.0 (amb el paradigma de imports), i les tiles estàndard de OSM i també TRESC, una capa de visualització que m’agrada molt. Les dades que s’obtenen poden ser nodes o vies, i hi ha hagut una feina prèvia de netejar una mica les dades, però tot plegat ha sigut un procés molt ràpid.

Referències:

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:

Introducció a Jupyter Notebooks

Ja feia temps que tenia ganes de mirar què és això de Jupyter Notebook, que se n’està parlant i cada cop se’n parlarà més. Aquest és el primer exemple que faig, la solució de l’equació de 2n grau amb python i la llibreria sympy, que he agafat d’una pàgina que m’agrada molt: arachnoid.com.

El següent pas serà mirar Jupyter Lab, que és una interfície més moderna, i tinc ganes de jugar amb widgets i sliders per poder fer coses més interactives. Ara que estic programant bastant amb Python per preparar exemples per les classes de CNED a la UPC, fer-ho amb les Notebooks de Jupyter seria una manera molt puntera de fer classes interactives.

Referències:

Incendi a OVH Estrasburg

Aquesta matinada hi ha hagut un incendi als servidors de OVH a Estrasburg, me n’he enterat pel Twitter. Quan m’he llevat, he comprovat que la mediawiki de wiki.joanillo.org i aquest bloc de www.joanillo.org estaven actius. Sabia que la meva màquina estava a França, i ja em temia el pitjor. Sortosament, he comprovat que la meva màquina està a Gravelines, que és una localitat al Pas de Calais. Sort! D’altra banda, tenia feta una còpia de seguretat de la wiki de només feia un parell de dies.

Això ens ha de fer reflexionar sobre la liquiditat i la intangibilitat de la informació en el núvol… Precisament aquesta setmana anàvem a contractar els serveis de OVH per allotjar la web de l’institut.

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…

Cales de Menorca

Amb motiu del #30DAYMAPCHALLENGE (novembre de 2020), el dia 16 toca fer un mapa d’una illa. Participo enviant al Twitter un mapa de les cales de l’illa de Menorca.

I en aquest mapa tinc dos objectius. El primer, utiltizar un angle per pintar els labels de les cales, de manera que els noms estiguin ben orientats al voltant de l’illa; i també vull que en fer zoom, el font size dels labels sigui més gran o més petit.

Per trobar totes les cales he fet una consulta a Overpass Turbo. La cosa no és tan fàcil, perquè les cales les he cercat en el tag “natural”=”beach”, i després he vist que també és important el tag “natural”=”bay”. A més, no només s’ha de cercar per Cala, sinó també per Cales i Caló

La idea inicial era fer un posicionament i orientació automàtic dels noms de les cales. Però no és una cosa fàcil i ràpida, o sigui que al final ho he fet manualment, i el resultat es pot veure a la foto.

El mapa s’ha programat amb OpenLayers sobre la base dels mapes de OpenStreetMap.

Referències:

Ordenando ideas con la librería SDL

Estoy programando en C++ y SDL el software para una máquina de dardos. Ya tengo casi acabada toda la parte de la lógica de la aplicación, así que he empezado a mirarme la parte gráfica, que haré con la libreria SDL como he utilizado en anteriores proyectos.

A raíz de migrar el proyecto a SDL (y conservando la compatitibilidad con la parte de consola) he tropezado con un error de programación de aquellos que te hacen perder el tiempo. Al final la cosa no ha sido grave, digamos que no era un error de concepto sino más bien de despiste, debido a que el código por momentos se está complicando y conviene mantener el código bien ordenado y lógico.

El cas es que, a raíz de este contratiempo, he querido hacer una pequeña recopilación del código mínimo SDL para pintar un trozo de texto por pantalla, utilizando diferentes técnicas: a) toda la parte de SDL mezclada en el fichero main.cpp; b) POO, utilizando un fichero para cada clase; c) POO, pero metiendo todas las clases en un solo fichero.

Los tres ejemplos se pueden descargar en el siguiente enlace: