Что такое единица измерения, возвращаемая методом MySQL GLength? - PullRequest
14 голосов
/ 29 мая 2010

Я хочу получить длину в метрах между двумя точками на поверхности Земли. Но метод 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

Ответы [ 4 ]

4 голосов
/ 06 марта 2013

Я полагаю, что для ОП уже слишком поздно на 3 года, но я столкнулся с этим вопросом, исследуя похожую тему, так что вот моя стоимость вложения.

Согласно 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 = (@lon2-@lon1) * COS((@lat1+@lat2)/2);
    SET @y = (@lat2 - @lat1);
    RETURN (SQRT((@x*@x) + (@y*@y)) * @r);
END
//
delimiter ;

Я понятия не имею, насколько точна эта формула, но сайт кажется очень заслуживающим доверия и, безусловно, стоит посетить для более подробной информации. Используя координаты в вопросе, результаты (в километрах) от вышеупомянутых JavaScript и SQL равны 0,14834420231840376 и 0,1483442023182845, что делает их одинаковыми с долей миллиметра, но, как ни странно, 147 метров, которые ожидал ОП. Наслаждайтесь.

3 голосов
/ 10 мая 2011

1 градус (ваша единица ввода) ~ = 69 миль. Таким образом, если вы умножите свои результаты на 69 миль, а затем преобразуете в метры, вы получите примерно 149 метров. Не совсем то, что вы ожидали, но довольно близко. Конечно, я не думаю, что это точно воспроизводит сферическую природу земного шара, но, возможно, я ошибаюсь.

2 голосов
/ 29 мая 2010

Я не нашел источника, но я играл с этим методом и пришел к выводу, что результат дается в тех же единицах, что и в WKT.

А расстояние рассчитывается в плоских координатах. SRID не учитывается.

0 голосов
/ 22 ноября 2013

В градусах широты около 69 миль. Глядя на долготу, там около 49 миль на градус. Когда я пытаюсь вычислить расстояние между Нью-Йорком и Лондоном, правильное число составляет 49.

Выбрать раунд (GLength (GeomFromText ('LineString (40.756054 -73.986951,51.5001524 -0.1262362)'))) * 49;

...