AngularJS es una opción estupenda a la hora de escribir una aplicación interactiva; está diseñado para vigilar los cambios en la vista y reaccionar inmediatamente. Cuando se trata de hacer una página que funcione como un programa, el diseño es muy rápido y moderadamente sencillo.
Para una demostración de Los Nombres de Europa, de Alberto Porlan, escribí esta pequeña aplicación (que está desactivada en estos momentos) hace unos meses. Se presentaron varios problemas: para empezar, la base de datos de topónimos hubo que extraerla de un mdb de access que tiene aproximadamente 850.000 entradas. Para hacer más sencilla la búsqueda, convertí los topónimos a un sistema simplificado usando enteros en base 3 usando un script de perl y depurando las excepciones. por otro lado, cada búsqueda implica el cálculo de todos los topónimos cercanos, teniendo en cuenta que es una distancia topográfica y no sobre un plano recto, lo que la hace mucho más lenta. Por último la representación en un mapa de google dio sus problemas; la documentación brillaba por su ausencia.
En un futuro añadiré una búsqueda relacional por tres atingentes y un sistema de estadísticas, que muestren los datos de topónimos relacionados por áreas de la península.
Cálculo de distancias
Para hallar la distancia entre dos puntos topográficos (a vista de pájaro) hay que tener en cuenta la curvatura terrestre. En este caso he usado la fórmula del haverseno, ya que permite un cálculo lo suficientemente preciso sin tener que recurrir a algoritmos mucho mas lentos.
CREATE FUNCTION geo_distance(lon0 DECIMAL, lat0 DECIMAL, lon1 DECIMAL, lat1 DECIMAL) RETURNS DECIMAL(3,4) BEGIN DECLARE distance DECIMAL(3,4) DEFAULT 0; SET distance = 6372 * 2 * ASIN(SQRT(POWER(SIN((lat0 - lat1) * PI()/180/2),2) + COS(lon0 * PI()/180) * COS(lat1 * PI() / 180) * POWER(SIN((lon0 - lon1) * PI()/180/2),2) )); RETURN distance; END;
nota: El valor 6372 es el radio terrestre medio en km, suficiente para la precisión que se necesita para esta aplicación.
Este procedimiento es rápido, pero se puede mejorar el rendimiento total de una forma muy simple si sólo lo aplicamos entre los valores aproximados, filtrando por sus coordenadas de una forma aproximada:
SELECT *, ... FROM temp_table JOIN temp_table1 WHERE (LON_ROOT BETWEEN temp_table.LON - 0.25 AND temp_table.LON + 0.25) AND (LAT_ROOT BETWEEN temp_table.LAT - 0.25 AND temp_table.LAT + 0.25) HAVING ...
Google maps tiene librerias adicionales para trabajar con el mapa. Todas las librerias adicionales las podemos ver en Libraries y las mencionadas en este capitulo son MarkerClusterer y MarkerManager .