Tipo de datos de SQL Server Geography punto más cercano en línea

Estoy tratando de crear una consulta, pero estoy teniendo algunas dificultades.

Tengo una database 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 location de un usuario. Quiero encontrar el segmento de path más cercano en la database 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 location del usuario. Esto es lo que quiero seleccionar y regresar en mi consulta.

¿Alguien tiene alguna experiencia con la funcionalidad de geografía / geometry que pueda ayudarme?

¡Gracias!

Puede almacenar sus objects en una columna de GEOGRAPHY y crear un SPATIAL INDEX en esta columna.

Desafortunadamente, SQL Server implementa índices espaciales al colocar mosaicos en la superficie y almacenar los identificadores de teselas en un índice simple de B-Tree , por lo que el ORDER BY STDistance no funcionará (bueno, funcionará pero no usará el índice).

En cambio, tendrá que hacer una consulta similar a esta:

 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 forma, SQL Server primero searchá paths dentro de 1 kilómetro de su punto, luego dentro de 2 kilómetros, etc., cada vez que use el índice.

Actualizar:

Si tiene varios puntos en una tabla y desea encontrar el punto más cercano para cada uno de ellos, haga lo siguiente:

 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 

¿Cómo se almacenan los segmentos de su path? lat y largo? si es así, puedes convertirlos a radianes y hacer los cálculos:

    Intereting Posts