Hola,
Tengo un dilema bastante importante con una aplicación en Android. Espero que podáis darme alguna idea.
Se trata de una aplicación que consume POIs (puntos de interés) que obtengo mediante peticiones a un servicio web a través de REST.
Sólo necesito obtener en cada petición los POI que están en un radio de 5km de mi posición, por lo que en la petición establezco el radio como parámetro.
En el servidor cuento con una base de datos MySQL y puedo perfectamente realizar una query para devolver los POI según el radio especificado, utilizando the harvesine formula.
La query sería algo tal que así:
"SELECT id, name, lat, lon, ( 6356 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM pois HAVING distance < 5000 ORDER BY distance ASC
Hasta ahí todo bien. El problema viene de que la aplicación también debe funcionar sin conexión, es decir, debo sincronizar la base de datos de la aplicación (SQLite) con la base de datos del servidor (MySQL), algo así como tener una copia local de los POI que he solicitado previamente al servicio web y realizar las consultas siempre a la base de datos local (SQLite).
El problema con SQLite es que, aun teniendo los mismos datos, la query anterior no la puedo realizar porque no dispone de funciones trigonométricas. Tampoco puedo crear una función ya que Android no lo permite.
De momento la única solución que se me ha ocurrido es:
Al guardar los POI en la base de datos local, guardar también en nuevas columnas el cos(lat), sin(lat), cos(lon), sin(lon), etc.
Desaprovecho espacio, pero al menos puedo realizar la query, y también incremento el rendimiento al realizar las queries al no tener que hacer operaciones trigonométricas.
¿Alguna otra idea?