3

Je calcule la distance en mètres entre les deux valeurs à long lat - 40,1844441 -77.2252771 et
40,319166 -76,7880552serveur SQL GÉOGRAPHIE fonction STDistance retourne grande différence que les autres résultats des tests

Je l'ai testé la distance entre ces deux points en dessous de deux sites Web - http://www.nhc.noaa.gov/gccalc.shtml et http://www.movable-type.co.uk/scripts/latlong.html
Ces deux sites Web retournent environ 40014 mètres. Donc, j'utilise le type de données GEOGRAPHY du serveur SQL pour calculer la distance entre ces deux points et il renvoie 48927 mètres. C'est une énorme différence pour moi.
Ci-dessous est mon code et toute suggestion est appréciée.

declare @latlong1 GEOGRAPHY 
declare @latlong2 GEOGRAPHY 
DECLARE @distance float 

set @latlong1 = GEOGRAPHY::STGeomFromText('POINT(40.1844441 -77.2252771)', 4326) 
set @latlong2 = GEOGRAPHY::STGeomFromText('POINT(40.319166 -76.7880552)', 4326) 

SET @distance = @latlong1.STDistance(@latlong2) 
SELECT @distance -- this returns 48927 meters 

Répondre

1

Moi aussi ont remarqué des résultats bizarres, donc je tendance à utiliser géographie :: Point() qui semble générer des résultats plus propres. Même alors, l'option 2 est à 80 mètres de l'UDF qui semble être sur place.

Exemple

declare @latlong1 GEOGRAPHY 
declare @latlong2 GEOGRAPHY 

Set @latlong1 = GEOGRAPHY::STGeomFromText('POINT(40.1844441 -77.2252771)',4326) 
Set @latlong2 = GEOGRAPHY::STGeomFromText('POINT(40.319166 -76.7880552)',4326) 

Select VeryOdd = @latlong1.STDistance(@latlong2) 
     ,SQLGeo = geography::Point(40.1844441, -77.2252771, 4326).STDistance(geography::Point(40.319166,-76.7880552, 4326)) 
     ,UDFGeo = [dbo].[udf-Geo-Meters](40.1844441,-77.2252771,40.319166,-76.7880552) 

Retours

VeryOdd    SQLGeo    UDFGeo 
48927.1485292471 40093.8055001913 40014.8833526855 

L'UDF si vous êtes intéressé

CREATE Function [dbo].[udf-Geo-Meters](@Lat1 FLOAT, @Lng1 FLOAT, @Lat2 FLOAT, @Lng2 FLOAT) 
Returns Float as 
Begin 
    Return ACOS(SIN(PI()*@Lat1/180.0)*SIN(PI()*@Lat2/180.0)+COS(PI()*@Lat1/180.0)*COS(PI()*@Lat2/180.0)*COS(PI()*@Lng2/180.0-PI()*@Lng1/180.0)) * 6371008.8 
    -- 6.371 mean radius of earth in meters 
End 
+0

John C: Je peux confirmer UDFGE Le résultat O est correct à 12 chiffres significatifs, basés sur la terre étant une sphère de rayon 6371008.8 mètres. –

+0

@JohnMachin Merci pour l'effort supplémentaire et la confirmation –

+0

@JohnCappelletti - merci. J'ai également confirmé en utilisant "loi sphérique des cosinus" qui est exactement le que vous avez calculé et il renvoie 40014.8833526855 mètres. Oui. J'ai utilisé le rayon du globe comme 6371008.8. – Shwe

0

Essayez rev ersing le lat et lon dans le cas "VeryOdd", c'est-à-dire utiliser POINT(-77.2252771 40.1844441) et POINT(-76.7880552 40.319166). Mon résultat hors ligne "loi sphérique des cosinus" est 48733 mètres, ce qui représente seulement environ 0,4% de différence avec les 4800 mètres d'origine VeryOdd.

Je suggère d'essayer quelques tests de plus avec différents lats et lons, en plus de vérifier les docs pour les fonctions/méthodes pertinentes.

dernières nouvelles en retard: STGeomFromText ('POINT (latitude longitude)' etc - par rapport au protocole plus fréquent: latitude d'abord, puis la longitude

Voir la réponse choisie à cette question: Create Geometry/Geography Field from Latitude & Longitude fields (SQL Server)

pour effacer les différences qui subsistent, quelqu'un a besoin de chercher ce rayon/rayons est/sont invoquées par la magie 4326 ...