代码之家  ›  专栏  ›  技术社区  ›  Jader Dias

mysql glength方法返回的单位是什么?

  •  14
  • Jader Dias  · 技术社区  · 16 年前

    我想知道地球表面两点之间的长度,以米为单位。但是 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 回复  |  直到 12 年前
        1
  •  4
  •   blankabout    13 年前

    我想这对我来说已经晚了3年了,但是我在研究一个类似的话题时遇到了这个问题,所以这是我的建议。

    根据 www.movable-type.co.uk/scripts/latlong.html 计算地球表面距离的方法有三种,从最简单到最复杂(因此从最不精确到最精确):等边近似、余弦球面定律和哈弗斯线公式。该站点还提供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,这使得它们相同,只有一毫米的一小部分,但奇怪的是,这不是OP预期的147米。享受。

        2
  •  3
  •   ArkieGuy    15 年前

    1度(输入单位)~=69英里。所以,如果你把结果乘以69英里,然后换算成米,你得到大约149米。不完全符合你的预期,但非常接近。当然,我不认为这能准确地再现地球的球形本质,但也许我错了。

        3
  •  2
  •   Jader Dias    16 年前

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

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

        4
  •  0
  •   Konstantin Voronov    12 年前

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

    选择圆形(glength(geomfromtext('linestring(40.756054-73.986951,51.5001524-0.1262362)')*49;