Heim >Java >javaLernprogramm >Wie finde ich effizient die nächstgelegenen Speicherorte in SQLite ohne benutzerdefinierte Funktionen?
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!