Arxiu de la categoria: Programació

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:

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.

OpenCV: detectar cercles

Un cop ja sabem detectar les rectes, ara fem la part de detectar els cercles. El OpenCV ens dóna el cercle de millor ajustament, amb el seu centre i radi. Per tant només ens cal aplicar l’algorisme de calcular l’error d’ajustament, com s’explica en l’anterior post.

Com a fitxer d’entrada tenim un CSV amb el nom dels participants, el nom del fitxer de les rectes, i el nom del fitxer dels cercles. Com a sortida tenim el fitxer resultats.txt amb les puntuacions obtingudes per cadascun dels participants.

Així doncs, ara només cal portar-ho a la pràctica. Espero que sigui aviat.

Mesurar la rodonesa d’un cercle

Després de resoldre el problema de mesurar la linialitat d’una recta, ara toca mesurar la rodonesa d’un cercle. En la imatge hi ha una captura de la solució que hem implementat.

Hi ha bastanta literatura sobre el tema, però he preferit cercar la solució pel meu compte. Donat un cercle, openCV ens dóna ja el cercle de millor ajustament, amb el centre i el radi. La primera idea és recórrer tots els punts del cercle i fer el sumatori de totes les diferències entre el punt i el radi. El valor dóna una bona idea de com de bo és el cercle, en termes absoluts. Però si ara escalem x2 o per x0.5 el nostre cercle, els resultats seran diferents. Per tant, no he de cercar un error absolut, sinó un error relatiu.

La segona idea és mesurar àrees. Concretament, el quocient entre la diferència d’àrees entre el cercle dibuixat i el cercle aproximat, dividit per l’àrea del cercle. Com es veu en el paper, ara sí que obtenim un valor relatiu de la rodonesa del cercle. Una cosa que hem de tenir en compte és que quan sumem àrees, hem d’agafar el valor absolut de la diferència, per tal de què no hi hagi cancel·lacions.

Com més s’aproxima a 0 el valor, més bo és el cercle. Si el valor el resto de 1, aleshores el cercle perfecte val R=1, i R=0.98 no seria tan bo. Ara falta implementar-ho en el meu programa.

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:

Llibre: Elementary Mechanics Using Python

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):
\tF = -k*y[i] – m*g
\ta = F/m
\tv[i+1] = v[i] + a*dt
\ty[i+1] = y[i] + v[i+1]*dt
\tt[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):
\tplot1.plot(t[i],y[i],’ob’)
\tplot2.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

Parkings de bicicletes a Barcelona (openstreetmap)

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;
}
}}

Arbres singulars de les Illes Balears


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;
}
}}