Кратчайшее расстояние между точкой и линией (проблема с Google Maps API?) - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь найти прямое расстояние от точки С до пляжа.Линия пляжа определяется точками A и B, и по формуле Haversine я получаю расстояние от C (мой маркер в Google Maps) до точки D на линии пляжа AB, перпендикулярной C.

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

function get_perp(C){
        var A = { lat:33.345678, lng:-117.518921 };
        var B = { lat:33.100678, lng:-117.318492 };

        t = ((C.lat-A.lat)*(B.lat-A.lat)+(C.lng-A.lng)*(B.lng-A.lng))/((B.lat-A.lat)*(B.lat-A.lat)+(B.lng-A.lng)*(B.lng-A.lng));

        var D = { lat:0,lng:0};
        D.lat = A.lat + t*(B.lat-A.lat);
        D.lng = A.lng + t*(B.lng-A.lng);

        return D;
}

Возвращенная точка D действительно является точкой на линии, но она не перпендикулярна C. Это когда линия AB горизонтальная или вертикальная, но когда онане угол между AB и CD неправильный.

Я пробовал другие функции, которые я нашел здесь, но все они вызывают один и тот же результат.

В этой скрипке это целоепроцесс и если вы достаточно масштабируете, вы можете видеть, что линии AB и CD не перпендикулярны: Кратчайшее расстояние от AB до C

РЕДАКТИРОВАТЬ: играя с ним в геогебре, я вижу, что функция в порядкев поиске смысла.Ошибка происходит тогда, когда Google Maps API представляет точку. GeoGebra

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Насколько я вижу, ваша формула для D верна, и линейное приближение оправдано в таком небольшом масштабе (дельты около четверти градуса; относительные ошибки из-за нелинейности должны быть порядка10 ^ -5).

То, что вы видите, может быть связано с тем, что проекция карты не соответствует (не сохраняет углы), поэтому угол не отображается как правильный.Но точка верна.

Вы знаете, какую проекцию они используют?


Бинго, угол правильный, просто артефакт отображения из-за проекции.

enter image description here

0 голосов
/ 22 ноября 2018

Вы производите расчеты, используя плоскую геометрию , но они неверны для сферической геометрии .(См .: обратите внимание, что вы нашли расстояние по формуле Хаверсина, а не по формуле Пифагора.)

На на этой странице вы можете найти алгоритм и код JS, чтобы найти расстояние между трассами и расстояние вдоль трассы.(это можно использовать для нахождения точки D с использованием пеленга от первой точки и этого расстояния)

Cross-track distance
Here’s a new one: I’ve sometimes been asked about distance of a
point from a great-circle path (sometimes called cross track
error).

Formula:    dxt = asin( sin(δ13) ⋅ sin(θ13−θ12) ) ⋅ R
where   δ13 is (angular) distance from start point to third point
θ13 is (initial) bearing from start point to third point
θ12 is (initial) bearing from start point to end point
R is the earth’s radius
JavaScript: 
var δ13 = d13 / R;
var dXt = Math.asin(Math.sin(δ13)*Math.sin(θ13-θ12)) * R;
Here, the great-circle path is identified by a start point and 
an end point – depending on what initial data you’re working from,
you can use the formulæ above to obtain the relevant distance 
and bearings. The sign of dxt tells you which side of the path
the third point is on.

The along-track distance, from the start point to the closest 
point on the path to the third point, is

Formula:    dat = acos( cos(δ13) / cos(δxt) ) ⋅ R
where   δ13 is (angular) distance from start point to third point
δxt is (angular) cross-track distance
R is the earth’s radius
JavaScript: 
var δ13 = d13 / R;
var dAt = Math.acos(Math.cos(δ13)/Math.cos(dXt/R)) * R;
...