50 anys

03/12/2019

Doncs aquí estem, 50 tacos. I a més al setembre aquest bloc va complir 10 anys, un altre aniversari. A ningú li interessa, però tant se val, jo vaig escrivint, jo vaig a la meva i sempre aprenent.

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:

Tinc un nou repte pel que queda de 2019 i per al primer semestre del 2020. He començat a llegir el llibre Elementary Mechanics Using Python: A Modern Course Combining Analytical and Numerical Techniques, de Anders Malthe-Sørenssen. És tot un curs de física, i combina de manera bastant entenedora els exemples clàssics de moviment, forces, energia,… amb les seves solucions numèriques, utilitzant les llibreries matemàtiques i de fer gràfiques de Python.

Es tracta d’implementar tots els exemples del llibre a codi Python. No he vist cap enllaç per descarregar tot el codi, en qualsevol cas, els exemples vull adaptar-los i fer-me’ls meus. He començat per l’exemple del pes suspès d’una molla, que com tothom sap la solució del moviment és sinusoidal al voltant del punt d’equilibri, la velocitat és zero en els punts màxim i mínim, i la velocitat és màxima en el punt d’equilibri. Aquest exemple s’explica en l’apartat 5.7, que parla de forces, i no n’hi ha prou en copiar i enganxar el codi, sinó que l’he hagut d’adaptar. Aquesta és la meva solució:

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np

# Initialize
m = 1.0
# kg
k = 100.0 # N/m
v0 = 1.0
# in m/s
time = 2.0 # s
g = 9.8 # m/s^2

# Numerical setup
dt = 0.0001 # s
n = int(round(time/dt))
t = np.zeros(n,float)
y = np.zeros(n,float)
v = np.zeros(n,float)
# Initial values
y[0] = 0.0
v[0] = v0
# Simulation loop
for i in range(n-1):
F = -k*y[i] – m*g
a = F/m
v[i+1] = v[i] + a*dt
y[i+1] = y[i] + v[i+1]*dt
t[i+1] = t[i] + dt

fig = plt.figure()
fig.suptitle(u”Objecte suspès d’una molla”)
plot1 = fig.add_subplot(211)
#plot1.set_xlabel(‘t [s]‘)
plot1.set_ylabel(‘y [m]‘)
plot1.xaxis.grid()
plot1.plot(t,y)
plot2 = fig.add_subplot(212)
plot2.set_xlabel(‘t [s]‘)
plot2.set_ylabel(‘v [m/s]‘)
#plot1.grid(axis=’y')
#plt.grid(b=True, which=’minor’, color=’#666666′, linestyle=’-')
plot2.xaxis.grid()
plot2.plot(t,v)

for i in range(10, n-1, 400):
plot1.plot(t[i],y[i],’ob’)
plot2.plot(t[i],v[i],’ob’)

plt.show()

Aquests són els capítols i temes que es tracten en el llibre:

4. Motion in One Dimension .
5. Forces in One Dimension .
6. Motion in Two and Three Dimensions
7. Forces in Two and Three Dimensions
8. Constrained Motion
9. Forces and Constrained Motion
10. Work
11. Energy
12. Momentum, Impulse, and Collisions
13. Multiparticle Systems
14. Rotational Motion
15. Rotation of Rigid Bodies
16. Dynamics of Rigid Bodies

Jo sóc nou amb això de OpenStreetMaps. Però de la gent que porta temps, veig que en les llistes de correu es parla bastant d’importacions del Cadastre. Importar el Cadastre és important perquè es tracta d’unir la informació geomètrica dels edificis amb altres capes d’informació, concretament la direcció postal d’un edifici. Si s’aconsegueix això a nivell general, serveis com Nominatim, que proporcionen geocoding (resoldre una direcció postal a coordenades geogràfiques; o a l’inversa), serà molt útil (com ho és el mateix servei que proporciona Google Maps).

Anem a fer un cas concret: Bagà, on no hi ha ficada la informació del cadastre. Faig la prova d’un edifici de Bagà, per exemple Carrer del Raval 13 Bagà. A partir de la informació de l’edifici on visc (a Barcelona, on sí que hi ha incorporada la informació del cadastre), veig com és el format de la informació que s’ha d’incorporar:

addr:housenumber=13
addr:postcode=08695
addr:street=Carrer del Raval
type=multipolygon

Per tant, modifico a OSM el builiding en qüestió i afegeixo aquesta referència.

Ara ja podem anar a Nominatim, i cercar per

Carrer del Raval 13 Bagà

I el troba! Aquí es veu la importància d’afegir la informació del Catastre a OSM.

També podem fer la consulta inversa, a partir de les coordenades trobar la direcció postal:

https://nominatim.openstreetmap.org/reverse?format=xml&lat=42.25255&lon=1.86283&zoom=18&addressdetails=1

I el resultat (en format XML):



13, Carrer del Raval, Bagà, Berguedà, Barcelona, Catalunya, 08695, Espanya

13

Carrer del Raval Bagà
Berguedà
Catalunya

08695 Espanya
es

En el curs de Realitat Virtual ens fan fer una petita aplicació de realitat virtual. Entre les diferents propostes, RoundMe sembla ser una opció fàcil i ràpida.

Primer de tot hem de descarregar de Google Maps una fotografia panoràmica, i s’ha de convertir com està explicat en el tutorial en un panorama apte per ser importat a RoundMe.

RoundMe m’ha semblat bastant inestable. De fet, no podia penjar el meu panorama a Public, em donava un error de upload. De fet, vaig fer fins a 4 proves diferents el divendres passat, fins que ho vaig deixar per després del cap de setmana. I la meva sorpresa avui diumenge al vespre és que aquests 4 panorames estan com a Publics. Bueno, en fi…

Com a exemple he trobat una foto del refugi de Rebost (la foto no és meva, sinó que l’he trobat d’algú que l’ha penjada a Google Maps), i des del refugi puc identificar fàcilment unes muntanyes i paisatges que em són molt familiars.

En aquest cas estem parlant de 3000 punts. Ha estat una mica complicat fer aquesta importació, perquè hi havia uns 400 punts que ja estaven introduïts. Però d’aquests, uns 150 no existeixen en la base de dades de l’ajuntament, que se suposa que està actualitzada. Som conscients de què hi pot haver parkings d’ús privat.

En qualevol cas, com que es tracta d’una importació de 3000 punts, no es pot ana un per un. Realment, no me n’havia adonat de què hi haguessin tants punts de parking de bicis. Jo, com que vaig amb la Brompton, no els necessito, la bici sempre va amb mi.

{{geocodeArea:”Barcelona”}}->.boundaryarea;
(
node["amenity"="bicycle_parking"](area.boundaryarea);
);
out meta;

{{style:
node[amenity=bicycle_parking] {
icon-image: url(‘http://free-icon-rainbow.com/i/icon_01944/icon_019440_256.png’);
icon-width: 20;
icon-height: 20;
}
}}

I ara li toco el torn als Horts urbans de Barcelona [1]. En aquest cas és poca informació i la podríem introduir manualment. Però de la manera com ho hem fet es podria executar el script en una base anual, i d’aquesta manera es pot eliminar un hort si aquest ja no existeix, o bé actualitzar la informació o introduir-ne un de nou. Aquests són els horts urbans gestionats per l’ajuntament de Barcelona.

{{geocodeArea:”Barcelona”}}->.boundaryarea;
(
node["landuse"="orchard"](area.boundaryarea);
);
out body;

{{style:

node[landuse=orchard] {
icon-image: url(‘https://www.barcelona.cat/estatics-planol/v0.8/img/w/bg/M/M009.png’);
icon-width: 28;
icon-height: 38;
}

}}


Hem actualitzat a OpenStreetMap la llista d’arbres singulars de les Illes Balears [1], a partir de l’experiència d’introduir els arbres monumentals de Catalunya i els arbres singulars de Barcelona.

A més, amb overpass-turbo.eu ara ja sé ficar una icona d’un arbret sobre el punt d’interès, i així queda una gràfica molt mona.

area["name"="Illes Balears"]->.boundaryarea;
(
nwr(area.boundaryarea)[website~'arbres_singulars_de_les_Illes_Balears'];
);
out meta;

{{style:
node[natural=tree] {
icon-image: url(‘https://img.icons8.com/cotton/2x/tree.png’);
icon-width: 25;
icon-height: 25;
}
}}

Dins el curs de realitat virtual, ens demanen fer un petit exemple de RA (realitat augmentada).

Jo he triat l’eina Zappar, que és comercial i té una prova de 30 dies. Quan tingui una mica de temps miraré si hi ha una alternativa amb software lliure.

En aquest petit exemple s’ha de llegir el codi (una mena de codi QR) amb l’aplicació del mòbil, i la petita aplicació que he fet són tres escenes: veure un vídeo; anar a la pàgina web del Pi de les Tres Branques a la Viquipèdia; i veure diferents imatges del Pi de les Tres Branques a Google Images.

Aquí estic jo estudiant la programació amb OSM, actualitzant des d’un script python els arbres singulars de Barcelona, i evidentment m’he topat amb l’alzina de la caseta del carrer Encarnació.

Quina contradicció! D’una banda volem protegir el patrimoni i prendre consciència del medi natural que tenim dins una gran ciutat, i d’altra banda veiem com hi ha gent que li importa una merda tot això i només pensa en un terreny pel valor econòmic que té i el rendiment que en pot treure.

Doncs això, s’ha de salvar l’alzina i les casetes del carrer Encarnació de l’especulació urbanística. La gent que està a l’ajuntament que es mullin de veritat i que posin sobre la taula una proposta que acontenti totes les parts.

Per visualitzar tots els arbres singulars que hi ha a Barcelona podem fer servir overpass-turbo.eu, que ens permet realitzar una consulta i veure’n el resultat gràfic de forma fàcil.

area["name"="Barcelona"]->.boundaryarea;
(
nwr(area.boundaryarea)[note~'Arbres d\'interès local de Barcelona'];
nwr(area.boundaryarea)[tree];
);
out meta;

Page 1 of 1912345»...Last »