2009-10-21 30 views
2

J'ai passé quelques jours à essayer de comprendre celui-ci semble et ne peut pas d'identifier les problèmes. J'ai une base de données SQL 2005 stockant la latitude et la longitude comme Decimal (18,8), dont j'ai reçu en interrogeant Google.Distance entre deux emplacements à l'aide chemin Latitude et Longitude de ce que Google dit

Pour ces deux endroits: From: 10715 Downsville Pike Ste 100 MD 21740 to: 444 East College Ave Ste 120 State College PA, 16801

Compte tenu de cette distance sera « à vol d'oiseau », mes résultats sont encore loin. Dans cet exemple, mon résultat indique 21,32 miles, mais Google Maps dit 144 miles.

Je pense que le nappage qui le rend encore plus frustrant que je trouve ce site est: http://jan.ucc.nau.edu/~cvm/latlongdist.html et est venu avec presque exactement les mêmes résultats que moi.

Voilà mes fonctions et requête:

Fonctions: CalculateDistance

DECLARE @Temp FLOAT 

SET @Temp = SIN(@Latitude1/57.2957795130823) * 
    SIN(@Latitude2/57.2957795130823) + 
    COS(@Latitude1/57.2957795130823) * COS(@Latitude2/57.2957795130823) * 
    COS(@Longitude2/57.2957795130823 - @Longitude1/57.2957795130823) 

IF @Temp > 1 
    SET @Temp = 1 
ELSE IF @Temp < -1 
    SET @Temp = -1 

RETURN (3958.75586574 * ACOS(@Temp)) 

LatitudePlusDistance

RETURN (SELECT @StartLatitude + SQRT(@Distance * @Distance/4766.8999155991)) 

LongitudePlusDistance

RETURN (SELECT @StartLongitude + SQRT(@Distance * @Distance/
    (4784.39411916406 * 
    COS(2 * @StartLatitude/114.591559026165) * 
    COS(2 * @StartLatitude/114.591559026165)))) 

Requête:

DECLARE @Longitude DECIMAL(18,8), 
     @Latitude DECIMAL(18,8), 
     @MinLongitude DECIMAL(18,8), 
     @MaxLongitude DECIMAL(18,8), 
     @MinLatitude DECIMAL(18,8), 
     @MaxLatitude DECIMAL(18,8), 
     @WithinMiles DECIMAL(2) 

Set @Latitude = -77.856052 
Set @Longitude = 40.799159 
Set @WithinMiles = 50 

-- Calculate the Max Lat/Long 
SELECT @MaxLongitude = dbo.LongitudePlusDistance(@Longitude, @Latitude, 
      @WithinMiles), 
     @MaxLatitude = dbo.LatitudePlusDistance(@Latitude, @WithinMiles) 

-- Calculate the min lat/long 
SELECT @MinLatitude = 2 * @Latitude - @MaxLatitude, 
     @MinLongitude = 2 * @Longitude - @MaxLongitude 

SELECT Top 20 *, dbo.CalculateDistance(@Longitude, @Latitude, 
    LocationLongitude, LocationLatitude) as 'Distance' 
FROM Location 
WHERE LocationLongitude Between @MinLongitude And @MaxLongitude 
     And LocationLatitude Between @MinLatitude And @MaxLatitude 
     And dbo.CalculateDistance(@Longitude, @Latitude, LocationLongitude, 
      LocationLatitude) <= @WithinMiles 
ORDER BY dbo.CalculateDistance(@Longitude, @Latitude, LocationLongitude, 
    LocationLatitude) 
+3

L'autre site vous est lié à partir de 1997, lorsque la Terre était beaucoup plus petite que ce qu'elle est aujourd'hui (en raison de la force centrifuge). J'irais avec Google sur celui-ci. :) – MusiGenesis

+0

Oui oui, le monde était beaucoup plus petit avant Google. Mais cela ne m'aide pas à arriver à la bonne distance. – Mikecancook

+0

J'ai trouvé un autre site pour calculer les résultats et c'est la même chose que j'ai eu, 21 miles et quelques changements. http://www.movable-type.co.uk/scripts/latlong.html essayer ces lieux: latitude/longitude 40,799159, -77,856052 40,22018, -78,140205 – Mikecancook

Répondre

2

Pourquoi vous @temp remise à zéro à 1 ou -1 dans votre fonction CalculateDistance?

Mise à jour. Ok, ne vous occupez jamais de ce qui précède. Êtes-vous sûr que votre latitude/longitude est correcte? J'ai les calculs suivants en utilisant geocoder.us:

10715 Downsville Pike Ste 100, 21740 retours (39.607483, -77.753747)

444 E College Ave Ste 120, 16801 retours (39.607483, -77.753747)

En utilisant vos formules (arrondi à 6 chiffres après la virgule comme c'est la précision renvoyée ci-dessus) vous obtenez ce qui suit:

sin(39.607483/57.295779) * sin(40.798594/57.295779) 
+ cos(39.607483/57.295779) * cos(40.798594/57.295779) 
* cos(77.753747/57.295779 - 77.856110/57.295779) = 0.99978299 

3958.75586574 * arccos(0.99978299) = 82.4748331 

ce qui semble raisonnable.

+0

Bonne question! J'ai dû chercher où je l'ai eu, qui est ici: http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/sql-server-code-zip-latitude-longitude-pr Il a été expliqué qu'il tolérait une erreur d'arrondi si le résultat était supérieur à 1 ou inférieur à -1. – Mikecancook

+0

Je me suis demandé quelle était la précision requise pour le faire avec précision. Je crois avoir lu quelque part que vous ne devriez utiliser que 6 points décimaux, mais l'explication n'a pas de sens et maintenant je ne peux pas trouver où je l'ai lu. J'ai utilisé Google pour faire mon géocodage. Les résultats semblent un peu contradictoires. Je ne suis pas sûr de savoir si l'incohérence est significative. – Mikecancook

+0

Ok, donc après quelques recherches, j'ai trouvé ce site: http://www.daftlogic.com/projects-google-maps-distance-calculator.htm - qui utilise l'API Google pour calculer la distance et il arrive .. ..drum roll .... 82.530! Donc, il semble que j'ai besoin de comprendre comment obtenir des codes géographiques plus précis. – Mikecancook