Клуб API Карт

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

ale3000931
3 августа 2012, 11:33

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

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

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

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

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

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

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

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

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

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

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

Никак

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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, а я за стабильность. Удачи ;-)

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

Простите, но мне становится смешно...
алгоритмы на графах я знаю еще с института,
и можете посмотреть мой пример реализации алгоритма А стар на 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  

 

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

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

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

Имхо, надо использовать PhantomJS (+ bridge к node.js) или jsdom попробовать прикрутить.