Question

J'ai passé quelques jours à essayer de résoudre celui-ci et je n'arrive pas à identifier les problèmes. J'ai une base de données SQL 2005 stockant la latitude et la longitude sous forme décimale (18,8), ce que j'ai reçu en interrogeant Google.

Pour ces deux emplacements: De: 10715 Downsville Pike Ste 100 MD 21740 à: 444 East College Ave Ste 120 State College PA, 16801

Étant donné que la distance sera "à vol d'oiseau", mes résultats sont encore bien loin. Dans cet exemple, mon résultat indique 21,32 miles, mais Google Maps indique 144 miles.

Je pense que le résultat qui le rend encore plus frustrant est que j'ai trouvé ce site: http://jan.ucc.nau.edu/~cvm/latlongdist.html et a obtenu presque les mêmes résultats que moi.

Voici mes fonctions et requêtes:

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

DistancePlusDistance

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)
Était-ce utile?

La solution

Pourquoi réinitialisez-vous @Temp sur 1 ou -1 dans votre fonction CalculateDistance?

Mettre à jour . Ok, peu importe ce qui précède. Êtes-vous sûr que votre latitude / longitude est correcte? J'ai calculé ce qui suit à l'aide de geocoder.us :

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

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

En utilisant vos formules (arrondies à 6 chiffres après le signe décimal, c'est la précision renvoyée ci-dessus), vous obtenez le texte suivant:

  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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top