Определить долготы и широты в пределах диапазона - PullRequest
1 голос
/ 13 октября 2010

У меня есть места в моей базе данных.Местоположение имеет атрибуты широты и долготы (взяты из карт Google, пример: 48.809591).Есть ли какой-нибудь запрос, который мог бы помочь мне найти местоположения в диапазоне другого местоположения?

Пример: у меня есть местоположение A с широтой = 48.809591 и долготой = 2.124009 и я хочу получить все объекты местоположения в моей базе данныхкоторые находятся в пределах 5 миль от местоположения A

Моя первая мысль состояла в том, чтобы найти местоположения в квадрате, где location.latitude A. latitude - 5 миль и местоположение.долгота A.longitude - 5 миль, а затем удалите несущественные местоположения из возвращенного массива с помощью чего-то вроде http://www.movable -type.co.uk / scripts/latlong.html

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 13 октября 2010

На всякий случай, если вы используете MySQL в качестве СУБД 1 , вас может заинтересовать следующая презентация:

Автор описывает, как вы можете использовать Формула Хаверсайна в MySQL, чтобы упорядочивать пространственные данные по близости и ограничивать результаты определенным радиусом. Более того, он также описывает, как избежать полного сканирования таблицы для таких запросов, используя традиционные индексы для столбцов широты и долготы.


1 Даже если это не так, это все равно интересно и применимо.
2 Существует также pdf-версия презентации.

0 голосов
/ 13 октября 2010

Вам потребуется функция расстояния.

Для SQL Server это будет выглядеть примерно так (обратите внимание, что расстояние в километрах),

    CREATE FUNCTION distance
    (
      @startLatitude float, 
      @startLongitude float, 
      @endLatitude float,
      @endLongitude float
    )
    RETURNS float
    AS
    BEGIN

      DECLARE @distance float;

      set @distance = 
        6371 * 2 * atn2(sqrt(power(sin(pi() / 180 * (@endLatitude - @startLatitude) / 2), 2) +
        power(cos(@startLatitude * pi() / 180), 2) *
        power(sin(pi() / 180 * (@endLongitude - @startLongitude) / 2), 2)),
        sqrt(1 - power(sin(pi() / 180 * (@endLatitude - @startLatitude) / 2), 2) +
        power(cos(@startLatitude * pi() / 180), 2) *
        power(sin(pi() / 180 * (@endLongitude - @startLongitude) / 2), 2)));
      RETURN @distance
    END
0 голосов
/ 13 октября 2010

Вычисление, которое вы хотите, я думаю, называется расстоянием большого круга:

http://en.wikipedia.org/wiki/Great-circle_distance

...