Клуб API Карт

Определение длины маршрута на сервере

Пост в архиве.

Доброго времени суток, уважаемые разработчики!

Столкнулся со следующей проблемой:

необходимо определять длину маршрута (и время пути) между точками на стороне сервера.

1. В StaticApi такой возможности не нашел. Может плохо искал? )

2. Возможно ли использовать JS API в связке с серверным NodeJS ?

23 комментария

АПИ тут мало чем поможет,

да и оно само ничего не расчитывает, а только предоставляет интерфейс к данным.

Длина приходит с сервера

Алексей У.
28 января 2016, 03:59

Спасибо, конечно за ответ, но я ни на шаг не продвинулся :)
Понятно, что какое бы мы API не использовали, данные запрашиваются с сервера Яндекс.Карт.

Так как всё же мне запросить длину маршрута от точки до точки с сервера Яндекс.Карт, делая запрос средствами PHP или серверного JavaScript (NodeJS) ?

Никак

Маршрутизация как отдельный http-сервис не предоставляется.

Алексей У.
28 января 2016, 03:59

Я еще в первом сообшении написал, что не нашел этого в StaticApi (ака http-сервис).
Поэтому и спрашиваю, про использование JS API в связке с серверным NodeJS 

Алексей У.
28 января 2016, 03:59

Так все же можно использовать JS API на стороне сервера (напр. с NodeJS) или нет?

ПС запрещает использовать АПИ где-либо кроме броузера

Интересовался сам, как активный пользователь node.js

Алексей У.
28 января 2016, 03:59

Это печально...
Может тогда есть возможность запросить (по http) карту в YMapsML-формате?
Если да, то достаточно ли будет этих данных, чтобы самому рассчитать длину маршрута?

Откуда запросить?

Алексей У.
28 января 2016, 03:59

С сервера Яндекс.Карт.

Или по HTTP запросить данные в XML нельзя? только в виде готового изображения?

YMapsML можно получить с maps.yandex.ru, но это будет не маршрут, а просто геообъекты, которые вы сами руками туда добавите.

Публичной HTTP-ручки которая отдавала бы маршрут нет

Алексей У.
28 января 2016, 03:59

Пока не вижу другого решения, как только делать веб-интерфейс с функциями сканирования маршрутов карты и передачей данных в БД. Т.е. для каждого региона придется делать предварительное сканирование и сохранять данные, чтобы в дальнейшем с ними работать.

Алексей Yarrr!
28 января 2016, 03:59

Ага, а мне жена борщь в бразуере варит, тоже ленилась книжки читать. Заходит на кулинарный сайт и фотку скачивает, потом печатает принтером (самой лениво рисовать или готовить) - так и сижу голодный.

По опыту могу сказать - это плохое решение. Лучше сразу нет.

Алексей У.
28 января 2016, 03:59

Ваша ирония про борЩ мне не понятна...

Ответил ниже. 

Алексей Yarrr!
28 января 2016, 03:59

Думаю, самый простой вариант - читать книжки (а можно и исходники яндекс карт, гугл мэпс) и реализовывать алгоритм поиска пути. Сначала по графу с весами (дейкстра), а затем и географический, основываясь на отрезках (проложенных на геокарте) с учетом расстояния, и пр.

Алексей У.
28 января 2016, 03:59

С алгоритмами проблем не испытываю...

Резюмирую выше описанное, чтобы не разводить флэйм:
1. используя StaticAPI невозможно получить длину маршрута в принципе (только готовое изображение);

2. используя JS API нельзя получить длину маршрута, не показывая карту Яндекса;
3. используя API Яндекс.Карт напрямую, невозможно определить длину маршрута из приложения, функционирующего полностью на сервере.
---
А теперь покажите мне ту "книжку", где бы было написанно как, используя серверный язык получить длину маршрута... Что и правда нет?

Отсюда и вытекает необходимость предварительного сканирования данных. Как? - это уже другой вопрос.

Можно самому парсить YMapsML и используя алгоритмы поиска на графах рассчитывать длину маршрута, но зачем, если в JS API уже есть такой инструмент?.

Может я упустил какой-то важный момент, но я опять прихожу к выводу, что проще всего будет создать страничку в своей админке для сканирования карты, обсчета длин маршрутов и сохранения их в БД.

Поправьте меня если я не прав...

Алексей Yarrr!
28 января 2016, 03:59
А теперь покажите мне ту "книжку", где бы было написанно как, используя серверный язык получить длину маршрута... Что и правда нет?

http://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2 - снизу список литературы на данную тему. из описания можно понять зачем я вас туда послал

http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B5%D0%B9%D0%BA%D1%81%D1%82%D1%80%D1%8B - один из алгоритмов поиска кратчайшего пути.

http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A4%D0%BB%D0%BE%D0%B9%D0%B4%D0%B0_%E2%80%94_%D0%A3%D0%BE%D1%80%D1%88%D0%B5%D0%BB%D0%BB%D0%B0 - аналогичный предыдущему, но для поиска сразу всех кратчайших путей (O(n^3))

Вес хорд, в вашем случае - время прохождения между соседними вершинами. Вершины - остановки, и т.п.

Конечно же, вам еще нужен и сам граф, чтобы с ним работать. Можете распарсить YMapsML, если данные в нем открытые и их можно использовать. Инструмент, как вам уже объясняли, нацелен на работу с серверов и отображение уже готовой информации. Вся математика по ту сторону баррикад. Но и все, что есть в JS API 2.0, вы можете пощупать руками читая исходные коды. Добавьте параметр mode=debug и в путь.

Опять же, реализаций алгоритма дейкстры несчетное кол-во на различных языках, начиная с академического си, кончая (а может и не кончая) lua, в т.ч. и свободно гуляющих по интернету. Хранилища под них тоже существуют, определить вес хорды (время/расстояние между двумя точками) - тоже проблемы не должно составлять. Да и вообще вам грех жаловаться, если вы: "С алгоритмами проблем не испытываю...".

Может я упустил какой-то важный момент, но я опять прихожу к выводу, что проще всего будет создать страничку в своей админке для сканирования карты, обсчета длин маршрутов и сохранения их в БД.

Слова "Создать страничку в админке" и полное отствутствие желания делать что-то самому наводят на определенного рода мысли. У АПИ Яндекс.Карт есть соглашение, в котором есть ограничения: http://legal.yandex.ru/maps_api/ . Может быть такое использование карты и легально ;-)

Лично я бы не парился и сделал все на сервере. Мало ли какие изменения будут во внутренних интерфейсах API, а я за стабильность. Удачи ;-)

Алексей Yarrr!
28 января 2016, 03:59

BTW: если вам даже алгоритм поиска пути не нужен, то вам, получается, сложно сделать сумму модулей векторов (отрезков маршрута)? Это ради этого весь балаган?

Алексей У.
28 января 2016, 03:59

Простите, но мне становится смешно...
алгоритмы на графах я знаю еще с института,
и можете посмотреть мой пример реализации алгоритма А стар на Delphi, который я как-то добавил в Wiki:
http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_A* 
Боюсь, Вы не поняли основную проблему:
есть карты Яндекса, есть API, но получить маршрут, используя API напрямую (из серверного приложения), невозможно.
И пожалуй, я воспользуюсь этим:
https://github.com/DennisOSRM/Project-OSRM/wiki/Server-api  

 

Алексей, добрый день!

Как можно с вами связаться? Занимаюсь похожим проектом, хотел обсудить данную проблему )

Алексей У.
28 января 2016, 03:59

Скиньте свои контакты (icq или skype) на почту 

Имхо, надо использовать PhantomJS (+ bridge к node.js) или jsdom попробовать прикрутить.
Добрый день! Уже много времени прошло с написания этого вопроса, но тема актуальна до сих пор!)) Если помните, пришли ли вы к какому-то решению. Никак не могу найти решения такой задачи даже с использованием других карт. Заранее спасибо!
Alex Soshnikov,
с тех пор появился сервис Яндекс.Маршрутизация, он решает такую задачу. Подробнее тут: yandex.ru/routing