Distanza tra due posizioni usando Latitudine e Longitudine lontano da ciò che dice Google
-
05-07-2019 - |
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)
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.