Tengo una base de datos llena de datos bidimensionales: puntos en un mapa. Cada registro tiene un campo del tipo de geometría. Lo que usted debe ser capaz de hacer es pasar un punto a un procedimiento almacenado que devuelve los k puntos más cercanos (k también se pasa al procedimiento almacenado, pero eso es fácil). He encontrado una consulta en la que recibe el http://blogs.msdn.com/isaac/archive/2008/10/23/nearest-neighbors.aspx solo vecino más cercano, pero no puedo imaginar cómo extender para encontrar los k vecinos más cercanos.¿Cómo puedo extender esta consulta SQL para encontrar los k vecinos más cercanos?
Ésta es la consulta actual - T
es la tabla, g
es el campo de la geometría, @x
es el punto que buscar alrededor, Numbers
es una tabla con los enteros del 1 al 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
El interior consulta selecciona la región no vacía más cercana y la consulta externa luego selecciona el resultado superior de esa región; la consulta externa se puede cambiar fácilmente a (por ejemplo) SELECT TOP(20)
, pero si la región más cercana solo contiene un resultado, usted está atrapado con eso.
Calculo que probablemente tendrá que buscar de forma recursiva para la primera región que contiene k registros, pero sin necesidad de utilizar una variable de tabla (lo que causaría problemas de mantenimiento ya que hay que crear la estructura de la tabla y es susceptible de cambiar - no' re lotes de campos), no puedo ver cómo.
¿Qué efecto tiene el cambio de la consulta interna a más de TOP (1) tener sobre los resultados cuando la búsqueda de registros k?(cuando la región más cercana solo contiene un resultado) – kevchadders
Si cambia la consulta interna para seleccionar más regiones, puede obtener más resultados, pero esto no garantiza _ más resultados: las otras regiones pueden contener el mismo resultado individual (aumentan de tamaño exponencialmente) - por ejemplo Imagine que busca alrededor de un punto que tiene un punto cerca, pero no hay otros puntos en cientos de kilómetros a su alrededor; las primeras _n_ regiones solo contendrán el mismo 1 punto. – Smigs
¿Alguna vez se ha encontrado una solución funcional para esto? Estoy buscando la misma solución. –