2011-06-17 24 views
8

La primera vez que trato de usar las características espaciales de SQL Server 2008 R2, así que por favor, desnude conmigo.SQL Server 2008 R2 Geography Distance?

he creado una tabla con las siguientes columnas:

Text:varchar(255) 
Location:geography 

Ellos contienen unos cuantos ciudad de los Países Bajos como datos (GOT las coordenadas de los mapas de Google):

Rotterdam - POINT (51.925637 4.493408 4326) 
Utrecht - POINT (52.055868 5.103149 4326) 
Nijmegen - POINT (51.801822 5.828247 4326) 
Breda - POINT (51.542919 4.77356 4326) 

Quiero conocer la distancia entre todas las ciudades en la base de datos de Rotterdam, por lo que realizo esta consulta:

Select 
    Text, Location, 
    Location.STDistance(geography::Point(51.925638, 4.493408, 4326)) as Distance 
from Messages 

Pero como resultado, tengo una distancia cercana a 6800000 para cada ciudad.

¿Qué podría estar causando esto?

La única razón por la que puedo pensar es que estoy usando el SRID incorrecto, pero no puedo determinar cuál debería usar en su lugar.

Gracias!

Editar:

Sólo por el gusto de hacerlo me fui a jugar con los números y me dieron algunos resultados extraños:

Distance from Rotterdam to Rotterdam: 6828459.57 (A) (weird but true) 
Distance from Rotterdam to Breda: 6779956.10 (B) 
Distance from Rotterdam to Nijmegen: 6695336.38 (C) 

Ahora aquí es donde se ponen interesantes:

(A) - (B) = 48504 m = 48 km 
(A) - (C) = 133123 m = 133 km 

Estos valores son aproximadamente las distancias entre estas ciudades.

Respuesta

2

Según este caso de prueba que parece que funciona muy bien:

DECLARE @rotterdam geography = geography::Point(51.925637, 4.493408,4326); 
with tmp(txt, geo) 
as 
    (
    select 'Rotterdam',geography::Point(51.925637, 4.493408,4326) 
    UNION ALL 
    select 'Utrecht',geography::Point(52.055868, 5.103149,4326) 
    UNION ALL 
    select 'Nijmegen',geography::Point(51.801822, 5.828247,4326) 
    UNION ALL 
    select 'Breda',geography::Point(51.542919, 4.77356,4326) 
) 
    SELECT t.txt, t.geo.STDistance(geography::Point(51.925637, 4.493408,4326)) from tmp t 

Por lo que su consulta real se ve bien, lo que hace que me pregunte si el problema se debe a datos incorrectos en su mesa. ¿Puede confirmar que los datos están almacenados correctamente en la tabla?

También recomiendo almacenar el valor de geografía que compara en un valor separado como en el ejemplo de @TrickyNixons.

+0

Todavía no estoy seguro de lo que hice mal, pero su código funciona, así que iré de eso. Gracias =) – SaphuA

+2

@SaphuA De nada. Como nota al margen, TENGA MUCHO cuidado al usar un índice espacial en una columna de tipo de datos GEOGRAPHY que admite nulos. Hay un problema de rendimiento grave, por lo que la columna GEOGRAPHY no admite nulos, incluso si tiene que remodelar su esquema. – Tomas

+1

El comentario de Tomás sobre los problemas de rendimiento con un índice espacial sobre tipos de geografía anulables es excelente. Más información aquí: http://stackoverflow.com/questions/4954875/sql-server-2008-performance-on-nullable-geography-column-with-spatial-index – TTT

4

Pruebe una estructura como esta.

DECLARE @a geography, @b geography 
SET @a = geography::Point(51.925637, 4.493408,4326) 
SET @b= geography::Point(51.542919, 4.77356,4326) 
SELECT @a.STDistance(@b) 
Cuestiones relacionadas