2010-01-10 4 views
0

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

Когда я получаю эти расстояния, я также хотел бы получить идентификаторы местоположений ближайших ближайших и ближайших от каждой POI. например. Если у нас 10 мест, каждая из них находится в миле от определенной POI, которую я бы хотел вернуть: имя POI, расстояние от этой POI, идентификатор ближайшего ближайшего местоположения и идентификатор следующего самое далекое место. Примерной строкой результирующего набора может быть: «Футбольная площадка», «1,5», 24, 784 (потому что место, которое мы просматриваем, находится в 1,5 милях от футбольной площадки, а местонахождение 24 является ближайшим ближайшим, а 784 - самым дальним

Примечание: возможно, что местоположение, которое мы просматриваем, находится ближе всего ближе или ближе к POI, в этом случае нам нужно будет вернуть -1 в качестве идентификатора следующего ближайшего или самого дальнего местоположения, чтобы позволить фронту end, что мы не можем приблизиться или дальше.

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

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.

Спасибо заранее.

Крис

ответ

1

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

Моей личностью было бы сохранить имя, идентификатор, лат и длинную выбранную точку интереса на странице, где пользователь делает выбор (1 запрос). Затем я передам их обратно на сервер и использую их во втором запросе (чтобы получить упорядоченный список). Если необходимо, я бы выполнил третий запрос, чтобы узнать, сколько всего элементов было (count (*)), чтобы увидеть, нужно ли мне предоставить ссылку «больше элементов».

Второй запрос может выглядеть следующим образом:

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 

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

+0

Спасибо. Именно так я работаю в данный момент, когда сначала извлекается список POI и расстояний, затем я повторяю результаты, чтобы получить следующие ближайшие и самые удаленные местоположения по одному. Я хотел бы попробовать и заставить его работать за один раз. – 2010-01-10 16:32:26