首页 文章

在地球上移动后找到最终纬度经度

提问于
浏览
-1

我使用Haversine公式来计算两个纬度 - 经度对的距离 .

function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) {
    var R = 6371; // Radius of the earth in km
    var dLat = deg2rad(lat2-lat1);
    var dLon = deg2rad(lon2-lon1); 
    var lat1 = deg2rad(lat1);
    var lat2 = deg2rad(lat2);

    var a = 
        Math.sin(dLat/2) * Math.sin(dLat/2) + 
        Math.sin(dLon/2) * Math.sin(dLon/2) * 
        Math.cos(lat1) * Math.cos(lat2);

    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c;
    return d;
}

给定起点(lat1,lat2),在直线上移动所需的距离和角度,我需要确定 endpoints (如lat2和lon2) .

看下面我的尝试:

function getFinalLatLon(lat1, lon1, distance, angle) {
    var R = 6371; // Radius of the earth in km
    var c = distance/R;
    // Math.atan2(Math.sqrt(a), Math.sqrt(1-a)) = c/2
    var a = // stuck here

    // looking for this part of the code

    return [lat2, lon2];
}

2 回答

  • 0

    我刚刚发现了一个类似的问题here,我按照解决方案提出了一个适合我案例的功能 .

    希望它可以帮助其他人:

    function getFinalLatLon(lat1, lon1, distance, angle){ 
        function deg2rad(deg) {
            return deg * (Math.PI/180)
        }
        // dy = R*sin(theta) 
        var dy = distance * Math.sin(deg2rad(angle)) 
        var delta_latitude = dy/110574
        // One degree of latitude on the Earth's surface equals (110574 meters
        delta_latitude = parseFloat(delta_latitude.toFixed(6));
    
        // final latitude = start_latitude + delta_latitude
        var lat2 = lat1 + delta_latitude
    
        // dx = R*cos(theta) 
        var dx = distance * Math.cos(deg2rad(angle)) 
        // One degree of longitude equals 111321 meters (at the equator)
        var delta_longitude = dx/(111321*Math.cos(deg2rad(lat1))) 
        delta_longitude = parseFloat(delta_longitude.toFixed(6));
    
        // final longitude = start_longitude + delta_longitude
        var lon2 = lon1 + delta_longitude
    
        return [lat2, lon2];
    }
    

    水平移动的角度为0度 . 您可以根据需要切换 . 如果有人向北移动那将是90度 . 西北135度,依此类推......

  • 3

    如果您正在水平移动,则可以将经度增加 distance / (R * cos(lat)) . 不需要 atan .


    编辑:由于您需要一般情况的公式,请考虑以下几何推导:

    • 前视图:

    enter image description here

    • 侧视图:

    enter image description here

    • 整个设置:

    enter image description here

    笔记:

    • r 是起始位置的单位矢量, s 是 endpoints .

    enter image description here

    • a, b, c 是帮助计算的中间向量 .

    • (θ, φ) 是(lat,long)坐标 .

    • γ 是您要前往的方向的方向 .

    • δ 是行进的角度(距离/半径 R = 6400000m ) .

    我们需要 a, br 垂直,并且 a 与North对齐 . 这给出了:

    enter image description here

    c 由(简单三角法)给出:

    enter image description here

    因此我们得到 s (通过一些非常乏味的代数):

    enter image description here

    现在我们可以使用以下方法计算 s 的最终(纬度,长度)坐标:

    enter image description here


    码:

    function deg2rad(deg) { return deg * (Math.PI / 180.0) }
    function rad2deg(rad) { return rad * (180.0 / Math.PI) }
    
    function getFinalLatLong(lat1, long1, distance, angle, radius) {
        // calculate angles
        var delta = distance / radius,
            theta = deg2rad(lat1),
            phi   = deg2rad(long1),
            gamma = deg2rad(angle);
    
        // calculate sines and cosines
        var c_theta = Math.cos(theta), s_theta = Math.sin(theta);
        var c_phi   = Math.cos(phi)  , s_phi   = Math.sin(phi)  ;
        var c_delta = Math.cos(delta), s_delta = Math.sin(delta);
        var c_gamma = Math.cos(gamma), s_gamma = Math.sin(gamma);
    
        // calculate end vector
        var x = c_delta * c_theta * c_phi - s_delta * (s_theta * c_phi * c_gamma + s_phi * s_gamma);
        var y = c_delta * c_theta * s_phi - s_delta * (s_theta * s_phi * c_gamma - c_phi * s_gamma);
        var z = s_delta * c_theta * c_gamma + c_delta * s_theta;
    
        // calculate end lat long
        var theta2 = Math.asin(z), phi2 = Math.atan2(y, x);
    
        return [rad2deg(theta2), rad2deg(phi2)];
    }
    

    测试用例:

    • 输入 (lat, long) = (45, 0)angle = 0distance = radius * deg2rad(90) => (45, 180) (正如我之前所说)

    • 输入 (lat, long) = (0, 0)angle = 90distance = radius * deg2rad(90) => (0, 90) (正如预期的那样 - 从赤道开始,向东行驶90度经度)

    • 输入 (lat, long) = (54, 29)angle = 36distance = radius * deg2rad(360) => (54, 29) (正如预期的那样 - 从任意随机位置开始,向任意方向转圈)

    • 有趣的案例:输入 (lat, long) = (30, 0) ,其他一切都一样 . => (0, 90) (我们预计 (30, 90) ? - 不是从赤道开始,向北行进90度)

    这样做的原因是北方90度不是东方(如果你不在赤道)!该图表应说明原因:

    enter image description here

    如您所见,向北90度的移动路径不在东方向 .

相关问题