Las distancias vuelven a Tagzania

Mayo 21st, 2009

Con la renovación de Tagzania nos olvidamos un pequeño detalle, la distancia de las rutas. Era una información que estaba guardada, pero que no se mostraba. Un ejemplo, el paseo por la Concha donostiarra:

Donostia beach walk - OpenStreetMap

En las páginas de edición de preferencias de usuarios podemos modificar la manera en que se muestra la distancia escogiendo entre kilometros y millas.

Esta es la primera modificación que hacemos gracias al feedback de los usuarios obtenido por la herramienta de UserVoice. ¡Que siga así! Gracias a todos por vuestra opinión.

Cambios recientes en Tagzania

Mayo 7th, 2009

Como os podéis imaginar, poco a poco estamos realizando algunas modificaciones y mejoras en Tagzania:

  • Ahora utilizamos la herramienta de Sugerencias (Feedback) de UserVoice: En la parte izquierda de cada página encontraréis una pestaña roja con el texto “Sugerencias”. Esta es una fantástica herramienta que permitirá conocer la opinión de los usuarios. Haciendo click en ese botón podréis ver las sugerencias realizadas por otros usuarios o mandarnos las vuestras.  Otra posibilidad es avisarnos sobre algún bug que os encontréis.

Sugerencias en Tagzania

  • Mejora de “sugerencia de etiquetas”. Cuando añadimos un nuevo punto en Tagzania puede que no recordemos que etiquetas hemos utilizado anteriormente y terminemos teniendo un montón de etiquetas similares. Para no tener ese problema añadimos la funcionalidad sugerencia de etiquetas, con dos alternativas: hacer click en el enlace “Ver todas tus etiquetas” para que todas ellas aparezcan allí mimo, o escribir las tres primeras letras de las etiquetas para que la herramienta te enseñe las que coinciden.

Tag suggestion Tagzania Tag suggestion Tagzania

  • Descarga todos tus puntos, sin límites: hasta ahora había una limitación de 200 puntos como máximo para la descarga de los puntos, pero algunos usuarios tienen cargados en Tagzania una gran cantidad de lugares. Por ello, hemos puesto un botón en las páginas de usuario para que se puedan descargar todos sus puntos.

Descargar todos tus lugares en Tagzania

  • Otro cambio menor consiste en introducir dos enlaces debajo de los mapas: el primero, para que puedan contactar con nosotros, y el segundo, un permalink de la página en concreto.

Esperemos que os gusten estos cambios, y los que vendrán.

Tagzania como herramienta didáctica

Abril 27th, 2009

En las últimas semanas hemos notado cierta actividad en Tagzania relacionada con la vida del poeta español Antonio Machado. Diversos usuarios han añadido los lugares por los que transitó Machado a lo largo de su vida: Sevilla, ciudad natal de Machado, Madrid, donde se trasladó con su familia o Colliure, donde falleció.

Después de investigar sobre el asunto, hemos encontrado este blog que sirve como material didáctico para 4º curso de la ESO (suponemos que para la asignatura de lengua). Este blog surge con motivo del centenario del traslado de Machado a Soria para tomar posesión de su cátedra en el Instituto. Ente las tareas que se manda a los estudiantes, una de ellas consiste en trazar el itinerario vital de Antonio Machado. El centenario se celebró hace dos años, el 2007, pero parece que la materia y esta actividad se imparten cada año.


Antonio Machado map

Estos son algunos de los usuarios que han etiquetado la vida de Antonio Machado en Tagzania: rosypatry, xik77, trabajomachado, etc.

Buscando un poco más, nos hemos encontrado con este otro blog que trata sobre las posibilidades didácticas de los mapas en clase de lengua y menciona Tagzania como recurso.

¡Muchas gracias a ambos!

Tagzania – Postgis – GeoDjango – Nearest Neighbours Distance (III)

Marzo 23rd, 2009

FASE 2: Problema & Solución

Los cálculos de distancia en linea y poligonos seguían siendo costosos para nuestro servidor.

Por lo que utilizamos el siguiente criterio (postgis), para que todas las busquedas fueran lo más rápidas posibles: de punto a punto.

– Un punto no tiene problema alguno.

– Una linea ==> ST_StartPoint(line)

– Un poligono ==> ST_Centroid(polygon)

** Funciones Postgis – ya que en Geodjango no existe el startpoint de lineas.

Así:

SELECT a.* FROM items AS a WHERE a.id != %s
ORDER BY (
CASE WHEN a.item_type='POINT' THEN ST_Distance(
(SELECT CASE b.item_type WHEN 'POINT' THEN b.point
WHEN 'POLYLINE' THEN ST_StartPoint(b.geometry)
ELSE ST_Centroid(b.geometry)END FROM items AS b WHERE b.id= %s), a.point)
WHEN a.item_type='POLYLINE' THEN ST_Distance(
(SELECT CASE c.item_type WHEN 'POINT' THEN c.point
WHEN 'POLYLINE' THEN ST_StartPoint(b.geometry)
ELSE ST_Centroid(b.geometry)END FROM items AS c WHERE c.id= %s), ST_StartPoint(a.geometry)
WHEN a.item_type='POLYGON' THEN ST_Distance(
(SELECT CASE c.item_type WHEN 'POINT' THEN c.point
WHEN 'POLYLINE' THEN ST_StartPoint(b.geometry)
ELSE ST_Centroid(b.geometry)END FROM items AS c WHERE c.id= %s), ST_Centroid(a.geometry)
) END) LIMIT %s;

Pero el precálculo de StartPoint y Centroid por cada vez que se acceda a esta consulta seguía siendo costoso para el sistema.

Solución: Tomamos la decisión de crear un punto central (center_point) por cada elemento (POI), y así facilitar la operación de cálculo de distancias.

center_point = models.PointField(blank=True, null = True)
POINT =>> center_point = self.point
LINE =>> center_point = fromstr('POINT(' + line_coords[0]+ ')')
POLYGON =>> center_point = self.polygon.centroid

Con lo que ademas conseguiamos que geodjango aplicase directamente su función de distancia:

tzp = get_object_or_404(items, id = ***)

near_items = Items.objects.distance(tzp.center_point).order_by(’distance’)

RESUMIENDO:

Cada vez que insertemos una geometría, debemos realizar estos precálculos para que las consultas sean más agiles a la hora de buscar los puntos mas cercanos a este que estamos insertando.

1.- Simplificar tanto lineas(polyline) como los poligonos(polygon). SIMPLIFY()

2.- Crear un punto central por cada geometría. (center_point)

De esta manera conseguimos que la busqueda sea más ágil, aunque después, estas geometrías sean muy complicadas en cuanto a cantidad de intersecciones, … pero esto ya pasa a manos del navegador.

¡Nuestro servidor respira!

Sugerencia de etiquetas

Marzo 17th, 2009

Hace unas semanas pusimos en marcha una encuesta para conocer vuestra opinión sobre Tagzania. Nuestro objetivo es ir mejorando el servicio que prestamos gracias a vuestras opiniones.

Una de los puntos a mejorar que recibimos es que cuando un usuario tiene muchos puntos y etiquetas resulta complicado gestionarlas a la hora de añadir nuevos lugares. Es decir, cuando voy a añadir un nuevo lugar, puede que no recuerde qué etiquetas he utilizado anteriormente.

Hoy hemos puesto en marcha un servicio de sugerencia de etiquetas. De este modo, cuando estemos añadiendo un nuevo lugar y tengamos que escribir las etiquetas, Tagzania nos dirá qué etiquetas hemos utilizado anteriormente. Para ello, es necesario introducir las tres primeras letras de la etiqueta. Sirva de ejemplo esta captura donde estoy añadiendo la Torre de Tokyo, a la hora de etiquetarlo, con poner las tres primeras letras, “tok”, Tagzania me avisa que ya he utilizado anteriormente la etiqueta “tokyo“.

Tagzania tag suggestion

Tagzania – Postgis – GeoDjango – Nearest Neighbours Distance (II)

Marzo 17th, 2009

FASE 1: Problema & Solución

En los comienzos se realizaban consultas SQL sobre diferentes geometrías. Algo así:

SELECT a.* FROM items AS a WHERE a.id != %s
ORDER BY (
CASE WHEN a.item_type='POINT' THEN ST_Distance(
(SELECT CASE b.item_type WHEN 'POINT' THEN b.point  ELSE b.geometry END
FROM items AS b WHERE b.id= %s), a.point)
    WHEN a.item_type='POLYLINE' THEN ST_Distance(
(SELECT CASE c.item_type WHEN 'POINT' THEN c.point ELSE b.geometry END
FROM items AS c WHERE c.id= %s), ST_StartPoint(a.geometry)
    WHEN a.item_type='POLYGON' THEN ST_Distance(
(SELECT CASE c.item_type WHEN 'POINT' THEN c.point ELSE b.geometry END
FROM items AS c WHERE c.id= %s), ST_Centroid(a.geometry)
) END) LIMIT %s;

Nos dimos cuenta que teniamos lineas de mas de 5000 intersecciones/puntos, por lo que realizar el cálculo de distancia sobre cada intersección/punto de esa linea, era demasiado costoso para el servidor. Y a la hora de visualizarlo en el mapa, tardaba demasiado en dibujarlo.

Solución: Decidimos guardar la versión simplificada ( geodjango – simplify() ) de cada geometría. Crear un elemento neutro, en caso de lineas y poligonos, de modo simplificado. Utilizando diferentes criterios de tolerancia, a cuanto más puntos más tolerancia, menos intersecciones/puntos.

simple_line = models.LineStringField(blank=True, null=True)
simple_polyline = models.PolygonField(blank=True, null=True)

if len(self.line.array) > 1000:
self.simple_line = self.line.simplify(tolerance = 0.0013)
else:
if len(self.line.array) > 400:
tzp.simple_line = self.line.simplify(tolerance = 0.0011)
else:
self.simple_line = self.line.simplify(tolerance = 0.0002)

Pero esto tampoco terminaba de ir del todo bien …

Segiamos mejorando ….

Próximamente la parte (III)

Tagzania – Postgis – GeoDjango – Nearest Neighbours Distance (I)

Marzo 2nd, 2009

En esta nueva etapa de Tagzania hemos apostado por la nueva tecnología que nos aporta el framework de Django. Dentro de esta encontramos una aplicación complementaria que nos hace las veces de ayuda para todas esas funciones de GIS que tanto necesitamos, GeoDjango.

Pero esta no es una clase de todas estas tecnologías.

Venimos a hablar de los diferentes problemas y soluciones que hemos tenido en todo este camino, al manejar todas las geometrías (point, line, polygon) que tratamos en nuestra aplicación.

Una de nuestras mayores necesidades es: “Encontrar los POI (Point of interest) mas cercanos a un punto concreto” (Nearest Neighbourds of geometry).

En el caso de Tagzania: utilizamos puntos, lineas y poligonos para la representación de POIs (puntos de interes).

class Item(models.Model):
point = models.PointField(blank=True, null = True) 
line = models.LineStringField(blank=True, null = True)
polygon = models.PolygonField(blank=True, null = True)

Todo ello conlleva procesos de cálculos complejos respecto a geometrías diferentes. Respecto a las lineas y los poligonos, las funciones como ST_Distance(geometry, geometry) tienen una carga excesiva en nuestro servidor.

Las diferentes funciones de GeoDjango solventan prácticamente la mayoría de nuestras necesidades, aúnque, aún falten funciones de postgis por implementar. Hemos probado las funciones de distancia (self.geometry.distance()) y resultan ser efectivas para distancias entre puntos, pero no para distancias entre geometrías que no sean puntos, por jemeplo: distancia entre una linea y un punto, tardaba demasiado…

Teniamos problemas de carga … (más información en la segunda parte)

Encuesta sobre Tagzania

Febrero 19th, 2009

Estos días estamos intentando investigar qué es lo que pensais sobre Tagzania. Nos gustaría conocer vuestra opinión sobre la nueva versión y qué mejoras os gustaría ver de cara al futuro. De hecho, tenemos dos encuestas distintas en marcha, una para los usuarios activos y otra para los visitantes (como el tráfico que viene de los buscadores).

Esta mañana hemos realizado un mailing a nuestros usuarios para que contesten unas pocas preguntas de esta encuesta.

También hemos añadido algo de texto y un enlace en Tagzania para poder hacer la encuesta a los visitantes.

Tagzania surveyLa verdad es que estaríamos muy agradecidos si pudieras tomarte un minuto para ayudarnos a mejorar Tagzania.

¡Gracias a todos! ;-)

Probando My Tracks para Android

Febrero 17th, 2009

My Tracks para Android salió el pasado jueves, y milagrosamente aguantamos hasta el viernes para probarlo.

Simple y fácil. Esa es la impresión. Nada de advanced features ni más difícil todavía. El programa hace lo que promete: te graba las rutas y te las sube fácilmente a Google Maps. Me puse el casco, metí el HTC G1 Android en el bolsillo pequeño del hombro y en marcha con la moto! (Otros tagzanos son más de Kyoto y lo hicieron en bicicleta el fin de semana).

Trying new Android G1 phone´s My Tracks
Starship trooper con Android

En realidad no es mucho más de lo que hace un GPS de montaña normal y corriente. La diferencia está en lo fácil que es subirlas a la red, basta pulsar una opción en el menú del track. La única pega es que va directo a casa del todopoderoso Google, aunque se puede exportar a KML y reutilizar donde se quiera.

Además, la aplicación de Android muestra un gráfico con los desniveles del recorrido así como unos datos generales de distancia, tiempo recorrido, velocidad media etc., opción que he echado de menos en Google Maps.

Android My Tracks recording
Ruta desde casa a Tagzania Headquarters

De verdad creo que la facilidad para subir los datos a la red va a ser la clave para que la herramienta tenga un uso generalizado. Actualmente, cualquier usuario que pretenda subir tracks a partir de su Garmin o Magellan, necesita una mínima formación, que le ayude un amigo, etc. Eso a condición de que tenga los drivers adecuados y que sepa limpiar trazas de GPS después de varios usos. Quizás es lo que ha limitado hasta ahora la utilización masiva de herramientas potentes como Wikiloc.

Para terminar:

  •  La batería del HTC G1 muere literalmente al activar el GPS. No se puede grabar mucho tiempo así. He notado que en zonas de ciudad con edificios que dificultan la recepción de satelites el HTC G1 sigue la posición mejor que muchos modelos típicos para montaña y exterior. Supongo que la duración de la batería es el precio a pagar por esta mejor recepción.
  • Echo de menos la exportación directa a Tagzania. ;-)
  • Echo también de menos un sistema de navegación que te permita seguir una ruta anteriormente utilizada por tí o por otro usuario de My Tracks.
  • Pero mi aplicación favorita sería una que una vez definidos los puntos CASA y TRABAJO, fuera guardando los datos de tiempo de todos los días utilizando diferentes rutas y horarios. Después estaría bien que me avisara “los miercoles no pases por el centro para ir al trabajo, que hay mercadillo y el tráfico está horrible!”

Pero ya estamos pidiendo demasiadas features, y precisamente dijimos que lo mejor de la aplicación era lo simple y fácil, no?  Esperaremos.  :-)

Tagzania y Android

Diciembre 22nd, 2008

La semana pasada pudimos saber que Motorola va a abandonar Symbian como sistema operativo de sus teléfonos móviles. La empresa americana va a apostar por Android, el sistema operativo de Google, para sus nuevos terminales. Ésta no es la única noticia que augura un brillante futuro a Android. Otras empresas como Sony Ericsson, Toshiba o Garmin, también van a empezar a utilizar este sistema operativo en sus teléfonos móviles.

En Tagzania también creemos en el potencial de Android, por eso hemos adquirido el teléfono G1 con Google Android. Tan pronto como vimos esta oferta especial para desarrolladores, nos lanzamos a por uno de estos increíbles móviles. Ya estamos deseando preparar una aplicación de Tagzania para Android y poder testearla en el G1.

Google G1 Android phone in Tagzania

Ahora tenemos un nuevo juguete en nuestra nueva oficina.