Совсем недавно, в одном из проектов, нам была поставлена задача — научиться строить маршруты на карте для велосипедных прогулок.
Первым делом, мы начали смотреть маршруты Google и Яндекс. И к сожалению, пришлось от них отказаться, т.к. первые разрешали показывать их только на родных картах, вторые, не знали что есть велосипеды и даже пешеходы.
Немного изучив предметную область, мы нашли наконец что искали: Open Source Routing Machine. Проект, с открытым исходным кодом, который позволяет развернуть у себя на сервере, свой собственный сервис построения маршрутов.
Разобравшись, как его настраивать и запускать, мы решили поделиться этим и пересказать своими словами процесс установки, и то с чем пришлось столкнуться в процессе.
В wiki проекта, довольно подробно описан процесс установки. Установка описана для различных ОС (Debian, CentOS, Mac OS X и др.), написаны проблемы при разворачивании на EC2 Micro, а для «особо продвинутых» есть рецепт для Chef.
Нам повезло, что в качестве ОС на сервере у нас стояла Debian Wheezy (64). Потому что при чтении документации, выясняется что на других системах приходиться делать различные дополнительные шаги. Например, на Debian Squeeze, потребовалось обновить boost до версии 1.44. Но, все это, спасибо разработчикам, написано в документации.
У нас установка заняла 3 простых строчки:
sudo apt-get install git libboost-dev gcc g++ make cmake libstxxl-dev
libxml2-dev libbz2-dev zlib1g-dev libzip-dev libboost-filesystem-dev
libboost-thread-dev libboost-system-dev libboost-regex-dev libboost-program-options-dev
libboost-iostreams-dev libgomp1 libpng-dev libprotoc7 libprotobuf-dev protobuf-compiler
liblua5.1-0-dev libluabind-dev pkg-config libosmpbf-dev
git clone https://github.com/DennisOSRM/Project-OSRM.git
mkdir -p build; cd build; cmake ..; make
После чего, подумав пару минут, сервер сообщил что сборка прошла успешно.
Теперь, начинался следующий этап, как оказалось самый долгий — запуск.
Чтобы запустить сервер, ему необходимо подготовить данные, для построения графа. Чтобы загрузить их, необходимо их извлечь из карт OpenStreetMap. Делается это, входящими в комплект утилитами.
Но, сначала нужно скачать карту региона, для которого вы хотите строить маршруты.
Разработчики, предлагают использовать сервис GeoFabrik. На котором можно скачать карты для основных материков земли, отдельных стран и регионов. Но, нам захотелось большего, и мы выкачали целиком карту планеты через Planet OSM.
С помощью утилиты osrm-extract, данные извлекаются из карты и сохраняются для дальнейшей загрузки. Перед тем как извлекать данные, необходимо указать файл профиля (profile.lua), в котором описано какие именно маршруты необходимы. Все профили лежат в папке profiles в корневой папке с исходниками и подключаются созданием ссылки на нужный файл.
ln -s ../profiles/bicycle.lua profile.lua
Как видите, мы указали профиль для велосипедистов. Но, там есть профили и для автомобильного транспорта и для пешеходов.
Так же, может потребоваться указать ссылку на папку с дополнительными библиотеками
ln -s ../profiles/lib/
После чего, запускаем саму утилиту.
./osrm-extract map.osm
Надо опять отдать должное разработчикам — они честно предупредили о том, что процесс долгий, и даже написали что у них он занял 65 минут на конфигурации Core i7 with 8GB RAM and (slow) 5400 RPM Samsung SATA.
На нашем сервере (Core i5, 8GB RAM, 5400), файл с картами размером 35 ГБ в итоге обрабатывался 4 часа. В дальнейшем мы попробовали в качестве эксперимента взять карту европейской части России — на это ушло 30 минут.
Разработчики для ускорения советуют во-первых, загружать карты в формате PBF, а во-вторых — переходить на SSD диски :)
И вот, у нас получился файл с расширением osrm. Но, нужно воспользоваться еще одной утилитой из комплекта — osrm-prepare.
Она создает несколько файлов: hsgr — иерархию маршрутов, для нахождения наиболее подходящих, nodes — граф маршрутов, и файлы с индексами. Запустив утилиту,
./osrm-prepare map.osrm
мы опять сели пить кофе, т.к. процесс в очередной раз занял несколько часов. И вот, увидев на экране заветные 100% мы запустили сам сервер:
./osrm-routed
Но, перед запуском, как оказалось, нужно положить, в директории с сервером, файл инициализации server.ini. В нем мы указываем какие файлы и откуда брать, и несколько параметров запуска.
Threads = 4
IP = 0.0.0.0
Port = 5000
hsgrData=./map.osrm.hsgr
nodesData=./map.osrm.nodes
edgesData=./map.osrm.edges
ramIndex=./map.osrm.ramIndex
fileIndex=./map.osrm.fileIndex
namesData=./map.osrm.names
Ура! Сервер запустился и радостно замигал строчками сообщающими нам что он готов создавать маршруты. Но, смотреть на возвращаемый JSON было не интересно. И на этот случай, у разработчиков есть небольшое web-приложение для использования OSRM.
Скачиваем исходники по этому адресу. Выкладываем их на веб-сервер. Больше никаких дополнительных настроек делать не надо — достаточно зайти на страничку http://<your-server>/osrm/main.html
По умолчанию, приложение настроено на демо-сервер OSRM, но открыв файл OSRM.config.js мы можем поменять адрес сервера на тот, который установили, поменяв параметр url в разделе ROUTING_ENGINES.
И вот у нас есть собственный сервис построения маршрутов. Спасибо, за внимание!
Автор: antaresm