106 votes

Calculer la distance entre deux points (Latitude, Longitude)

J'essaie de calculer la distance entre deux positions sur une carte. J'ai stocké dans mes données : Longitude, Latitude, X POS, Y POS.

J'ai déjà utilisé le code ci-dessous.

DECLARE @orig_lat DECIMAL
DECLARE @orig_lng DECIMAL
SET @orig_lat=53.381538 set @orig_lng=-1.463526
SELECT *,
    3956 * 2 * ASIN(
          SQRT( POWER(SIN((@orig_lat - abs(dest.Latitude)) * pi()/180 / 2), 2) 
              + COS(@orig_lng * pi()/180 ) * COS(abs(dest.Latitude) * pi()/180)  
              * POWER(SIN((@orig_lng - dest.Longitude) * pi()/180 / 2), 2) )) 
          AS distance
--INTO #includeDistances
FROM #orig dest

Je ne fais cependant pas confiance aux données qui en découlent, elles semblent donner des résultats légèrement inexacts.

Quelques exemples de données au cas où vous en auriez besoin

Latitude        Longitude     Distance 
53.429108       -2.500953     85.2981833133896

Quelqu'un pourrait-il m'aider avec mon code ? Cela ne me dérange pas si vous voulez corriger ce que j'ai déjà, mais si vous avez une nouvelle façon de le faire, ce serait génial.

Veuillez indiquer dans quelle unité de mesure vos résultats sont exprimés.

2voto

Thurfir Points 35

En complément des réponses précédentes, voici une façon de calculer la distance à l'intérieur d'un SELECT :

CREATE FUNCTION Get_Distance
(   
    @La1 float , @Lo1 float , @La2 float, @Lo2 float
)
RETURNS TABLE 
AS
RETURN 
    -- Distance in Meters
    SELECT GEOGRAPHY::Point(@La1, @Lo1, 4326).STDistance(GEOGRAPHY::Point(@La2, @Lo2, 4326))
    AS Distance
GO

Utilisation :

select Distance
from Place P1,
     Place P2,
outer apply dbo.Get_Distance(P1.latitude, P1.longitude, P2.latitude, P2.longitude)

Les fonctions scalaires fonctionnent également, mais elles sont très inefficaces pour le calcul de grandes quantités de données.

J'espère que cela pourra aider quelqu'un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X