我正在尝试构建查询,但我遇到了一些困难。
我有一个SQL Server 2008数据库,其中包含一个表,其中包含描述路段的地理字段。 (此数据已从美国人口普查的TIGER / Line数据中导入。)
我还有一个描述用户位置的固定点。我想在数据库中找到最接近的路段,但我似乎无法弄清楚如何实现这一目标。此外,我想在该段上找到最接近用户位置点的点。这就是我想要选择并在我的查询中返回的内容。
有没有人对地理/几何功能有任何经验可以帮助我?
谢谢!
答案 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)