web-dev-qa-db-fra.com

SQL Server 2008 GEOGRAPHY STDistance (), valeur

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 en KM, en miles ou peut-être en un autre?

J'obtiens des résultats de plus 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 simplement faire une recherche rapide.

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)
37
Chris

Je pense que la mesure du retour dépend des Identifiants de référence spatiale (SRID) de votre type de données géographiques. La valeur par défaut est 4326, en mètres. Il y a une table dans la base de données que vous pouvez vérifier Select * from sys.spatial_reference_systems

63
SPE109

Juste pour couvrir les personnes arrivant ici à la recherche de la réponse lors de l'utilisation de STDistance avec les types GEOMETRY, le résultat est "exprimé dans la même unité de mesure que les valeurs de coordonnées elles-mêmes" (de "Beginning Spatial with SQL Server 2008") qui pour WGS84/SRID 4326 les données sont en degrés.

Le SQL suivant doit s'exécuter sur SQL Server 2008 R2 et supérieur. (Source des données de localisation pour les cartes bing des stations Edinburgh Waverley et London Charing Cross):

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 les 3 premières lignes utilisant des types GÉOMÉTRIE sont:

STDistance Geom: 5.39881707506376, Distance de Pythagore: 5.39881707506376

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

STDistance Geog: 534226.761544321, Converti en Miles: 331.953119745885

Les `` 331 miles '' du calcul de GEOGRAPHIE avec conversion correspondent bien à celui indiqué sur les cartes Bing comme 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 chiffres générés par le calcul GEOMETRY démontrent, espérons-le, que le résultat est très clairement en degrés, la valeur étant apparemment calculée à l'aide de pythagore (les calculs sous-jacents seraient plus complexes si nous obtenions la distance entre les points et les polygones).

11
Nij