Obtener los siguientes N puntos geográficos más cercanos
Tengo en mi aplicación de Android una tabla de base de datos con geo pointes (lat y lon son valores de grado decimal), alrededor de 1000 puntos. Y necesito seleccionar el punto más cercano a un determinado punto geográfico.
He encontrado en Stackoverflow la respuesta a la forma de calcular la distancia entre dos puntos geo y fue muy feliz, hasta que traté de escribir mi consulta. He descubierto, que no es posible utilizar funciones trignometrical en built-in sqlite de android.
- Android / SQLite - Operación de bits en la cláusula WHERE
- Asegúrese de que SQLite en Android utiliza UTF-8 como un conjunto de caracteres
- Cómo ver los datos guardados en la base de datos android (SQLite)?
- Error al leer la fila 0, columna 0 de una CursorWindow que tiene 0 filas, 64 columnas
- ¿Cómo acceder a Android a una base de datos sqlite incluida en la carpeta de activos?
Pero entonces tengo una Idea. Realmente no necesito calcular distancia. El próximo punto es otro que la menor diferencia en sus coordenadas geográficas debe ser.
¿Cómo podría usar este hecho? ¿Sería suficiente pedir puntos guardados por (lat_0 – lat_n) ^ 2 + (lon0-lon_n) ^ 2, donde lat_0 y lon_0 son coordenadas geográficas de un punto dado?
Gracias,
Mur
UPD
Así pues, la mejor manera de obtener una respuesta para mi pregunta era probar el acercamiento que describo arriba.
Funciona bastante bien pero no exactamente comparado con la distancia exacta.
Así que si sólo necesitas calcular una distancia, esta solución está bien, pero en mi caso también necesitaba ordenar estaciones por distancia y no podía usar esta solución.
Mis gracias van en John en CashCommons y Philip. Gracias chicos
- Cómo realizar una prueba de unidad de migración de base de datos entre versiones
- Cómo cargar más de 1 MB de datos desde sqlite db al cursor de Android?
- Android json analizar y almacenar en la base de datos
- INSERT de SQLite de SQL
- Cursor.moveToNext sin moverToFirst
- ¿Dónde está almacenada mi base de datos sqlite en android?
- Android SQLiteException: Error al cambiar la configuración regional de db a 'en_US'
- Instrucciones de inserción múltiple android sqlite
Si sus puntos están separados dentro de una ciudad (más o menos), esa aproximación funcionará bien. La aproximación se desmorona si vas por todo el mundo, sin embargo.
EDIT: Basado en el comentario de Philip a continuación, debe escalar uno de los componentes. Alemania está a unos 50 grados de latitud norte, por lo que multiplicar la longitud por (cos 50 grados) será mejor.
Sí. 🙂 La distancia real es sqrt ((lat_0 – lat_n) ^ 2 + (lon0-lon_n) ^ 2) pero el ordenar por (lat_0 – lat_n) ^ 2 + (lon0-lon_n) ^ 2 es suficiente.
Hmm … No estoy seguro de cómo funcionaría ese pedido? ¿No necesitaría un orden diferente para cada punto para indicar que es vecinos.
La solución más simple es simplemente iterar a través de todos los puntos y calcular la distancia geométrica entre los puntos. Para 1000 puntos esto debería suceder bastante rápido.
La solución más optimizada (en términos de velocidad de recuperación) es calcular los vecinos de cada punto cuando se insertan en la base de datos. Por ejemplo, puede mantener la lista de ids como una cadena de comas separadas e insertar en la base de datos ?. Entonces, cuando necesitas vecinos someones que hacer directamente a ellos. Sin embargo esto va a convertirse en un dolor si necesita insertar nuevos puntos. Básicamente tendrá que volver a calcular los vecinos.
- Depuración de Android con conexión a Internet de PC
- Java – ¿Utilizar anotaciones e interceptar métodos?