Ich versuche, eine sehr effiziente Überprüfung durchzuführen, um festzustellen, ob zwei Punkte innerhalb einer Meile voneinander liegen oder nicht.
Mein aktueller Ansatz besteht darin, die Haversine-Entfernung zu berechnen und dann zu überprüfen, ob sie weniger als eine Meile beträgt .
Effizienz ist in diesem Fall wichtig, da ich dieses Ja / Nein-Flag für große Datensatzmengen berechnen muss.
Es ist mir nur wichtig, ob sie sich innerhalb einer Meile befinden - nichts anderes über die Entfernung ist mir wichtig.
Was ist also der effizienteste Weg, um festzustellen, ob zwei Lat / Long-Punkte innerhalb einer Meile voneinander liegen?
Als Antwort auf die Kommentare mache ich das in SQL Server. Mein Code ist unten.
CREATE FUNCTION dbo.USR_UFN_HAVERSINE_DISTANCE
(
@LAT1 FLOAT(18)
,@LONG1 FLOAT(18)
,@LAT2 FLOAT(18)
,@LONG2 FLOAT(18)
,@UnitOfMeasure NVARCHAR(10) = 'KILOMETERS'
)
RETURNS FLOAT(18)
AS
BEGIN
DECLARE
@R FLOAT(8)
,@DLAT FLOAT(18)
,@DLON FLOAT(18)
,@A FLOAT(18)
,@C FLOAT(18)
,@D FLOAT(18)
;
SET @R =
CASE @UnitOfMeasure
WHEN 'MILES' THEN 3956.55
WHEN 'KILOMETERS' THEN 6367.45
WHEN 'FEET' THEN 20890584
WHEN 'METERS' THEN 6367450
ELSE 6367.45 --km
END
SET @DLAT = RADIANS(@LAT2 - @LAT1);
SET @DLON = RADIANS(@LONG2 - @LONG1);
SET @A = SIN(@DLAT / 2)
* SIN(@DLAT / 2)
+ COS(RADIANS(@LAT1))
* COS(RADIANS(@LAT2))
* SIN(@DLON / 2)
* SIN(@DLON / 2);
SET @C = 2 * ASIN(MIN(SQRT(@A)));
SET @D = @R * @C;
RETURN @D;
END;
distance
sql-server
algorithm
software-recommendations
JosephStyons
quelle
quelle
Antworten:
Probieren Sie diese Methode aus - sie ist möglicherweise nicht die beste, kann jedoch Ihren Suchraum auf wenige beschränken und Ihnen so helfen, den Prozess zu beschleunigen.
Stellen Sie sicher, dass Sie räumliche Indizes erstellt haben, und überprüfen Sie, ob durch dieses Verfahren die Antwortzeit für Abfragen verbessert wurde. Sie können den Ansatz auch verfeinern, indem Sie eine Near-Table-Tabelle (ESRI ArcGIS verfügt über ein Tool) mit 1 Meile als Kriterium erstellen.
quelle
Wenn Sie global arbeiten, können Sie durch einfaches, unkompliziertes Testen vermeiden, viele Sünden und Kosten zu berechnen:
Der erste Test zum Herausfiltern von Punkten vor der Berechnung von Haversine besteht darin, einen Punkt auszuschließen, an dem @DLAT> 0,015 Grad ist (könnte genauer sein, aber ich bevorzuge Sicherheit).
In einem zweiten Schritt können Sie dies auch mit @DLON in einem bestimmten Breitengradbereich mit einem konservativen Wert tun (z. B. zwischen -60 und 60 Grad, @DLON> 0,03 ausschließen (= 0,015 / cos (60)).
Da 1 Meilen ziemlich klein ist, müssen Sie Haversine nur selten mit diesen beiden Regeln berechnen (außer wenn Sie an Polargebieten arbeiten), und Sie können Haversine wie erwähnt durch Pythagoreisch ersetzen (2 Cosinus vs 2 Sinus und 2 Cosinus durch Haversinus) von @whuber.
quelle