我试图建立查询,但遇到了一些困难。7 R( e7 v4 M; F# }# E5 i) u
我有一个SQL Server 2008数据库的表除了其他字段外,还包含描述路段的地理字段。(这些数据已经从美国人口普查中获得TIGER / + X. N F) O4 P/ m: V# CLine导入数据。! e7 b2 Q) A6 D4 _$ }1 h/ D4 o. ^* m- i
我还有一个固定点来描述用户的位置。我想在数据库中找到最接近这一点的路段,但我似乎不知道如何完成它。此外,我想在这一段中找到最接近用户位置点的点。这是我想选择的,并返回到我的查询中。2 M1 w8 Z6 [) M/ A
有没有人对地理/几何功能有任何吗? ( w) b$ ^# v+ l' h谢谢!5 `. E9 T* B0 r5 V9 t: g
0 C" M, F$ a! i解决方案: " F5 f6 `# M6 }
您可以存储对象GEOGRAPHY列出并在列出中创建对象SPATIAL INDEX。 ( m9 D/ H$ B, b% j不幸的是,SQL Server通过平铺表面存储图块标志符B-Tree空间索引是在索引中实现的,所以很普通ORDER BYSTDistance不起作用(嗯,它会起作用,但不会使用索引)。 2 I3 X9 ^. P( i" o T o相反,您必须进行类似的查询: 8 [; v; X3 x3 `6 V$ tDECLARE @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公里以内的道路等。 E$ f9 ^" v0 v' q& `1 t* W9 r0 B更新: 6 ~+ G/ G/ Q) t0 q如果您在表中有多个点,并希望找到每个点的最接近点,请执行以下操作:5 E, _: `, ~4 q. Y5 T/ u; K
WITH 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