Heim >Java >javaLernprogramm >Wie finde ich effizient die nächstgelegenen Speicherorte in SQLite ohne benutzerdefinierte Funktionen?

Wie finde ich effizient die nächstgelegenen Speicherorte in SQLite ohne benutzerdefinierte Funktionen?

Linda Hamilton
Linda HamiltonOriginal
2024-12-05 17:42:111051Durchsuche

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

Ermitteln der nächstgelegenen Standorte in SQLite mithilfe der Haversine-Formel

Das Speichern von Breiten- und Längengradkoordinaten in Ihrer SQLite-Datenbank eröffnet verschiedene Möglichkeiten für die standortbasierte Anwendungen. Eine häufige Aufgabe besteht darin, anhand der Haversine-Formel die nächstgelegenen Standorte zu einem bestimmten Punkt abzurufen. Während MySQL dies nativ mit benutzerdefinierten Funktionen unterstützt, erfordert SQLite einen komplexeren Ansatz.

Benutzerdefinierte externe Funktionen für Haversine Formula

SQLite unterstützt benutzerdefinierte externe Funktionen zur Implementierung erweiterter Berechnungen. Allerdings kann die Erstellung und Integration dieser Funktionen zu unnötiger Komplexität und Leistungsaufwand führen. Darüber hinaus erfordert das Sortieren der Ergebnisse nach Entfernung das Hinzufügen einer Entfernungsspalte zur Datenbank, was sowohl ineffizient als auch unpraktisch ist.

Effiziente Filterung mit Begrenzungsrechteck

Eine praktische Lösung für Diese Herausforderung besteht darin, die Datenbank mit einem umgrenzenden Rechteck zu filtern. Durch die Berechnung der vier Ecken des Rechtecks ​​auf der Grundlage des angegebenen Punktes und eines vordefinierten Radius können Sie die meisten irrelevanten Daten eliminieren und den Verarbeitungsaufwand erheblich reduzieren. Die abgeleiteten Breiten- und Längengrade können dann verwendet werden, um eine WHERE-Klausel für SQL-Abfragen zu erstellen:

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);

Berechnung der Entfernung innerhalb gefilterter Ergebnisse

Sobald die Daten gefiltert sind, Sie können die Ergebnisse durchlaufen und die tatsächlichen Entfernungen mithilfe der Haversine-Formel berechnen:

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
        // ...
    }

Durch die Kombination effizienter Filterung mit Durch genaue Entfernungsberechnungen können Sie die nächstgelegenen Standorte aus Ihrer SQLite-Datenbank abrufen, ohne auf benutzerdefinierte externe Funktionen oder persistente Entfernungsspalten angewiesen zu sein.

Das obige ist der detaillierte Inhalt vonWie finde ich effizient die nächstgelegenen Speicherorte in SQLite ohne benutzerdefinierte Funktionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn