我试图建立查询,但遇到了一些困难。1 j+ t5 F: E/ Z& [ O6 p
我有一个SQL Server 2008数据库的表除了其他字段外,还包含描述路段的地理字段。(这些数据已经从美国人口普查中获得TIGER /4 o, A4 z: G" x# I0 F I7 z* @
Line导入数据。0 k! P5 W: s( {& a; L4 T
我还有一个固定点来描述用户的位置。我想在数据库中找到最接近这一点的路段,但我似乎不知道如何完成它。此外,我想在这一段中找到最接近用户位置点的点。这是我想选择的,并返回到我的查询中。 # J8 d; t9 m( `* x4 {有没有人对地理/几何功能有任何吗?) f/ x; N* L' l8 c7 I+ z
谢谢!) G$ m" W, N) W& C* A$ c$ b! G# |
" G2 b% D: B' x2 H% I6 m- F解决方案: 3 x! M: u2 ?' h2 g' c- t/ ~ 您可以存储对象GEOGRAPHY列出并在列出中创建对象SPATIAL INDEX。 4 w" Y% T- b! O5 z) l不幸的是,SQL Server通过平铺表面存储图块标志符B-Tree空间索引是在索引中实现的,所以很普通ORDER BYSTDistance不起作用(嗯,它会起作用,但不会使用索引)。. R' U9 l2 ?) @7 E! }
相反,您必须进行类似的查询: 3 Q; `2 Y) [# j; h i2 _DECLARE @mypoint GEOGRAPHYSET @mypoint = geography::STGeomFromText('POINT(@mylat,@mylon)',4326);WITH num (distance) AS SELECT UNION ALL SELECT distance FROM num WHERE distance 这样,每次使用索引,SQL Server先搜索1公里以内的道路,再搜索2公里以内的道路等。 6 c5 x$ v% C6 i+ I更新: / k% L! _; i) h" S0 R如果您在表中有多个点,并希望找到每个点的最接近点,请执行以下操作: 1 J' {* K6 c- W% F9 Z* U+ ~! BWITH num (distance) AS SELECT UNION ALL SELECT distance FROM num WHERE distance <= SELECT mp.mypoint,m.*FROM @mypoints mpCROSS 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