我想构建一个查询,但我有一些困难。SQL Server地理数据类型最近点在线
我有一个SQL Server 2008数据库,其中包含一个表格,其中包括描述道路段的地理字段。 (这些数据是从美国人口普查的TIGER/Line数据导入的。)
我有另一个固定点来描述用户的位置。我想在数据库中找到最接近的路段,但我似乎无法弄清楚如何实现这一点。此外,我想找到该段最近的点到用户位置点。这是我想要选择并返回到我的查询中。
有没有人有任何地理/几何功能的经验可以帮助我?
谢谢!
我想构建一个查询,但我有一些困难。SQL Server地理数据类型最近点在线
我有一个SQL Server 2008数据库,其中包含一个表格,其中包括描述道路段的地理字段。 (这些数据是从美国人口普查的TIGER/Line数据导入的。)
我有另一个固定点来描述用户的位置。我想在数据库中找到最接近的路段,但我似乎无法弄清楚如何实现这一点。此外,我想找到该段最近的点到用户位置点。这是我想要选择并返回到我的查询中。
有没有人有任何地理/几何功能的经验可以帮助我?
谢谢!
可以存储在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
您的路段如何存储?拉特和长?如果是的话,你可以将它们转换为弧度,和做数学题:
分段存储在地理数据类型中。 – 2010-01-10 00:45:10
您可能要添加一些字段类型的信息。例如,您有一个固定点来描述用户的位置,这是一个经度和纬度坐标对吗?我有地理功能的经验,但需要更多细节... – Sparky 2010-01-09 23:22:10
我从我的应用程序提供这个,所以我传递了一个参数。我很好,几乎所有的数据类型是必要的。 – 2010-01-09 23:49:08