Расстояние от длинного сегмента латинской линии на больших расстояниях

77
6

Я рассчитываю, как далеко от точки линии на земле.

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

В моих расчетах Рим показан в 5 км от линии:

    Лондон, Великобритания - 0km Рим, Италия - 5km Кирен, Ливия - 0km

Но на Google Earth это больше похоже на 61 км enter image description here

Когда я начинаю идти на большие расстояния, расчеты становятся еще хуже!

    Рим, Италия - 0km Мохенджо-даро, Пакистан - 0km Стамбул, Турция - 250 км

enter image description here

Я считаю, что проблема здесь где-то в коде:

function distToSegment(lat1, lon1, lat2, lon2, lat3, lon3) {
var y = Math.sin(lon3 - lon1) * Math.cos(lat3);
var x = Math.cos(lat1) * Math.sin(lat3) - Math.sin(lat1) * Math.cos(lat3) * Math.cos(lat3 - lat1);
var bearing1 = radiansToDegrees(Math.atan2(y, x));
bearing1 = 360 - (bearing1 + 360 % 360);
var y2 = Math.sin(lon2 - lon1) * Math.cos(lat2);
var x2 = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lat2 - lat1);
var bearing2 = radiansToDegrees(Math.atan2(y2, x2));
bearing2 = 360 - (bearing2 + 360 % 360);
var lat1Rads = degreesToRadians(lat1);
var lat3Rads = degreesToRadians(lat3);
var dLon = degreesToRadians(lon3 - lon1);
var distanceAC = Math.acos(Math.sin(lat1Rads) * Math.sin(lat3Rads) + Math.cos(lat1Rads) * Math.cos(lat3Rads) * Math.cos(dLon)) * 6371;
var min_distance = Math.abs(Math.asin(Math.sin(distanceAC / 6371) * Math.sin(degreesToRadians(bearing1) - degreesToRadians(bearing2))) * 6371);
return min_distance;
}

Вот рабочая скрипка, которую вы можете использовать для тестирования:

http://jsfiddle.net/kmturley/cfg2D/3/

Любая помощь, чтобы понять этот, будет оценена по достоинству!

спросил(а) 2021-01-25T20:21:44+03:00 4 месяца, 4 недели назад
1
Решение
63

Эта

bearing1 = 360 - (bearing1 + 360 % 360)

выглядит подозрительно для меня. Ты имеешь ввиду

bearing1 = 360 - (bearing1 + 360) % 360

?

Аналогично для bearing2.

% - мультипликативный оператор и имеет более высокий приоритет, чем +.

ответил(а) 2021-01-25T20:21:44+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема