J'essaie de mettre en œuvre une vérification très efficace pour voir si deux points sont à moins d'un mile l'un de l'autre, ou non.
Mon approche actuelle consiste à calculer la distance Haversine , puis à vérifier si elle est inférieure à un mile.
L'efficacité est importante dans ce cas car je dois calculer cet indicateur oui / non pour les grands jeux d'enregistrements.
Je me soucie seulement de savoir s'ils sont à moins d'un mile - rien d'autre sur la distance ne m'importe.
Alors, quelle est la façon la plus efficace de savoir si deux points lat / long se trouvent à moins d'un mile l'un de l'autre?
En réponse aux commentaires, je fais cela dans SQL Server. Mon code est ci-dessous.
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
la source
la source
Réponses:
Essayez cette méthode - ce n'est peut-être pas le meilleur, mais cela pourrait limiter votre espace de recherche à quelques-uns et vous aider ainsi à accélérer le processus.
Assurez-vous d'avoir construit des indices spatiaux et vérifiez si cette procédure a amélioré le temps de réponse à votre requête.Vous pouvez également affiner l'approche en construisant près de la table (ESRI ArcGIS a un outil) avec 1 mile comme critère.
la source
Si vous travaillez à l'échelle mondiale, vous pouvez éviter de calculer beaucoup de péchés et de cos par de simples tests directs:
Le premier test pour filtrer les points avant de calculer haversine est d'exclure le point où @DLAT> 0,015 degrés (pourrait être plus précis, mais je préfère la sécurité).
Dans une deuxième étape, vous pouvez également le faire avec @DLON dans une plage de latitude donnée avec une valeur conservatrice (par exemple entre -60 et 60 degrés, exclure @DLON> 0,03 (= 0,015 / cos (60)).
Parce que 1 mile est assez petit, vous n'aurez que rarement besoin de calculer Haversine avec ces deux règles (sauf si vous travaillez sur des zones polaires), et vous pouvez remplacer Haversine par Pythagorean (2 cosinus vs 2 sinus et 2 cosinus avec Haversine) comme mentionné par @whuber.
la source