Клуб API Карт

Нахождение точки на маршруте

said-avk
15 сентября 2014, 19:19

Всем привет.

 

Нужен совет. Есть точка с координатами [lat,lng], а так же построен маршрут при помощи ymaps.route.  Нужно определить, расположена ли точна на маршруте. Как это сделать в api 2.1 ?

 

В api 1.x я это делал при помощи метода getClosestPoint

7 комментариев
Подписаться на комментарии к посту

У маршрута вам надо добраться до геометрии путей

и использовать координаты сегментов

а далее

 

для поиска через собственную геометрию полилинии сегментов

http://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/ILineStringGeometryAccess.xml#getClosest

 

для поиска через geoQuery

http://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/GeoQueryResult.xml#getClosestTo

 

Ок. Значит добираюсь до геометрии путей таким образом:

сначала получаю все пути маршрута router.getPaths()

потом из каждого пути беру сегменты path.getSegments()

потом получаю координаты каждого сегмента, с помощью getCoordinates() и все это записываю в массив координат, который назвал route_points

далее создаю полилинию из этих координат var polyline = new ymaps.Polyline(route_points);

это вроде как получается

остается найти на полилинии ближайшую точку  closest = polyline.geometry.getClosest([56.744360, 37.232850]);

но именно это не работает, почему???

 

 

сделайте пример на jsfiddle.net

Вот 

http://jsfiddle.net/Lpc7v8vv/

Строка 33 вызывает ошибку. У меня подозрение, что координаты точки в getClosest передаю не правильно, я пробовал 2 способа:

1. как в примере выше 

point = new ymaps.geometry.Point([56.744360, 37.232850]);

closest = polyline.geometry.getClosest(point);

2. непосредственно сами координаты передавал

closest = polyline.geometry.getClosest([56.744360, 37.232850]);

но ни один из способов не приносил желаемого результата.

Огромное спасибо! )

Значит необходимо было привязать объект к карте? Как я не догадался.

Кстати, пока суть да дело, я запилил свой, костыльный метод, определения ближайщей точки

len = route_points.length; 

for (j = 0; j < len; j++) { //перебор всех координат сегментов пути

if (Math.abs(point_lat - route_points[j][0]) < .005 && Math.abs(point_lng - route_points[j][1]) < .005) { //отклонение lat и lng от точки сегмента не превышает .005, то считаю, что точка расположена на маршруте

//отображаю точку на маршруте

}

}

 

но конечно, я от него откажусь, коли есть нормальный способ. )