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)
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top