2011-09-20 40 views
6

Tenemos una tabla con lugares y sus latitudes y longitudes.Distancia de retorno entre dos ubicaciones en SQL Server 2008 usando latitud y longitud

Estamos intentando crear una función en SQL Server 2008 para listar lugares dentro de los siguientes 25 kilómetros utilizando una latitud y longitud específica como punto central.

Andaba yo si esto es una buena manera de empezar y probar nuestra función y conseguir la distancia actual entre un punto central (ubicación actual) y una ubicación de destino (@ latitud/@ longitud):

ALTER FUNCTION [dbo].[GetDistanceFromLocation] 
( 
    @myCurrentLatitude float, 
    @myCurrentLongitude float, 
    @latitude float, 
    @longitude float 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @radiusOfTheEarth int 
    SET @radiusOfTheEarth = 6371--km 

    DECLARE @distance int 
    SELECT @distance = (@radiusOfTheEarth 
     * acos(cos(radians(@myCurrentLatitude)) 
     * cos(radians(@latitude)) 
     * cos(radians(@longitude) - radians(@myCurrentLongitude)) + sin(radians(@myCurrentLatitude)) 
     * sin(radians(@latitude)))) 

    RETURN @distance 

END 

¿Es correcto o nos falta algo?

Respuesta

11

Parece que está utilizando la fórmula great-circle distance, que probablemente sea lo suficientemente precisa para usted, aunque tendrá que ser el juez de eso.

Si desea comprobar los resultados de su fórmula, se puede utilizar el tipo de datos geography:

declare @geo1 geography = geography::Point(@lat1, @long1, 4326), 
     @geo2 geography = geography::Point(@lat2, @long2, 4326) 

select @geo1.STDistance(@geo2) 

y puesto que usted está haciendo un proximity search, es posible que desee investigar los datos geography tipo adicional.

+0

¿Qué es 4326? Traté de ver MSDN pero no tengo información al respecto. –

+0

4326 es la ID de referencia espacial para el sistema de referencia World Geodetic. Para obtener más información, consulte http://technet.microsoft.com/en-us/library/bb933811.aspx http://en.wikipedia.org/wiki/SRID y http://en.wikipedia.org/wiki/WGS84. –

0

¿Sería esto válido?

CREATE FUNCTION [dbo].[GetDistanceFromLocation] 
( 
    @CurrentLatitude float, 
    @CurrentLongitude float, 
    @latitude float, 
    @longitude float 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @geo1 geography = geography::Point(@lat1, @long1, 4268), 
      @geo2 geography = geography::Point(@lat2, @long2, 4268) 

    DECLARE @distance int 
    SELECT @distance = @geo1.STDistance(@geo2) 

    RETURN @distance 

END 

Gracias!

+0

¡Bienvenido a Stack Overflow! Esto es realmente un comentario, no una respuesta. Con un poco más de repetición, [podrá publicar comentarios] (// stackoverflow.com/privileges/comment). Estoy marcando esta publicación para su eliminación. –

Cuestiones relacionadas