【问题标题】:SQL Server Geography datatype nearest point on lineSQL Server 地理数据类型最近点在线
【发布时间】:2010-01-09 23:04:54
【问题描述】:

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

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

我有另一个固定点来描述用户的位置。我想在数据库中找到离该点最近的路段,但我似乎不知道如何完成此操作。此外,我想找到该段上与用户位置点最近的点。这就是我想要选择并在查询中返回的内容。

有人对地理/几何功能有帮助吗?

谢谢!

【问题讨论】:

  • 您可能想要添加一些字段类型信息。例如,您有一个固定点来描述用户的位置,这是一个经纬度坐标对吗?我有地理功能的经验,但需要更多细节......
  • 我从我的应用程序中提供了这个,所以我传入了一个参数。我几乎可以接受任何必要的数据类型。

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


【解决方案1】:

您可以将对象存储在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

【讨论】:

  • 我想我在 StackOverflow 上遇到过的最佳答案。感谢您让我知道不只是 ORDER BY,这可能是我最终会实施的。
  • 嗨。我不确定@Pure Krome 是否知道,但我似乎无法理解。 将我的查询交叉应用到@myPoints ??我不明白:(你能更新你的答案吗???
  • 很好的答案,但没有回答整个 OP 问题。一旦你有了最近的道路,那条道路上最接近该点的点是什么?
  • 刚找到这个blogs.msdn.com/b/edkatibah/archive/2010/11/19/…,它会给你这个。
【解决方案2】:

【讨论】:

  • 段存储在 Geography 数据类型中。
猜你喜欢
  • 1970-01-01
  • 2013-01-19
  • 2022-01-17
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多