La distancia entre dos ubicaciones utilizando la latitud y la longitud es lo que Google dice
-
05-07-2019 - |
Pregunta
He pasado unos días tratando de resolver esto y parece que no puedo identificar los problemas. Tengo una base de datos SQL 2005 que almacena la latitud y la longitud como Decimal (18,8), todas las cuales recibí al consultar a Google.
Para estas dos ubicaciones: Desde: 10715 Downsville Pike Ste 100 MD 21740 a: 444 East College Ave Ste 120 State College PA, 16801
Teniendo en cuenta que la distancia será "a vuelo de pájaro", mis resultados todavía están muy lejos. En este ejemplo, mi resultado dice 21.32 millas, pero Google Maps dice 144 millas.
Creo que lo mejor que lo hace aún más frustrante es que encontré este sitio: http://jan.ucc.nau.edu/~cvm/latlongdist.html y obtuve casi los mismos resultados que yo.
Aquí están mis funciones y consulta:
Funciones: 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))))
Consulta:
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)
Solución
¿Por qué restablece @Temp a 1 o -1 en su función CalculateDistance?
Actualizar . Ok, no importa lo anterior. ¿Estás seguro de que tu latitud / longitud son correctas? He calculado lo siguiente utilizando geocoder.us :
10715 Downsville Pike Ste 100, 21740 devoluciones (39.607483, -77.753747)
444 E College Ave Ste 120 , 16801 devuelve (39.607483, -77.753747)
Al usar sus fórmulas (redondeadas a 6 dígitos después del punto decimal, ya que esa es la precisión que se muestra más arriba), obtiene lo siguiente:
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
que parece razonable.