Arxiu de la categoria: openstreetmap

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:

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:

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.

Esglésies romàniques de Catalunya

Finalment he acabat el projecte de les esglésies romàniques. Han estat uns mesos de documentació i de picar pedra, poc a poc, sense estressar-me, enmig del confinament.

Resumint, la feina que s’ha fet és:

  • generar una bases de dades mysql de totes les esglésies
  • replicar tota aquesta informació a OSM: hi havia una gran quantitat d’esglésies que no existien; s’ha convertit molts nodes a vies; s’ha aprofitat per editar cases i granges de l’entorn de les esglésises; s’ha actualitzat molts tags, com ara wikidata, wikipedia, ruins, etc. S’ha respectat al màxim la informació editada per altres usuaris.
  • fer una pàgina web, amb diferents exemples de mapes, entre ells la cartografia del ICGC

Les edicions que s’han fet a OSM són manuals, i s’ha utilitzat scripts python per associar i actualitzar la informació de la bd amb la informació de OSM. Ha estat una feina gran de documentació, i moltes vegades la informació s’ha hagut de contrastar amb altres fonts, com els mapes del ICGC.

No considero que la feina estigui acabada, hi ha algunes coses que vull discutir amb la comunitat de OSM, però això haurà de ser després de l’estiu. Per exemple, tot i que les esglésies en qüestió són romàniques, l’etiqueta building:architecture=romanesque no sempre serà correcta. Per exemple, l’església de la Torre de Faia (Capella de Santa Magdalena), a Gisclareny, i que conec, és una construcció més moderna que va aprofitar les pedres de l’antiga església romànica. Mereix el tag building:architecture=romanesque? I és que la realitat sempre supera en complexitat a la teoria…

Referències:

Utilitzar els mapes del Institut Cartogràfic i Geològic de Catalunya (ICGC)

Últimament estic consultant bastant el mapa topogràfic del ICGC, doncs la toponímia és molt correcta, i ho utilitzo per actualitzar la informació de OpenStreetMap (tot i que els puristes diuen que això no es pot fer, que no es poden consultar altres fonts que no sigui la realitat del coneixement real). Això em serveix molt per al projecte en què estic ara, les esglésies romàniques de Catalunya (i de pas, moltes masies aïllades que hi ha arreu del territori).

Fins ara els mapes del ICGC només els consultava, però no m’havia plantejat d’utilitzar aquests mapes topogràfics (i les ortofotos) en els meus mapes. Pensava que les llicències no permetrien el seu ús. Doncs estava equivocat: el ICGC dóna informació de com utilitzar els mapes topogràfics (i les ortofotos) tant amb les llibreries Openlayers com Leaflet, i proporciona el codi bàsic per pintar els mapes. La única cosa és que l’exemple de Openlayers que proposen és amb OL3 i els enllaços a les llibreries no funcionen, millor utilitzar OL4. Ho tinc explicat a la wiki.

Així doncs, ja tinc una altra possibilitat a l’hora de pintar els meus mapes.

  • Info a la wiki
  • Condicions d’ús de la geoinformació ICGC
  • Institut Cartogràfic i Geològic de Catalunya (ICGC)

La Casa de Papel: aplicació web

Aquest és un exemple que he fet mano a mano amb el Pere, ara que estem confinats per la COVID-19 i estem a la meitat de la 3a temporada de La Casa de Papel.

Per a mi també ha servit per fer una aplicació OpenLayers amb codi Node, que sembla ser que tot anirà cap aquí. Tot està explicat a la wiki i als enllaços a què fa referència.

La renderització que s’ha fet del mapa amb blanc i negre és l’estil toner de Stamen. A mi particularment m’agrada molt, i crec que hem aconseguit una bona integració amb el disseny propi de la sèrie, que juga amb els colors negre i vermell.
Enllaços:

Vegueries/regions de Catalunya. Densitat de població

He estat programant uns scripts per fusionar fronteres (veure enllaç). Ha estat una mica més difícil del que em pensava, i m’ha quedat un codi Python bastant guarro, però al final he aconseguit de fusionar comarques de Catalunya per tal d’obtenir les regions/vegueries. Ja miraré d’arreglar el codi quan pugui, doncs estudiar els diferents casos és un problema de topologia bastant interessant i no massa difícil. Però ara, degut al confinament provocat pel corona-virus i la COVID-19, aquest és el millor codi que m’ha soritit (i ja hi he dedicat més hores de les que desitjava).

Tot això ve perquè vaig estar cercant el geojson de les vegueries i vaig ser incapaç de trobar-ho. Aquest codi també ha de servir per fusionar altres casos. Estic pensant per exemple fusionar els municipis de l’Alt Berguedà.

Amb tot això he fet com a primer exemple la densitat de població, classificat per vegueries.

Nota 31-03-2020: He millorat el codi i ara ja estic content del resultat final. Amb la nova versió he fusionat els municipis de l’Alt Berguedà.

GeoJSON: densitat de les comarques de Catalunya

Tenia un tema pendent amb la visualització de mapes: programar aquells mapes en què es veuen les fronteres (ja siguin països, regions, comarques, municipis), i on podem assignar un color o podem clicar a cadascuna de les regions.

A l’API d’Overpass es poden fer consultes de les relacions a nivell administratiu, i normalment s’obté les ways que representen línies de frontera administrativa. Això ja va bé per pintar el contorn d’un municipi, per exemple. Ara bé, per ombrejar tota una àrea necessitem un poligon tancat. El millor és cercar una font de dades amb format GeoJSON de les dades que necessitem, per exemple les comarques. Cercant una mica pots trobar dades de tot: països, comunitats autònomes, províncies, etc. Combinant aquestes dades amb la informació que ens interessa (per exemple, la densitat de població per comarca), podem fer una aplicació com la que mostrem a la imatge.

Per fer-ho, està explicat a la wiki. Ara que m’he posat amb el GeoJSON, ara veig que hi ha un altre format interessant que és el TopoJSON. Això és un no parar!

Catalunya megalítica

Ja tinc acabada la visualització de tots els dòlmens de Catalunya i la Catalunya Nord. S’ha fet aquesta feina amb varis propòsits. D’una banda, unificar i actualitzar tota la informació disponible a OpenStreetMap, on només estaven llistats la meitat dels dòlmens. També m’interessava la programació de OpenLayers per tal de visualitzar el mapa, i la renderització del mapa amb diferents estils a part del clàssic de OSM.

Per visualitzar el mapa crec que el més xul·lo és l’estil Terrain. Ara bé, si vull fer zoom i que aparegui informació al detall de la zona, el millor mapa continua sent el de OSM. L’aplicació també pot visualitzar el mapa amb els estils Toner i Watercolor.

Tot plegat m’ha portat més feina del que havia previst i desitjat. O sigui que n’he fet un subdomini per tal de què la informació estigui sempre disponible:

Ruta pels arbres singulars de Barcelona (minimitzant la distància)

El problema del viatjant de comerç (traveling salesman problem) és un problema clàssic de l’algorísmica: es tracta de passar per una sèrie de punts, sense repetir-ne cap, i minimitzant la distància recorreguda. Fa unes poques setmanes vaig importar els arbres singulars de Barcelona a OpenStreetMaps, i crec que és una bona activitat didàctica per conèixer els arbres de la ciutat fer una ruta per uns quants d’aquests arbres.

Per fer-ho més interessant, podem plantejar-nos el problema de fer un recorregut que minimitzi la distància, passant per tots els arbres, i que retorni al punt de partida. Vaig estar cercant diferents implementacions amb Python que resolguin el problema, fins que en vaig trobar una que satisfeia la meva restricció de tornar al punt de partida.

Sobre aquesta solució he fet alguna modificació per tal de generar un fitxer JSON amb la solució. Finalment, hem de pintar sobre un mapa OSM els nostres punts (nodes); traçar una línia recta entre els punts; i afegir un label-text informatiu sobre aquests punts. El resultat es pot veure en la imatge.

Evidentment hem fet unes simplificacions: la distància mínima entre dos punts és la línia recta, però per la ciutat no podem anar en línia recta, i a més poden haver-hi pujades i baixades. Però com a exercici didàctic crec que és interessant.

Aquí Catalunya són populars les Curses d’Orientació. Crec que es podria aprofitar aquestes activitats en el lleure i afegir-hi una capa de coneixement, com ara conèixer els arbres, conèixer monuments, etc. Crec que per als joves i infants pot ser una activitat engrescadora.

Referències: