Domanda

Ho trascorso alcuni giorni a cercare di capirlo e non riesco a individuare i problemi. Ho un database SQL 2005 che memorizza latitudine e longitudine come Decimale (18,8), tutto ciò che ho ricevuto interrogando Google.

Per queste due località: Da: 10715 Downsville Pike Ste 100 MD 21740 a: 444 East College Ave Ste 120 State College PA, 16801

Tenendo conto che la distanza sarà "in linea d'aria", i miei risultati sono ancora lontani. In questo esempio il mio risultato dice 21.32 miglia, ma Google Maps dice 144 miglia.

Penso che il topping che lo rende ancora più frustrante sia che ho trovato questo sito: http://jan.ucc.nau.edu/~cvm/latlongdist.html e ha prodotto quasi gli stessi risultati.

Ecco le mie funzioni e query:

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

Domanda:

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)
È stato utile?

Soluzione

Perché reimposta @Temp su 1 o -1 nella funzione CalculateDistance?

Aggiorna . Ok, non importa quanto sopra. Sei sicuro che la tua latitudine / longitudine sia corretta? Ho calcolato quanto segue usando geocoder.us :

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

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

Usando le tue formule (arrotondate a 6 cifre dopo il punto decimale poiché questa è la precisione restituita sopra) ottieni quanto segue:

  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

che sembra ragionevole.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top