我有一个数据库,里面装满了二维数据——地图上的点。每个记录都有一个几何类型的字段。我需要能够将一个点传递给存储过程,该存储过程返回最近的k个点(k也将传递给存储过程,但这很容易)。我在http://blogs.msdn.com/isaac/archive/2008/10/23/nearest-neighbors.aspx找到了一个查询,可以获得单个最近的邻居,但我不知道如何扩展它以找到k个最近的邻居。
这是当前的查询 -
内部查询选择最近的非空区域,外部查询从该区域中选择顶部结果;外部查询可以轻松更改为(例如)
这是当前的查询 -
T
是表,g
是几何字段,@x
是要搜索周围的点,Numbers
是包含1到n的整数的表: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条记录的第一个区域,但是如果不使用表变量(这会导致维护问题,因为您必须创建表结构并且它容易更改 - 有很多字段),我看不到如何实现。