OpenLayer4——坐标间距计算

地图距离计算,显然,地球是个曲面,不能简单地通过勾股定理计算,需要考虑到地球的半径。

MySQL版本

复制代码
DROP FUNCTION IF EXISTS getDistance;

-- create a function
CREATE FUNCTION getDistance (
    lon1 DOUBLE (10, 5),
    lat1 DOUBLE (10, 5),
    lon2 DOUBLE (10, 5),
    lat2 DOUBLE (10, 5)
) RETURNS DOUBLE (16, 8)
BEGIN

DECLARE sa2 DOUBLE (16, 8);
DECLARE sb2 DOUBLE (16, 8);
SET lat1 = lat1 * PI() / 180.0;
SET lat2 = lat2 * PI() / 180.0;
SET sa2 = sin((lat1 - lat2) / 2.0);
SET sb2 = sin(
    ((lon1 - lon2) * PI() / 180.0) / 2.0
);

RETURN 2 * 6367000 * asin(
    sqrt(
        sa2 * sa2 + cos(lat1) * cos(lat2) * sb2 * sb2
    )
);

-- 测试
END SELECT
    getDistance (
        114.415686,
        38.045362,
        114.518596,
        38.049113
    );
复制代码

 

JavaScript版本

复制代码
// 距离计算
function Utils() {

    /**
     * 获取两个点之间的距离
     * @param lat1 a点坐标经度
     * @param lng1 a点坐标维度
     * @param lat2 b点坐标经度
     * @param lng2 b点坐标维度
     * @returns {number}
     */
    function getDistance(lat1, lng1, lat2, lng2) {
        let radLat1 = lat1 * Math.PI / 180.0;
        let radLat2 = lat2 * Math.PI / 180.0;
        let a = radLat1 - radLat2;
        let b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
        let s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
            Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
        s = s * 6378.137;// 地球半径;
        s = Math.round(s * 10000) / 10000;
        return s;
    }

    /**
     *
     * 获取两个点之间的距离
     * @param a a点
     * @param b b点
     * @returns {number}
     */
    function getPointDistance(a, b) {
        return getDistance(a[0], a[1], b[0], b[1]);
    }

    /**
     * 获取坐标数组的长度
     *
     * @param coordinates
     * @returns {number}
     */
    function getCoordinatesDistance(coordinates) {
        let res = 0;
        if (Array.isArray(coordinates) && coordinates.length > 1) {
            for (var i = 0, len = coordinates.length - 1; i < len; i++) {
                var a = coordinates[i], b = coordinates[i + 1];
                res += getPointDistance(a, b);
            }
        }
        return res;
    }

    /**
     * 获取GeoJSON的长度
     * @param json
     * @returns {number}
     */
    function getJsonDistance(json) {
        try {
            return getCoordinatesDistance(json.features.geometry.coordinates);
        } catch (e) {
            console.log(e);
            return 0;
        }
    }

    return {
        getDistance: getDistance,
        getPointDistance: getPointDistance,
        getCoordinatesDistance: getCoordinatesDistance,
        getJsonDistance: getJsonDistance
    }
}
复制代码

 

posted on   疯狂的妞妞  阅读(121)  评论(0编辑  收藏  举报

(评论功能已被禁用)
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2020-05-20 Security——helloworld
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示