【问题标题】:What is the unit in returned by MySQL GLength method?MySQL GLength 方法返回的单位是什么?
【发布时间】:2010-05-28 20:24:13
【问题描述】:

我想获取地球表面两点之间的长度(以米为单位)。但是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

【问题讨论】:

    标签: mysql geospatial


    【解决方案1】:

    我想对于 OP 来说已经晚了大约 3 年,但我在研究类似主题时遇到了这个问题,所以这是我的 tuppence 价值。

    根据www.movable-type.co.uk/scripts/latlong.html,有 3 种计算地球表面距离的方法,从最简单到最复杂(因此从最小到最准确):等角近似、余弦球面定律和Haversine 公式。该网站还提供 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,这使得它们与 0.1 毫米相同,但奇怪的是,与 OP 所期望的 147 米不同。享受吧。

    【讨论】:

    • 这是我发现的用于确定地理位置之间距离的最准确的 SQL 函数。我只是在我的 POINT 数据字段上使用 X(fieldname), Y(fieldname) 将纬度/经度发送到函数。
    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

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

    并且距离是在平面坐标中计算的。不考虑 SRID。

    【讨论】:

    • 对不起,我是新手,但我们可以根据问题将此 0.00134536240471071 转换为预期结果 147 吗?
    【解决方案4】:

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

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

    【讨论】:

    • 不,乘以 69.172 即可获得里程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    相关资源
    最近更新 更多