Листовка/PHP поиск точек полилинии по обе стороны от щелчка мыши

#php #leaflet

Вопрос:

Я использую листовку, чтобы нарисовать полилинию, состоящую из точек латлона A, B, C, D, E. Если я нажму на случайное место вдоль этой линии, я получу латлон щелчка и с помощью PHP найду ближайшую точку латлона в полилинии. Допустим, он знает, что точка В находится ближе всего.

Чего я не знаю, так это того, щелкнул ли я (предполагая, что направление движения от A до E) перед или за точкой B, другими словами, нахожусь ли я между A и B или между B и C?

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

Ответ №1:

РЕДАКТИРОВАТЬ — на самом деле это плохо на коротких расстояниях, потому что толщина полилинии может отклонить подшипник на несколько градусов, особенно когда щелчок близок к точке. Начать всё с начала.


Я решил попробовать перенести подшипник из точки щелчка в ближайшую точку, а затем посмотреть, соответствует ли этот подшипник A-B или B-C.

 function bearing($lat1, $lon1, $lat2, $lon2){
$radians = atan2(asin($lon1-$lon2)*cos($lat2),
cos($lat1)*sin($lat2) - sin($lat1)*cos($lat2)*cos($lon1-$lon2)); 
$degrees = abs(rad2deg($radians));
return $degrees;
}
echo bearing(51.6909727036, -2.0277718088, 51.6898945656, -2.0241979535);
echo bearing(51.690195, -2.025175, 51.6898945656, -2.0241979535);
 

Это возвращает следующее:

154.17654569436 (из пункта В в пункт С)

154.61713565813 (нажмите точка в точке B)

Не уверен, почему подшипник не совсем такой же, как у меня, я ограничил щелчок мыши, чтобы он работал только при нажатии на полилинию. Но я думаю, что это будет достаточно близко для моих целей. Все равно было бы очень интересно найти какой-нибудь лучший способ решить эту проблему. Спасибо.