MySQL GLength方法返回的单位是多少?

时间:2010-05-28 20:24:14

标签: mysql geospatial

我希望得到地球表面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

4 个答案:

答案 0 :(得分:4)

我想这对OP来说已经晚了3年,但我在研究类似主题的过程中碰巧遇到了这个问题,所以这是我的值得一试的。

根据www.movable-type.co.uk/scripts/latlong.html,有3种计算地球表面距离的方法,从最简单到最复杂(从最小到最精确):等距角近似,余弦球面定律和半影式。该网站还提供JavaScript。这是Equirectangular近似的函数:


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,这使得它们相同,只有一毫米,但奇怪的是,这是OP所期望的147米。享受。

答案 1 :(得分:3)

1度(您的输入单位)〜= 69英里。因此,如果您将结果乘以69英里然后转换为米,则大约可以获得149米。不完全是你的预期,但非常接近。当然,我认为不能准确地再现地球的球形特性,但也许我错了。

答案 2 :(得分:2)

我没有找到一个来源,但我正在使用这种方法,我得出结论,结果是在WKT中使用的相同单位。

距离以平面坐标计算。不考虑SRID。

答案 3 :(得分:0)

在纬度上,大约有69英里。从经度来看,每度约49英里。当我试图计算纽约和伦敦之间的距离时,右边的数字是49.

选择Round(GLength(GeomFromText('LineString(40.756054 -73.986951,51.5001524 -0.1262362)')))* 49;