SQL Server Geography数据类型最接近点

Dav*_*fer 10 sql t-sql sql-server gis sql-server-2008

我正在尝试构建一个查询,但我遇到了一些困难.

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

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

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

谢谢!

Qua*_*noi 18

您可以将对象存储在GEOGRAPHY列中并SPATIAL INDEX在此列上创建.

不幸的是,SQL Server通过平铺表面并将tile标识符存储在普通B-Tree索引中来实现空间索引,因此plain 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
Run Code Online (Sandbox Code Playgroud)

这样,每次使用索引时,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
Run Code Online (Sandbox Code Playgroud)

  • 我认为我在StackOverflow上遇到过的最佳答案.感谢让我知道不仅仅是'ORDER BY`,这可能是我最终要实现的. (2认同)