SQL Select: туалеты в пределах 50 км от определенной позиции? - PullRequest
2 голосов
/ 05 июня 2011

Мне нужно найти туалеты вокруг меня, скажем, в пределах 50 км, и у меня есть позиция по широте и долготе, туалеты в базе данных выглядят так:

Toilet ID (primary)
Address
Latitude
Longitude

my location: my_lat, my_lon

возможно ли построить оператор, который возвращает все туалеты в пределах 50 км от (my_lat, my_lon)? Что-то вроде

select * from ToiletTable where 
  SQRT((Latitude - my_lat)^2 + (Longitude - my_lon)^2) < 50

Спасибо!

Ответы [ 2 ]

1 голос
/ 05 июня 2011

Вы ищете формула Haversine

Вот две полные реализации, одна в SQL: Реализация Haversine

EDIT:

Вот реализация Haversine UDF в SQLite .К сожалению, это против iPhone, но, по крайней мере, у вас есть именно то, что вам нужно.Теперь вам просто нужно определить, как его подключить.

SQL встроен ниже

CREATE FUNCTION [dbo].[GetDistance]

(
  @lat1 Float(8),
  @long1 Float(8),
  @lat2 Float(8),
  @long2 Float(8)
)
RETURNS Float(8)
AS
BEGIN
  DECLARE @R Float(8);
  DECLARE @dLat Float(8);
  DECLARE @dLon Float(8);
  DECLARE @a Float(8);
  DECLARE @c Float(8);
  DECLARE @d Float(8);
  SET @R = 6371; --This value is 6371 for kilometers, 3960 for miles.
  SET @dLat = RADIANS(@lat2 - @lat1);
  SET @dLon = RADIANS(@long2 - @long1);
  SET @a = SIN(@dLat / 2) * SIN(@dLat / 2) + COS(RADIANS(@lat1))
                    * COS(RADIANS(@lat2)) * SIN(@dLon / 2) * SIN(@dLon / 2);
  SET @c = 2 * ASIN(MIN(SQRT(@a)));
  SET @d = @R * @c;
  RETURN @d;
END
GO
0 голосов
/ 27 марта 2012

Если вы не находитесь в полярных или тихоокеанских регионах, я бы использовал:

where pow(2*(latitude - ?), 2) + pow(longitude - ?, 2) < distance
...