У меня есть приложение, в котором пользователь может выбрать местоположение и просмотреть его расстояние от нескольких точек интереса (POI).
Когда я получаю эти расстояния, я также хотел бы получить идентификаторы местоположений, которые являются ближайшими и ближайшими от каждой точки интереса. например. Если у нас есть 10 местоположений, каждое из которых находится в миле от определенного POI, которое я хотел бы вернуть: название POI, расстояние от этого POI, идентификатор ближайшего ближайшего местоположения и идентификатор следующего самое дальнее место. Пример строки набора результатов может быть следующим: «Футбольное поле», «1,5», 24, 784 (поскольку место, которое мы просматриваем, находится в 1,5 милях от футбольного поля, а место 24 - ближайшее, а 784 - дальше всего. .
Примечание. Вполне возможно, что местоположение, которое мы просматриваем, является ближайшим или наиболее удаленным от POI, в этом случае нам потребуется вернуть -1 в качестве идентификатора ближайшего ближайшего или самого дальнего местоположения, чтобы сообщить интерфейсному лицу что мы не можем подойти ближе или дальше.
Я хотел бы сделать это в одном утверждении, если это возможно. Я создал функцию, которая будет вычислять расстояние между двумя точками, и использовал ее вокруг приложения:
create FUNCTION [dbo].[fnc_calc_distance]
(
@lat1 as float,
@lng1 as float,
@lat2 as float,
@lng2 as float
)
RETURNS float
AS
BEGIN
declare @result as float
select @result = (3959*acos(cos(radians(@lat2))*cos(radians(@lat1))*cos(radians(@lng1)-radians(@lng2))+sin(radians(@lat2))*sin(radians(@lat1))))
RETURN @result
END
И примеры структур / данных таблицы:
CREATE TABLE tbl_locations(
[houseID] [int] NOT NULL,
[lat] [decimal](14, 10) not NULL,
[lng] [decimal](14, 10) not NULL)
insert into tbl_locations
values (1, 54.9834400000, -1.6314250000)
insert into tbl_locations
values (2, 54.9860420000, -1.5912680000)
insert into tbl_locations
values (3, 54.9882050000, -1.5707710000)
CREATE TABLE tbl_poi(
[ID] [int] NOT NULL,
[name] [varchar](32) NOT NULL,
[lat] [decimal](14, 10) NOT NULL,
[lng] [decimal](14, 10) NOT NULL)
insert into tbl_poi
values (1, 'Football Ground', 54.9752430000, -1.6219210000)
insert into tbl_poi
values (1, 'Train Station', 54.9898610000, -1.6047600000)
Я использую SQL Server 2008.
Заранее спасибо.
Chris