Archivo de la categoría: Programación

Cataluña megalítica

Ya tengo acabada la visualización de todos los dólmenes de Catalunya y Catalunya Nord. Se ha hecho este trabajo con varios propósitos. Por una parte, unificar y actualizar toda la información disponible en OpenStreetMap, donde sólo estaban listados la mitad de los dólmenes. También me interesaba la programación de OpenLayers para visualizar el mapa, y la renderización del mapa con diferentes estilos a parte del clásico de OSM.

Para visualizar el mapa creo que lo más chulo es el estilo Terrain. Ahora bien, si quiero hacer zoom y que aparezca información en detalle de la zona, el mejor mapa continúa siendo el de OSM. La aplicación también puede visualizar el mapa con los estilos Toner y Watercolor.

He tenido más trabajo del que tenía previsto y tiempo del que quería gastar. O sea que he hecho un subdominio para que al menos la información esté siempre disponible:

web de Rutas BTT, nueva versión (v4)

Hace años que publico las excursiones con BTT en el subdominio rutesgps.joanillo.org.

Todo empezó con la programación de la API de Google Maps. Más adelante se hizo la migración a OpenStreetMap. Y durante este tiempo he ido añadiendo funcionalidades. También, durante estos años siempre he hecho con los alumnos prácticas de geolocalización, en el marco de la asignatura de Javascript de DAW.

Así que ahora he añadido unas cuantas funcionalidades más: los videos de Relive; los puntos de interés; iconos de inicio y fin de ruta; 3 capas de visualización del terreno; aspectos de diseño; etc. Ahora, cada vez que añada una ruta, tengo un protocolo consistente para no cometer errores.

El pasado otoño me compré un GPS de ciclismo, el Bryton 450E (que está basado en mapas de OpenStreetMaps), y a pesar de sus limitaciones, le estoy sacando el máximo provecho. Y todo este trabajo no tendría ningíun sentido si esto no se tradujese en kilómetros de bicicleta y disfrutar de la naturaleza.

OpenCV: detectar círculos

Una vez ya sabemos detectar las rectas, ahora vamos a la parte de detectar los círculos. OpenCV nos da el círculo de mejor ajuste, con su centro y su radio. Por sólo nos falta aplicar el algoritmo de calcular el error de ajuste, como se explica en el anterior post.

Como fichero de entrada tenemos un CSV con los nombres de los participantes, el nombre del fichero de las rectas, y el nombre del fichero de los círculos. Como salida tenemos el fichero resultados.txt con las puntuaciones obtenidas por cada uno de los participantes.

Así pues, ahora sólo falta llevarlo a la práctica. Espero que sea pronto.

Medir la rodondez de un círculo

Después de resolver el problema de medir la linearidad de una recta, ahora toca medir la redondez de un círculo. En la imagen hay una captura de la solución que hemos implementado.

Hay bastante literatura sobre el tema, pero he preferido buscar la solución por mi cuenta. Dado un círculo, openCV ya nos da el círculo de mejor ajuste, con el centre y el radio. La primera idea es recorrer todos los puntos del círculo y hacer el sumatorio de todas las diferencias entre el punto y el radio. El valor da una buena idea de cómo de bueno es el círculo, en términos absolutos. Pero si ahora escalamos x2 o por x0.5 nuestro círculo, los resultados serán diferentes. Por tanto, no he de buscar un error absoluto, sino un error relativo.

La segunda idea es medir áreas. Concretamente, el cociente entre la diferencia de áreas del círculo dibujado y el círculo aproximado, dividido por el área del círculo. Como se ve en el papel, ahora sí que obtenemos un valor relativo de la rodondez del círculo. Una cosa que hemos de tener en cuenta es que cuando sumamos áreas, hay que coger el valor absoluto de la diferencia, para que no haya cancelaciones.

Cuanto más se aproxima a 0 el valor, más bueno es el círculo. Si el valor lo resto de 1, entonces el círculo perfecto valdrá R=1, y R=0.98 no sería tan bueno. Ahora falta implementarlo en mi programa.

Ruta por los árboles singulares de Barcelona (minimizando la distancia)

El problema del viajante de comercio (traveling salesman problem) es un problema clásico de la algorítmica: se trata de pasar por una serie de puntos, sin repetir ninguno, y minimizando la distancia recorrida. Hace unas pocas semanas que importé los árboles singulares de Barcelona a OpenStreetMaps, y creo que es una buena actividad didáctica para conocer los árboles de la ciudad hacer una ruta por unos cuantos de estos árboles.

Para hacerlo más interesante, podemos plantearnos el problema de hacer un recorrido que minimice la distancia, pasando por todos los árboles, y que vuelva al punto de partida. Estuve buscando diferentes implementaciones con Python que resolvieran el problema, hasta que encontré una que satisfacía mi restricción de volver al punto de partida.

Sobre esta solución he hecho alguna modificación para que me genere un fichero JSON con la solución. Finalmente, hemos de pintar sobre un mapa OSM nuestros punts (nodos); trazar una línea recta entre los puntos; y añadir un label-texto informativo sobre estos puntos. El resultado se puede ver en la imagen.

Evidentmente hemos hecho unas simplificaciones: la distancia mínima entre dos puntos es la línea recta, pero por la ciudad no podemos ir en línea recta, y además pueden haber subidas y bajadas. Pero como ejercicio didáctico creo que es interesante.

Aquí en Catalunya son populares las Carreras de Orientación. Creo que se podría aprovechar estas actividades en el tiempo de ocio y añadir una capa de conocimiento, como puede ser conocer los árboles, conocer monumentos, etc. Creo que para los niños y jóvenes puede ser una actividad divertida.

Referencias:

Libro: Elementary Mechanics Using Python

Tengo un nuevo reto para lo que queda de 2019 y para el primer semestre del 2020. He empezado a leer el libro Elementary Mechanics Using Python: A Modern Course Combining Analytical and Numerical Techniques, de Anders Malthe-Sørenssen. Es todo un curso de física, y combina de manera comprensible los ejemplos clásicos de movimiento, fuerzas, energía,… con sus soluciones numéricas, utilizando las libreriías matemáticas y de gráficos de Python.

Se trata de implementar todos los ejemplos del libro a código Python. No he visto ningún enlace para descargar todo el código, en cualquier caso, los ejemplos quiero adaptarlos y hacérmelos míos. He empezado por el ejemplo del peso suspendido de un muelle, que como todo el mundo sabe la solución del movimiento es sinusoidal entorno al punto de equilibrio, la velocidad es cero en los puntos máximo y mínimo, y la velocidad es máxima en el punto de equilibrio. Este ejemplo se explica en el apartado 5.7, que habla de fuerzas, y no basta con copiar y pegar el código, sino que lo he tenido que adaptar. Esta es mi solución:

# -*- 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()

Estos son los capítulos y temas que se tratan en el libro:

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 bicicletas en Barcelona (openstreetmap)

En este caso estamos hablando de 3000 puntos. Ha sido un poco complicado hacer la importación, porque había unos 400 puntos que ya estaban introducidos. Pero de estos, unos 150 no existen en la base de datos del ayuntamiento, que se supone que está actualizada. Somos conscientes de que podría haber parkings de uso privado.

En cualquier caso, como se trata de una importación de 3000 puntos, no se puede ir uno por uno. Realmente, no me había dado cuenta de que habían tantos puntos de parking de bicis. Yo, como voy con la Brompton, no los necesito, la bici siempre va conmigo.

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

Árboles singulares de las Islas Baleares


Hemos actualizado en OpenStreetMap la lista de árboles singulares de las Illes Balears [1], a partir de la experiencia en introducir los árboles monumentales de Catalunya y los árboles singulares de Barcelona.

Además, con overpass-turbo.eu ahora ya sé meter un icondo de un arbolito sobre el punto de interés, y así queda una gráfica muy 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;
}
}}

Árboles singulares de Barcelona: Salvemos la encina!

Aquí estoy yo estudiando la programación con OSM, actualizando desde un script python los árboles singulares de Barcelona, y evidentemente me he tropezado con la encina de la casita de la calle Encarnació.

Qué contradicción! Por una parte queremos proteger el patrimonio y tomar conciencia del medio natural que tenemos en una gran ciudad, y por otra parte vemos cómo hay gente a la que le importa una mierda todo esto y sólo piensa en un terreno por el valor económico que tiene y el rendimiento que les puede sacar.

Pues esto, tenemos que salvar la encina y las casitas de la calle Encarnació de la especulación urbanística. La gente que está en el ayuntamiento que se mojen de verdad y que pongan sobre la mesa una propuesta que todas las partes.

Para visualizar todos los árboles singulares que hay en Barcelona podemos utilizar overpass-turbo.eu, que nos permite realizar una consulta y ver el resultado gráfico 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;

Árboles monumentales de Cataluña en OpenStreetMap (2a parte)

Ya he realizado la actualización de los árboles monumentales, son más de 200 árboles. No hemos querido hacer una inserción automática, porque soy consciente de que ya hay información existente, y quiero ser respetuoso con esta información. Por tanto, el script es interactivo porque, dado un nodo/árbol que ya existe (el criterio es buscar árboles en un entorno de 50m del punto donde quiero insertar), quiero comparar la información antigua con la nueva .

Al final, de la lista de 222 árboles monumentales que tenemos, hemos insertado cerca de un 80% de los árboles, y del resto se ha actualizat la información.

Este verano pasado fuimos a ver el Pi de les Tres Branques. Hacía años que no iba al Camp Llong, cerca de Berga, un lugar realmente idílico. Después quisimos buscar el Pi Jove, también árbol monumental catalogado, que está allí cerca, y no lo encontramos. Ahora cuando vuelva ya no tendré excusa para encontrarlo.

Este ejercicio ha sido un buen punto de partida para colaborar con la comunidad OpenStreetMap con una tarea concreta y fácil. Espero poder seguir colaborando con la actualización de los mapas de OSM.