Получить идентификатор ближайшего ближайшего местоположения - PullRequest
0 голосов
/ 10 января 2010

У меня есть приложение, в котором пользователь может выбрать местоположение и просмотреть его расстояние от нескольких точек интереса (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

1 Ответ

1 голос
/ 10 января 2010

Я бы справился с этим, чтобы вернуть упорядоченный набор местоположений относительно POI. В зависимости от вашего приложения вы можете ограничить это только первыми N элементами или в пределах X расстояния. Если ограничение ограничено определенным числом, тогда было бы полезно узнать, сколько предметов существует, чтобы знать, следует ли указывать, что доступно больше. К сожалению, я не знаю, как сделать все это в одном запросе.

Моя задача - сохранить имя, id, lat и long выбранной точки интереса на странице, где пользователь делает выбор (1 запрос). Затем я передаю их обратно на сервер и использую их во втором запросе (чтобы получить упорядоченный список). При необходимости я выполнил бы третий запрос, чтобы узнать, сколько всего элементов (count (*)), чтобы узнать, нужно ли мне предоставить ссылку «more items».

Второй запрос может выглядеть так:

 select TOP 10 t.id, t.name, t.lat, t.long, t.distance
 from (select id, name, lat, long, fnc_calc_distance(lat,@house_lat,long,@house_long) as distance
       from tbl_poi) t
 order by t.distance desc

, где вы передаете выбранные параметры из выбора пользователя.

...