我试图建立查询,但遇到了一些困难。& Y& t9 Q7 o( i3 g
我有一个SQL Server 2008数据库的表除了其他字段外,还包含描述路段的地理字段。(这些数据已经从美国人口普查中获得TIGER / r7 _) Y4 o6 `) Q4 e HLine导入数据。 " n E# k7 [. [$ |( ?: D% E我还有一个固定点来描述用户的位置。我想在数据库中找到最接近这一点的路段,但我似乎不知道如何完成它。此外,我想在这一段中找到最接近用户位置点的点。这是我想选择的,并返回到我的查询中。 . K) R2 H) `- [8 @& E( m- n, S f有没有人对地理/几何功能有任何吗?7 y' s& Q, i0 S; B. k6 O" Q- K
谢谢! ( W* n. L6 Z+ U, R& ^2 _ 5 N* R- n8 F* z E9 Y K 解决方案: 0 `2 u" X: D. R, F 您可以存储对象GEOGRAPHY列出并在列出中创建对象SPATIAL INDEX。( C1 D! t) ] L8 r5 [; r
不幸的是,SQL Server通过平铺表面存储图块标志符B-Tree空间索引是在索引中实现的,所以很普通ORDER BYSTDistance不起作用(嗯,它会起作用,但不会使用索引)。- x& ~( j3 J5 n. O
相反,您必须进行类似的查询: ' ?( C8 y0 {: R/ ]3 iDECLARE @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公里以内的道路等。 ! a; p1 ~3 r* L& I F0 F+ K' U更新: 9 ]' K# L# R6 ?5 ?9 @如果您在表中有多个点,并希望找到每个点的最接近点,请执行以下操作: : d$ K2 _% V/ T# i) m' F4 K/ @3 gWITH 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