У меня есть база данных, полная двумерных данных - точек на карте. Каждая запись имеет поле типа геометрии. Что мне нужно сделать, это передать точку хранимой процедуре, которая возвращает k ближайших точек (k также будет передано sproc, но это легко). Я нашел запрос на http://blogs.msdn.com/isaac/archive/2008/10/23/nearest-neighbors.aspx, который получает единственного ближайшего соседа, но я не могу понять, как его расширить, чтобы найти k ближайших соседей.
Это текущий запрос - T
- это таблица, g
- это геометрическое поле, @x
- это точка для поиска, Numbers
- это таблица с целыми числами от 1 до n * 1014. *:
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 записей, но без использования табличной переменной (что может вызвать проблемы с обслуживанием, так как вам придется создать структуру таблицы и ее можно изменить - там много полей), я не вижу, как.