我有一个应用程序,用户可以在其中选择一个位置并查看它与几个兴趣点(POI)的距离。
当我检索这些距离时,我还想检索下一个最接近的位置的ID,以及距离每个POI最远的位置的ID。例如。如果我们有10个位置,每个位置离我要返回的某个POI一英里远:POI的名称,与该POI的距离,下一个最近位置的ID以及下一个的ID最远的位置。结果集的示例行可以是:'足球场','1.5',24,784(因为我们正在观看的位置距离足球场1.5英里,位置24是下一个距离最近,784是下一个最远的距离
注意:我们正在查看的位置可能距离POI最近或最远,在这种情况下,我们需要返回-1作为下一个最近或最远位置的ID,让前端知道我们无法接近或进一步。
如果可能,我想在一个声明中这样做。我创建了一个函数来计算2点之间的距离,并在应用程序周围使用它:
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。
提前致谢。
克里斯
答案 0 :(得分:1)
我处理这个问题的方法是返回一个相对于POI的有序位置集。根据您的应用程序,您可以将其限制为仅前N个项目或X距离。如果限制到某个数字,那么知道有多少项目可以知道是否应该表明有更多可用的内容会很方便。不幸的是,我不知道如何在一个查询中完成所有这些操作。
我的目标是在用户做出选择的页面上存储所选兴趣点的名称,id,lat和long(1个查询)。然后我会将这些传递回服务器并在第二个查询中使用它们(以获取有序列表)。如果有必要,我会执行第三个查询,以查明有多少项目(计数(*)),以查看是否需要提供“更多项目”链接。
第二个查询可能如下所示:
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
从用户的选择中传入所选参数。