2010-05-28 11 views

Respuesta

2

no he encontrado una fuente, pero Estaba jugando con este método y llegué a la conclusión de que el resultado s dado en la misma unidad utilizada en el WKT.

Y la distancia se calcula en coordenadas planas. El SRID no se toma en cuenta.

+1

Lo siento, soy nuevo en esto, pero ¿podemos convertir esto 0.00134536240471071 al resultado esperado 147 según la pregunta? –

3

1 grado (su unidad de entrada) ~ = 69 millas. Entonces, si multiplicas tus resultados por 69 millas y luego los conviertes a metros, obtienes aproximadamente 149 metros. No es exactamente lo que esperabas, pero bastante cerca. Por supuesto, no creo que reproduzca con precisión la naturaleza esférica del globo, pero tal vez estoy equivocado.

+1

No, no reproduce la naturaleza esférica del globo. Si convierte las distancias cerca de los polos con este método, obtendrá valores inaceptables. –

+0

¡esto es lo suficientemente preciso para mí! http://geography.about.com/library/faq/blqzdistancedegree.htm – tinybyte

4

Supongo que es aproximadamente 3 años demasiado tarde para el OP, pero me encontré con esta pregunta mientras investigaba un tema similar, así que aquí está mi valor de tuppence.

De acuerdo con www.movable-type.co.uk/scripts/latlong.html hay 3 formas de calcular la distancia en la superficie de la Tierra, desde la más fácil hasta la más compleja (y por lo tanto de menor a mayor): aproximación equirrectangular, ley esférica de coseno y la fórmula Haversine. El sitio también proporciona JavaScript. Esta es la función para equirrectangular aproximación:


function _lineDistanceC(lat1, lon1, lat2, lon2) { 
    var R = 6371; // km 
    lat1 = lat1.toRad(); 
    lon1 = lon1.toRad(); 
    lat2 = lat2.toRad(); 
    lon2 = lon2.toRad(); 
    var x = (lon2-lon1) * Math.cos((lat1+lat2)/2); 
    var y = (lat2-lat1); 
    return Math.sqrt(x*x + y*y) * R; 
} 

Este es mi intento de un equivalente SQL:


drop function if exists lineDistanceC; 
delimiter // 
CREATE FUNCTION lineDistanceC (la1 DOUBLE, lo1 DOUBLE, la2 DOUBLE, lo2 DOUBLE) RETURNS DOUBLE 
BEGIN 
    SET @r = 6371; 
    SET @lat1 = RADIANS(la1); 
    SET @lon1 = RADIANS(lo1); 
    SET @lat2 = RADIANS(la2); 
    SET @lon2 = RADIANS(lo2); 
    SET @x = (@[email protected]) * COS((@[email protected])/2); 
    SET @y = (@lat2 - @lat1); 
    RETURN (SQRT((@x*@x) + (@y*@y)) * @r); 
END 
// 
delimiter ; 

no tengo idea de cómo es exacto esta fórmula es, pero el sitio parece muy creíble y definitivamente vale la pena una visita para más detalles. Usando las coordenadas en la pregunta, los resultados (en kilómetros) del JavaScript y el SQL anteriores son 0.14834420231840376 y 0.1483442023182845, lo que los hace iguales a una fracción de milímetro, pero no, curiosamente, los 147 metros que esperaba el OP. Disfrutar.

+0

Esta es la función de SQL más precisa que he encontrado para determinar la distancia entre ubicaciones geográficas. Simplemente estoy usando la X (nombre de campo), Y (nombre de campo) en mi campo de datos POINT para enviar el lat/lon a la función. – DaveK

0

En un grado de latitud, hay aproximadamente 69 millas. En cuanto a la longitud, hay cerca de 49 millas por grado. Cuando intento calcular la distancia entre NYC y LONDON, el número correcto es 49.

Seleccionar Ronda (GLength (GeomFromText ('LineString (40.756054 -73.986951,51.5001524 -0.1262362)'))) * 49;

Cuestiones relacionadas