J'utilise une base de données SQLITE pour stocker les latitudes et les longitudes des emplacements.Android sqlite tri sur colonne calculée (distance des coordonnées)
Je souhaite être capable de trier les résultats par distance approximative par rapport à l'emplacement actuel. J'ai déjà l'emplacement actuel de l'appareil en tant que double (lat, lng), le lat et le lng dans la base de données sont également doubles.
Ce que je veux, c'est une requête qui va créer une colonne virtuelle que je suis capable de trier les résultats.
J'utilise actuellement une fonction pour afficher la distance pour un enregistrement sélectionné:
float pk = (float) (180/3.14159);
float a1 = (float) (db_lat/pk);
float a2 = (float) (db_lon/pk);
float b1 = (float) (current_lat/pk);
float b2 = (float) (current_lon/pk);
float t1 = FloatMath.cos(a1)*FloatMath.cos(a2)*FloatMath.cos(b1)*FloatMath.cos(b2);
float t2 = FloatMath.cos(a1)*FloatMath.sin(a2)*FloatMath.cos(b1)*FloatMath.sin(b2);
float t3 = FloatMath.sin(a1)*FloatMath.sin(b1);
double tt = Math.acos(t1 + t2 + t3);
double dist = (6366000*tt);
Par exemple, un MySQL sélectionnez pourrait être (tirée de: www.movable-type.co.uk):
Select Lat, Lon, acos(sin($lat)*sin(radians(Lat)) + cos($lat)*cos(radians(Lat))cos(radians(Lon)-$lon))$R As dist From MyTable ORDER BY dist DESC
Actuellement, je sélectionner les emplacements en utilisant les éléments suivants:
OK est-il possible d'utiliser la base de données SQLITE de cette manière? Si ce n'est pas la seule option que je peux penser est d'avoir une colonne supplémentaire, itérer à travers les lignes exécutant la fonction ci-dessus sur chaque ligne et remplir une colonne supplémentaire sur la ligne, puis le tri sur cette colonne?
intégré d'android OK pour le test, j'ai créé un ArrayList> et rempli avec tous les détails requis. J'ai également créé une classe simple qui étend l'objet, ArrayList . Je parcourt le curseur et place les données, actuellement, dans les deux listes comme je le fais. J'effectue le calcul de la distance et je l'ajoute. Comment puis-je effectuer le tri? La classe est: classe locationRowDist extends Object { public String title; public double lat; public double lon; public double dist; } –
Scoobler
Si "locationRowDist" est une classe, faites-la implémenter l'interface Comparable, puis utilisez Arrays.sort() pour le trier. – CommonsWare