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