【发布时间】:2011-02-01 03:37:23
【问题描述】:
我有一个充满二维数据的数据库 - 地图上的点。每条记录都有一个几何类型的字段。我需要做的是将一个点传递给一个存储过程,该过程返回 k 最近的点(k 也将传递给存储过程,但这很容易)。我在http://blogs.msdn.com/isaac/archive/2008/10/23/nearest-neighbors.aspx 找到了一个查询,它获取了一个最近的邻居,但我不知道如何扩展它以找到 k 个最近的邻居。
这是当前查询 - T 是表,g 是几何字段,@x 是要搜索的点,Numbers 是整数 1 到 n em>:
DECLARE @start FLOAT = 1000;
WITH NearestPoints AS
(
SELECT TOP(1) WITH TIES *, T.g.STDistance(@x) AS dist
FROM Numbers JOIN T WITH(INDEX(spatial_index))
ON T.g.STDistance(@x) < @start*POWER(2,Numbers.n)
ORDER BY n
)
SELECT TOP(1) * FROM NearestPoints
ORDER BY n, dist
内部查询选择最近的非空区域,外部查询然后选择该区域的顶部结果;外部查询可以很容易地更改为(例如)SELECT TOP(20),但如果最近的区域只包含一个结果,你就会被困住。
我想我可能需要递归搜索包含 k 记录的第一个区域,但不使用表变量(这会导致维护问题,因为您必须创建表结构并且它很容易改变 - 有很多字段),我看不出如何。
【问题讨论】:
-
查找k条记录时,将INNER查询更改为TOP(1)以上对结果有什么影响? (当最近的区域只包含一个结果时)
-
如果您更改内部查询以选择更多区域,您可以获得更多结果,但这并不能保证更多结果:其他区域可能只包含相同的单个结果(它们的大小呈指数增长) - 例如想象一下在附近有一个点但周围数百公里没有其他点的点周围搜索 - 前 n 个区域将只包含相同的 1 个点。
-
是否找到了有效的解决方案?我正在寻找相同的解决方案。
标签: sql sql-server-2008 geospatial nearest-neighbor