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.

Municipis de Catalunya (Openlayers)

Hem agafat de l’IDESCAT les dades dels municipis de més de 20.000 habitants de Catalunya (una setantena de municipis), i els hem geolocalitzat.
El que volia practicar en aquesta ocasió era la selecció de capes, i ho volia fer tot amb mòduls (imports) de Javascript, i el codi el més net possible.
Es pot veure el resultat en aquest video.

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:

Gràfics interactius amb Jupyter Notebooks: tir parabòlic

Ara que ja he començat a fer proves amb Jupyter Notebook, el següent pas que vull provar és fer gràfics interactius. Doncs ha resultat ser més fàcil i ràpid del que pensava.

Parteixo d’un script python que simula les dades experimentals d’una trajectòria parabòlica, i calcula la paràbola que millor s’hi ajusta (regressió quadràtica). A partir de l’equació de la paràbola es pot deduir la constant g (=9,81 m/s2). Simulo les dades experimentals introduïnt un error de soroll en les dades teòriques. Doncs bé, amb el meu gràfic interactiu puc jugar amb el nivell de soroll, i amb el número de punts de mostreig, tal com es veu en el video. El codi queda de la següent manera:

%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

Una altra cosa que m’interessa és la manera d’exportar aquests Jupyter Notebooks a una web, conservant les gràfiques i les fórmules en format Latex (encara que es perdi la interacció amb les gràfiques). Això s’aconsegueix directament exportant el Notebook a html:

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

i integrant aquest codi en una web on hi hagi més text i explicacions, i amb la llibreria Bootstrap.

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.