Étant donné deux lat / longs, comment puis-je savoir s'ils sont à moins de 1 mile l'un de l'autre?

8

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;
JosephStyons
la source
Quelles sont vos recherches jusqu'à présent comme candidat possible?
PolyGeo
1
Vous recherchez une solution logicielle ou vous créez votre propre code? Qu'est-ce que tu as essayé jusque-là?
MaryBeth
2
Quel est le problème avec la simple vérification de la distance haversine? Vous pouvez gagner un peu de temps de traitement en vérifiant simplement la distance planaire - à un mile, haversine ne fera pas beaucoup de différence.
Tom
4
pourriez-vous simplement utiliser geomA.STDistance (geomB) <d?
Ian Turton
2
Le contrôle de la "distance planaire" suggéré par @Tom pourrait facilement être mal interprété: pour fonctionner correctement, il doit être interprété avec soin. L'un est le suivant. En supposant que vous n'ayez jamais à comparer des points sur le méridien à 180 degrés ou les pôles, vous pouvez appliquer la formule de Pythagore aux coordonnées (lat1, cos (lat1) * lon1), (lat2, cos (lat2) * lon2). En d'autres termes, la comparaison (lat1-lat2) ^ 2 + (cos (lat1) * lon1-cos (lat2) * lon2) ^ 2 à 1/69 ^ 2 (tous en degrés) vous indique si les deux points sont séparés par un mile (avec une précision d'une fraction de pour cent). Que ce soit plus rapide que Haversine n'est pas clair.
whuber

Réponses:

2

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.

  1. Créez des tampons d'un demi-mile autour de chaque point
  2. Dissoudre les tampons résultants - s'assurer qu'il n'y a pas de multipolygones
  3. Tout point situé en dehors de ce polygone est désormais exclu de l'espace de recherche

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.

addcolor
la source
les tampons doivent avoir un rayon d'un mile, n'est-ce pas?
radouxju
@radouxju, deux milles et demi de chaque point est à 1 mile de distance.
addcolor
1
Je ne comprends pas. Soit vous voulez créer une couche de polygones basée sur un ensemble prédéfini de points, puis utilisez ce polygone avec un algorithme "point dans les polygones" pour savoir si de nouveaux points sont à moins d'un mile (alors vous devez calculer un tampon de rayon d'un mile) ... Ou travaillez directement avec tous les points, avec des tampons d'un demi-mile, dissolvez puis sélectionnez les tampons isolés en fonction de la zone (que vous devez calculer). Notez que 1) la création de vrais tampons d'un mile est assez coûteuse 2) la dissolution est assez cher. Seule l'option 1 a du sens pour moi, si vous réutilisez plusieurs fois les polygones.
radouxju
2

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.

radouxju
la source