2010-01-09 21 views
10

Estoy intentando crear una consulta, pero estoy teniendo algunas dificultades.SQL Server Geography datatype punto más cercano en la línea

Tengo una base de datos de SQL Server 2008 con una tabla que incluye, entre otros campos, un campo de geografía que describe los segmentos de la carretera. (Esta información se ha importado de los datos de TIGER/Line del censo de EE. UU.)

Tengo otro punto fijo que describe la ubicación de un usuario. Quiero encontrar el segmento de camino más cercano en la base de datos hasta ese punto, pero parece que no puedo encontrar la manera de lograrlo. Además, quiero encontrar el punto más cercano en ese segmento al punto de ubicación del usuario. Esto es lo que quiero seleccionar y regresar en mi consulta.

¿Alguien tiene alguna experiencia con la funcionalidad de geografía/geometría que me puede ayudar?

Gracias!

+0

Es posible que desee añadir un poco de información de tipo de campo. Por ejemplo, tiene un punto fijo para describir la ubicación del usuario, ¿se trata de un par de coordenadas de longitud y latitud? Tengo experiencia con las funciones de geografía, pero necesito más detalles ... – Sparky

+0

Lo proporciono desde mi aplicación, así que estoy pasando una discusión. Estoy bien con prácticamente cualquier tipo de datos que sea necesario. –

Respuesta

18

Se pueden almacenar los objetos en una columna GEOGRAPHY y crear un SPATIAL INDEX sobre esta columna

Desafortunadamente, SQL Server implementa índices espaciales enlosando la superficie y almacenar los identificadores de baldosas en un índice normal B-Tree, tan claro ORDER BY STDistance no va a funcionar (bueno, que va a funcionar, pero no utilizará el índice).

su lugar, usted tiene que hacer una consulta similar a esto:

DECLARE @mypoint GEOGRAPHY 
SET @mypoint = geography::STGeomFromText('POINT(@mylat, @mylon)', 4326); 

WITH num (distance) AS 
     (
     SELECT 1000 
     UNION ALL 
     SELECT distance + 1000 
     FROM num 
     WHERE distance <= 50000 
     ) 
SELECT TOP 1 m.* 
FROM num 
CROSS APPLY 
     (
     SELECT TOP 1 * 
     FROM mytable 
     WHERE myroad.STDistance(@mypoint) <= distance 
     ORDER BY 
       STDistance(@mypoint) 
     ) m 

De esta manera, SQL Server buscará primero las carreteras dentro de 1 kilometros desde su punto, entonces dentro de 2 kilómetros, etc., cada vez usando el índice.

Actualización:

Si tiene varios puntos en una mesa y quiere encontrar el punto más cercano para cada uno de ellos:

WITH num (distance) AS 
     (
     SELECT 1000 
     UNION ALL 
     SELECT distance + 1000 
     FROM num 
     WHERE distance <= 50000 
     ) 
SELECT mp.mypoint, m.* 
FROM @mypoints mp 
CROSS APPLY 
     (
     SELECT TOP 1 m.* 
     FROM num 
     CROSS APPLY 
       (
       SELECT TOP 1 * 
       FROM mytable 
       WHERE myroad.STDistance(@mypoint) <= distance 
       ORDER BY 
         STDistance(@mypoint) 
       ) m 
     ) m 
+2

La mejor respuesta que creo que he encontrado en StackOverflow. Gracias por informarme que no solo 'PEDIDO POR ', que es probablemente lo que hubiera terminado de implementar. –

+0

@Pure: simplemente aplique mi consulta a '@ mypoints' – Quassnoi

+0

hola. No estoy seguro de si @Pure Krome lo descubrió, pero parece que no puedo entenderlo. * Cruz Aplicar mi consulta a @ myPoints * ?? No lo entiendo :(¿Puedes actualizar tu respuesta, por favor? – RPM1984

Cuestiones relacionadas