Рассчитать точку между двумя координатами на основе процента (сферически) - PullRequest
0 голосов
/ 14 сентября 2018

Я нашел следующий ответ в Stackoverflow.

Из того, что я понимаю, это не правильный способ сделать это. Математика линейная, однако координаты отображаются на сферическую поверхность. Итак, как правильно это сделать?

У меня есть функция, которая вычисляет среднюю точку, как я могу изменить ее, чтобы принять процент в качестве параметра. Другими словами, найдите среднюю точку, которая находится между точкой 1 и 2 и является процентом от точки 1 ...

middle_point(lat1, long1, lat2, long2) {

    // Longitude difference.
    var d_long = (long2 - long1) * Math.PI / 180;

    // Convert to radians.
    lat1 = lat1 * Math.PI / 180;
    lat2 = lat2 * Math.PI / 180;
    long1 = long1 * Math.PI / 180;

    var b_x = Math.cos(lat2) * Math.cos(d_long);
    var b_y = Math.cos(lat2) * Math.sin(d_long);

    var lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt((Math.cos(lat1) + b_x) * (Math.cos(lat1) + b_x) + b_y * b_y)); 
    var long3 = long1 + Math.atan2(b_y, Math.cos(lat1) + b_x);

    // Return result.
    return [long3 * 180/Math.PI, lat3 * 180/Math.PI];

}

1 Ответ

0 голосов
/ 17 октября 2018

Ответ дается здесь: http://www.movable -type.co.uk / scripts / latlong.html и здесь: http://www.edwilliams.org/avform.htm#Intermediate

Вот функция, которая вам нужна, с «perc» между 0 и 100:

intermediate_point(lat1, long1, lat2, long2, perc) {

    // Normalize percentage
    perc = perc / 100;

    // Convert to radians.
    lat1 = lat1 * Math.PI / 180;
    lat2 = lat2 * Math.PI / 180;
    long1 = long1 * Math.PI / 180;
    long2 = long2 * Math.PI / 180;

    // get angular distance between points
    var d_lat = lat2 - lat1;
    var d_lon = long2 - long1;
    var a = Math.sin(d_lat/2) * Math.sin(d_lat/2) + Math.cos(lat1) * 
        Math.cos(lat2) * Math.sin(d_lon/2) * Math.sin(d_lat/2);

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

    var A = Math.sin((1-perc)*d) / Math.sin(d);
    var B = Math.sin(perc*d) / Math.sin(d);

    var x = A * Math.cos(lat1) * Math.cos(long1) + B * cos(lat2) * cos(long2);
    var y = A * Math.cos(lat1) * Math.sin(long1) + B * cos(lat2) * sin(long2);
    var z = A * Math.sin(lat1) + B * Math.sin(lat2);

    var lat3 = Math.atan2(z, Math.sqrt(x*x + y*y));
    var long3 = Math.atan2(y, x);

    // Return result, normalising longitude to -180°...+180°
    return [long3 * 180/Math.PI, (lat3 * 180/Math.PI + 540)%360-180];
}
...