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

时间:2010-01-09 23:04:54

标签: sql sql-server tsql sql-server-2008 gis

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

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:18)

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

不幸的是,SQL Server通过平铺表面并将切片标识符存储在普通B-Tree索引中来实现空间索引,因此普通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

这样,每次使用索引时,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

答案 1 :(得分:-1)