2011-09-20 17 views
6

Abbiamo una tabella con i luoghi e le loro latitudini e longitudini.Distanza di ritorno tra due posizioni in SQL Server 2008 utilizzando latitudine e longitudine

Stiamo cercando di creare una funzione in SQL Server 2008 per elencare i luoghi nei prossimi 25 chilometri utilizzando una latitudine e una longitudine specifiche come punto centrale.

mi aggiravo se questo è un buon modo per iniziare e testare la nostra funzione e ottenere la distanza corrente tra un punto centrale (posizione corrente) e una posizione di destinazione (@ latitudine/@ longitudine):

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 

È corretto o ci manca qualcosa?

risposta

11

Sembra che tu stia usando la formula great-circle distance, che è probabilmente abbastanza accurata per te, anche se dovrai essere il giudice di ciò.

Se si desidera controllare i risultati del vostro formula, è possibile utilizzare il tipo di dati geography:

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

select @geo1.STDistance(@geo2) 

e dal momento che si sta facendo un proximity search, si potrebbe voler indagare tipo ulteriormente i dati geography.

+0

Che cos'è 4326? Ho provato a vedere MSDN ma non ho alcuna informazione a riguardo. –

+0

4326 è l'ID di riferimento spaziale per il sistema di riferimento geodetico mondiale. Per ulteriori informazioni consultare http://technet.microsoft.com/en-us/library/bb933811.aspx http://en.wikipedia.org/wiki/SRID e http://en.wikipedia.org/wiki/WGS84 –

0

Questo sarebbe valido?

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 

Grazie!

+0

Benvenuto in Stack Overflow! Questo è davvero un commento, non una risposta. Con un po 'più di ripetizione, [sarai in grado di postare commenti] (// stackoverflow.com/privileges/comment). Sto segnalando questo post per la cancellazione. –

Problemi correlati