Maison >Java >javaDidacticiel >Comment trouver efficacement les emplacements les plus proches dans SQLite sans fonctions personnalisées ?

Comment trouver efficacement les emplacements les plus proches dans SQLite sans fonctions personnalisées ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-05 17:42:111050parcourir

How to Efficiently Find the Nearest Locations in SQLite Without Custom Functions?

Obtenir les emplacements les plus proches dans SQLite à l'aide de la formule Haversine

Le stockage des coordonnées de latitude et de longitude dans votre base de données SQLite ouvre diverses possibilités de géolocalisation candidatures. Une tâche courante consiste à récupérer les emplacements les plus proches d'un point donné sur la base de la formule Haversine. Alors que MySQL prend en charge cela de manière native avec des fonctions personnalisées, SQLite nécessite une approche plus impliquée.

Fonctions externes personnalisées pour la formule Haversine

SQLite prend en charge des fonctions externes personnalisées pour la mise en œuvre de calculs avancés. Cependant, la création et l’intégration de ces fonctions peuvent introduire des complexités inutiles et une surcharge de performances. De plus, trier les résultats par distance nécessite d'ajouter une colonne de distance à la base de données, ce qui est à la fois inefficace et peu pratique.

Filtrage efficace avec rectangle englobant

Une solution pratique pour ce défi consiste à filtrer la base de données avec un rectangle englobant. En calculant les quatre coins du rectangle en fonction du point donné et d'un rayon prédéfini, vous pouvez éliminer la plupart des données non pertinentes et réduire considérablement la quantité de traitement requise. Les latitudes et longitudes dérivées peuvent ensuite être utilisées pour construire une clause WHERE pour les requêtes SQL :

PointF center = new PointF(x, y);
final double mult = 1.1; // Mult for more reliable results
PointF p1 = calculateDerivedPosition(center, mult * radius, 0);
PointF p2 = calculateDerivedPosition(center, mult * radius, 90);
PointF p3 = calculateDerivedPosition(center, mult * radius, 180);
PointF p4 = calculateDerivedPosition(center, mult * radius, 270);

strWhere =  " WHERE "
        + COL_X + " > " + String.valueOf(p3.x) + " AND "
        + COL_X + " < " + String.valueOf(p1.x) + " AND "
        + COL_Y + " < " + String.valueOf(p2.y) + " AND "
        + COL_Y + " > " + String.valueOf(p4.y);

Calcul de la distance dans les résultats filtrés

Une fois les données filtrées, vous pouvez parcourir les résultats et calculer les distances réelles à l'aide de la formule Haversine :

public static boolean pointIsInCircle(PointF pointForCheck, PointF center,
            double radius) {
        if (getDistanceBetweenTwoPoints(pointForCheck, center) <= radius)
            return true;
        else
            return false;
    }

public static double getDistanceBetweenTwoPoints(PointF p1, PointF p2) {
        // Haversine formula for calculating distance in meters
        // ...
    }

En combinant des En filtrant avec des calculs de distance précis, vous pouvez récupérer les emplacements les plus proches de votre base de données SQLite sans compter sur des fonctions externes personnalisées ou des colonnes de distance persistantes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn