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)