Возвратите расстояние между двумя местоположениями в SQL Server 2008, используя широту и долготу - PullRequest
6 голосов
/ 20 сентября 2011

У нас есть таблица с местами и их широтой и долготой.

Мы пытаемся создать функцию в SQL Server 2008 для перечисления мест в течение следующих 25 километров, используя определенную широту и долготу в качестве центральной точки.

Я бродил, если это хороший способ запустить и проверить нашу функцию и получить текущее расстояние между центральной точкой (текущее местоположение) и целевым местоположением (@ широта / @ долгота):

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

Это правильно или мы что-то упустили?

Ответы [ 2 ]

11 голосов
/ 20 сентября 2011

Похоже, вы используете формулу расстояние по большому кругу , которая, вероятно, достаточно точна для вас, хотя вам придется судить об этом.

Если вы хотите проверить результаты своей формулы, вы можете использовать geography тип данных:

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

select @geo1.STDistance(@geo2)

и, поскольку вы выполняете поиск по близости , возможно, вы захотите продолжить исследование типа данных geography.

0 голосов
/ 18 августа 2015

Будет ли это действительным?

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

Спасибо!

...