Ответ 1
Я не нашел источник, но я играл с этим методом, и я пришел к выводу, что результат указан в том же блоке, который используется в WKT.
И расстояние рассчитывается в планарных координатах. SRID не учитывается.
Я хочу получить длину в метрах между 2 точками на поверхности Земли. Но метод GLength
возвращает неожиданное значение
http://dev.mysql.com/doc/refman/5.0/en/geometry-property-functions.html#function_glength
SELECT GLength(GeomFromText(
'LINESTRING(-67.8246 -10.0073,-67.8236 -10.0082)', 4326))
фактический результат
0.00134536240471071
ожидаемое значение в метрах:
147
Я не нашел источник, но я играл с этим методом, и я пришел к выводу, что результат указан в том же блоке, который используется в WKT.
И расстояние рассчитывается в планарных координатах. SRID не учитывается.
Я думаю, что около 3 лет слишком поздно для OP, но я столкнулся с этим вопросом, исследуя подобную тему, так что здесь моя ценность.
В соответствии с www.movable-type.co.uk/scripts/latlong.html существует 3 способа вычисления расстояния по поверхности Земли, причем это от простого до самого сложного (и, следовательно, от наименьшего до самого точного): равноугольная аппроксимация, сферический закон косинов и формула Хаверсина. Сайт также предоставляет JavaScript. Это функция для равноуглового приближения:
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;
}
Это моя попытка эквивалента 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 ;
Я не знаю, насколько точна эта формула, но сайт кажется очень надежным и, безусловно, стоит посетить для более подробной информации. Используя координаты в вопросе, результаты (в километрах) из приведенного выше JavaScript и SQL равны 0.14834420231840376 и 0.1483442023182845, что делает их одинаковыми до доли миллиметра, но, что любопытно, 147 метров, которые ожидал ОП. Наслаждайтесь.
1 градус (ваш блок ввода) ~ = 69 миль. Итак, если вы умножаете свои результаты на 69 миль, а затем конвертируете в метры, вы получаете примерно 149 метров. Не совсем то, что вы ожидали, но довольно близко. Конечно, я не думаю, что это точно воспроизводит сферическую природу земного шара, но, возможно, я ошибаюсь.
В градусах широты около 69 миль. Рассматривая долготу, существует около 49 миль за градус. Когда я пытаюсь вычислить расстояние между NYC и LONDON, правый номер равен 49.
Выбор раунда (GLength (GeomFromText ('LineString (40.756054 -73.986951,51.5001524 -0.1262362)'))) * 49;