2010-07-26 11 views
32

J'utilise geography.STDistance() pour renvoyer la distance entre deux emplacements de point unique. Je suis curieux de savoir quelle mesure est utilisée pour la valeur de retour? Est-ce dans KM, miles ou peut-être un autre? Je reçois des résultats à partir de 250k mais je ne sais pas si je fais quelque chose de mal avec mon TSQL car ce sont des emplacements historiques (c'est-à-dire qu'ils n'existent plus), donc je ne peux pas faire une recherche rapide.SQL Server 2008 GEOGRAPHY STDistance() valeur

declare @p1 geography 

declare @p2 geography 

SELECT @p1 = Location from tblLocations where Id = 1 
SELECT @p2 = Location from tblLocations where Id = 2 

select @p1.STDistance(@p2) 

Répondre

56

Je pense que la mesure du rendement dépend de la Spatial Reference Identifiers (SRIDs) de votre type de données géographiques. La valeur par défaut est 4326 qui est en mètres. Il y a une table dans le DB que vous pouvez vérifier Select * from sys.spatial_reference_systems

7

Juste pour couvrir les personnes arrivant ici cherchant la réponse en utilisant les types STDistance avec GEOMETRY, le résultat est "exprimé dans la même unité de mesure que les valeurs de coordonnées elles-mêmes" (à partir de «début spatial avec SQL Server 2008») qui est en degrés pour les données WGS84/SRID 4326.

Le code SQL suivant doit être exécuté sur SQL Server 2008 R2 et ultérieur (source des données de localisation pour Edinburgh Waverley et London Charing Cross stations bing maps):

DECLARE @edinGeom GEOMETRY = GEOMETRY::STGeomFromText('POINT(-3.1917 55.9517)', 4326) 
DECLARE @cxGeom GEOMETRY = GEOMETRY::STGeomFromText('POINT(-0.1252 51.5083)', 4326) 
SELECT @edinGeom.STDistance(@cxGeom), sqrt(square(3.1917-0.1252) + square(55.9517-51.5083)) AS 'Distance from Pythagoras'; 

DECLARE @MetersPerMile FLOAT = 1609.344; 
DECLARE @edinGeog GEOGRAPHY = GEOGRAPHY::STGeomFromText('POINT(-3.1917 55.9517)', 4326) 
DECLARE @cxGeog GEOGRAPHY = GEOGRAPHY::STGeomFromText('POINT(-0.1252 51.5083)', 4326) 
SELECT @edinGeog.STDistance(@cxGeog), @edinGeog.STDistance(@cxGeog)/@MetersPerMile; 

Les résultats pour le premier 3 lignes en utilisant les types de GEOMETRIE sont:

STDistance Geom: 5,39881707506376, Distance de Pythagore: 5,39881707506376

Les résultats pour les types GÉOGRAPHIE sont:

STDistance Geog: 534226,761544321, Converti en milles: 331.953119745885

Les '331 miles' du calcul GEOGRAPHY La conversion avec conversion correspond bien à celle montrée sur les cartes de Bing comme étant la distance entre deux points (ce n'est clairement pas une preuve de quoi que ce soit, mais cela suggère des calculs sous-jacents similaires). Les résultats obtenus par le calcul GEOMETRY montrent que le résultat est très clairement en degrés, la valeur étant apparemment calculée en utilisant pythagoras (les calculs sous-jacents seraient plus complexes si nous obtenions la distance entre les points et les polygones).