Como posso estender esta consulta SQL para encontrar os k vizinhos mais próximos?
Eu tenho um banco de dados cheio de dados bidimensionais - pontos em um mapa. Cada registro possui um campo do tipo de geometria. O que eu preciso fazer é passar um ponto para um procedimento armazenado que retorna ok pontos mais próximos (k também seria passado para o sproc, mas isso é fácil). Encontrei uma consulta emhttp://blogs.msdn.com/isaac/archive/2008/10/23/nearest-neighbors.aspx que fica com o vizinho mais próximo, mas não consigo descobrir como estendê-lo para encontrar ok vizinhos mais próximos.
Esta é a consulta atual -T
é a mesag
é o campo da geometria@x
é o ponto para pesquisar,Numbers
é uma tabela com números inteiros 1 an:
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
A consulta interna seleciona a região não vazia mais próxima e a consulta externa seleciona o resultado principal dessa região; a consulta externa pode ser facilmente alterada para (por exemplo)SELECT TOP(20)
, mas se a região mais próxima contiver apenas um resultado, você ficará preso a isso.
Eu acho que provavelmente preciso procurar recursivamente a primeira região que contémk registros, mas sem o uso de uma variável de tabela (o que causaria problemas de manutenção, pois você precisará criar a estrutura da tabela e poderá sofrer alterações - existem muitos campos), não consigo ver como.