• 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
        }
    }
  • 相关阅读:
    Thymeleaf介绍和基本语法使用
    2020版idea及没有default Settings设置的idea,修改默认maven设置、本地仓库的方法
    创建springboot项目的两种方式
    2020版IDEA新建打开*.vue文件
    IDEA新手常用快捷键
    搭建一个maven的web项目
    eclipse、idea引入外部jar包教程
    序列化笔记
    转换流笔记
    缓冲流笔记
  • 原文地址:https://www.cnblogs.com/chenss15060100790/p/16291696.html
Copyright © 2020-2023  润新知