2010-01-09 16 views
10

我想构建一个查询,但我有一些困难。SQL Server地理数据类型最近点在线

我有一个SQL Server 2008数据库,其中包含一个表格,其中包括描述道路段的地理字段。 (这些数据是从美国人口普查的TIGER/Line数据导入的。)

我有另一个固定点来描述用户的位置。我想在数据库中找到最接近的路段,但我似乎无法弄清楚如何实现这一点。此外,我想找到该段最近的点到用户位置点。这是我想要选择并返回到我的查询中。

有没有人有任何地理/几何功能的经验可以帮助我?

谢谢!

+0

您可能要添加一些字段类型的信息。例如,您有一个固定点来描述用户的位置,这是一个经度和纬度坐标对吗?我有地理功能的经验,但需要更多细节... – Sparky 2010-01-09 23:22:10

+0

我从我的应用程序提供这个,所以我传递了一个参数。我很好,几乎所有的数据类型是必要的。 – 2010-01-09 23:49:08

回答

18

可以存储在GEOGRAPHY列的对象,并在创建SPATIAL INDEX本专栏。

不幸的是,SQL Server通过平铺表面并存储在一个普通B-Tree索引瓦片识别符实现空间索引,所以普通ORDER BY STDistance将无法​​正常工作(当然,它可以工作,但将不使用索引)。

相反,你必须进行查询与此类似:

DECLARE @mypoint GEOGRAPHY 
SET @mypoint = geography::STGeomFromText('POINT(@mylat, @mylon)', 4326); 

WITH num (distance) AS 
     (
     SELECT 1000 
     UNION ALL 
     SELECT distance + 1000 
     FROM num 
     WHERE distance <= 50000 
     ) 
SELECT TOP 1 m.* 
FROM num 
CROSS APPLY 
     (
     SELECT TOP 1 * 
     FROM mytable 
     WHERE myroad.STDistance(@mypoint) <= distance 
     ORDER BY 
       STDistance(@mypoint) 
     ) m 

这样,SQL Server将首先搜索1公里内的道路,从你的观点,那么内2公里等,每次使用索引。

更新:

如果表中有多个点,并希望找到为他们每个人的最近点:

WITH num (distance) AS 
     (
     SELECT 1000 
     UNION ALL 
     SELECT distance + 1000 
     FROM num 
     WHERE distance <= 50000 
     ) 
SELECT mp.mypoint, m.* 
FROM @mypoints mp 
CROSS APPLY 
     (
     SELECT TOP 1 m.* 
     FROM num 
     CROSS APPLY 
       (
       SELECT TOP 1 * 
       FROM mytable 
       WHERE myroad.STDistance(@mypoint) <= distance 
       ORDER BY 
         STDistance(@mypoint) 
       ) m 
     ) m 
+2

最佳答案我认为我曾经遇到过StackOverflow。感谢让我知道不只是'ORDER BY',这可能是我最终实现的。 – 2010-01-10 16:05:52

+0

@Pure:只是将我的查询应用于'@ mypoints' – Quassnoi 2011-06-30 09:34:36

+0

嗨。我不确定@Pure Krome是否知道,但我似乎无法得到它。 *交叉将我的查询应用于@ myPoints * ??我不明白:(你可以请更新你的答案,请??? – RPM1984 2011-07-01 01:10:55