回答

收藏

SQL Server最接近在线点的地理数据类型

技术问答 技术问答 309 人阅读 | 0 人回复 | 2023-09-14

我试图建立查询,但遇到了一些困难。( |/ z6 F9 P* t2 B7 d: @3 f
我有一个SQL Server 2008数据库的表除了其他字段外,还包含描述路段的地理字段。(这些数据已经从美国人口普查中获得TIGER /% I" N/ d; e" }" w6 P7 N# l
Line导入数据。1 P& \  X; ^7 R) v6 I" M( ~' b
我还有一个固定点来描述用户的位置。我想在数据库中找到最接近这一点的路段,但我似乎不知道如何完成它。此外,我想在这一段中找到最接近用户位置点的点。这是我想选择的,并返回到我的查询中。
: B. q( c* y/ O( Q$ i有没有人对地理/几何功能有任何吗?
  V3 t( m: O2 q( q谢谢!* b8 x& {- ], z" G# C) g) c6 E: o
                                                                2 N1 Z2 a, X+ \1 u! N5 t
    解决方案:                                                               
% d! y# R4 i& }4 p, Y/ e                                                                您可以存储对象GEOGRAPHY列出并在列出中创建对象SPATIAL INDEX。4 ~) b7 O5 |4 r( d3 G
不幸的是,SQL Server通过平铺表面存储图块标志符B-Tree空间索引是在索引中实现的,所以很普通ORDER BYSTDistance不起作用(嗯,它会起作用,但不会使用索引)。8 I" W3 M: ?6 {3 f9 @; u
相反,您必须进行类似的查询:/ p. a& J1 o8 E% w, {) c
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公里以内的道路等。
& J' X" ^: [9 H& [1 @更新:, u  C& j8 ~+ L* }* u4 {$ U4 P
如果您在表中有多个点,并希望找到每个点的最接近点,请执行以下操作:
2 [/ D6 F9 j$ j- h* G1 DWITH    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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则