Вступление
Проект http: //www.openstreetmap.org%5D [OpenStreetMap] состоит из необработанных картографических данных, которые собирают и объединяют тысячи пользователей. Однако его политика открытого доступа вызвала ряд сопутствующих проектов, которые в совокупности охватывают многие функции, обычно предлагаемые коммерческими картографическими услугами.
Наиболее очевидным преимуществом использования программного обеспечения на основе OpenStreetMap по сравнению с коммерческим решением является экономичное удобство, поскольку OpenStreetMap поставляется как бесплатное (как в пиве, так и в речи) программное обеспечение. Недостатком является то, что для настройки работающего веб-сервиса требуется небольшая настройка.
Это руководство охватывает настройку и обслуживание веб-службы, которая может ответить на такие вопросы, как:
-
Какая улица ближе всего к данной паре координат?
-
Как лучше всего добраться из пункта А в пункт Б?
-
Сколько времени нужно, чтобы добраться из пункта А в пункт Б на машине или пешком?
Программное обеспечение, которое делает это возможным, представляет собой проект с открытым исходным кодом под названием http://project-osrm.org [Open Source Routing Machine (OSRM)], который основан на данных OpenStreetMap. Функциональные возможности для встраивания OpenStreetMaps в веб-страницы уже предоставлены такими API, как http://openlayers.org [OpenLayers].
Предпосылки
Чтобы следовать этому уроку, вам понадобится:
-
A Ubuntu 14.04 Droplet.
-
Пользователь sudo, не являющийся пользователем root, который вы можете создать, следуя https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04 в этом руководстве]. В этом руководстве предполагается, что ваше имя пользователя sudo без полномочий root равно
+ osrm +
. -
Рекомендуется 4 гигабайта свопа, как описано в Как добавить своп в Ubuntu 14.04.
Некоторые операции в этом руководстве, такие как сборка OSRM из исходного кода и этапы предварительной обработки, требуют большого объема памяти. На дроплетах с малым объемом памяти эти операции могут завершаться неудачей, поэтому необходимо выделить файл подкачки.
Веб-служба обычно не требует дополнительного подкачки во время работы, поэтому этот файл подкачки может быть удален после завершения установки. Однако при обслуживании больших карт может понадобиться небольшой файл подкачки, особенно в каплях с малым объемом памяти. Если это так, следуйте инструкциям в приведенном выше руководстве, чтобы сделать файл подкачки постоянным.
Шаг 1 - Обновления и безопасность
На этом этапе мы настроим обновления для сервера.
Важно поддерживать наш сервер в актуальном состоянии и обеспечивать его безопасность с течением времени. Поэтому сначала мы обновляем все пакеты в системе, выполняя следующие команды.
sudo apt-get update
sudo apt-get upgrade
Затем мы включаем автоматические обновления безопасности Ubuntu. Для этого нам сначала нужно установить необходимые пакеты.
sudo apt-get install unattended-upgrades
Затем включите автоматическое обновление, отредактировав файл + / etc / apt / apt.conf.d / 10periodic +
. Нам нужно использовать + sudo +
, потому что это общесистемный файл конфигурации.
sudo nano /etc/apt/apt.conf.d/10periodic
Добавьте следующую строку в конец файла, затем сохраните и закройте его.
APT::Periodic::Unattended-Upgrade "1";
Шаг 2 - Загрузить экспорт карты
На этом этапе мы выберем и загрузим карту экспорта.
Чтобы сохранить все в чистоте и порядке, рекомендуется создать специальный каталог, в котором можно создать код, обработать карту и т. Д.
mkdir osrm
Перейдите в новый каталог.
cd osrm
Наш веб-сервис будет основан на экспорте карт из OpenStreetMap. Есть несколько возможных способов получить экспорт карт.
Первый вариант - указать браузеру страницу export на OpenStreetMap, увеличить интересующую область и нажать * Export *. (Вам может понадобиться использовать один из других источников, если собственный экспорт не работает; Overpass API - хороший выбор.) Это позволит вам точно выбрать, какие области включить в вашу карту, и, в общем, сократить время предварительной обработки.
Однако существуют ограничения на размер экспорта, который вы можете получить с веб-сайта OSRM, поэтому вы можете загрузить готовый экспорт. Ряд сервисов, таких как http://download.geofabrik.de [Geofabrik] и Mapzen, предлагают обновленные и готовые карты экспорта стран и отдельных городских районов, которые хороши для большинства случаев использования.
Какой бы метод вы ни использовали, скопируйте URL-адрес экспорта и загрузите его на свой дроплет.
wget -O map.osm
Теперь у вас должен быть файл с именем + map.osm +
в вашем рабочем каталоге.
Шаг 3 - Установите зависимости
На этом этапе мы установим зависимости OSRM.
OSRM должен быть скомпилирован из исходного кода, поэтому сначала нам нужно установить необходимый механизм сборки. К счастью, Ubuntu поставляется с удобным метапакетом, называемым + build-essential +
, который содержит необходимый набор инструментов компилятора. Кроме того, нам понадобится + git +
для получения исходного кода OSRM и + CMake +
для генерации системы сборки. Следующая команда установит все 3 из них.
sudo apt-get install build-essential git cmake
OSRM является довольно сложным программным обеспечением и опирается на ряд библиотек. Мы можем установить необходимые зависимости с помощью следующей команды.
sudo apt-get install libboost-all-dev libtbb-dev liblua5.2-dev libluabind-dev libstxxl-dev libxml2 libxml2-dev libosmpbf-dev libbz2-dev libprotobuf-dev
Эти зависимости используются для разных вещей. Lua используется для определения пользовательских сценариев профиля скорости, например, определяя, что на второстепенной дороге, в отсутствие ограничений, автомобиль движется со средней скоростью 80 км / ч, а на гравийной дороге средняя скорость составляет 50 км / ч. STXXL - это версия стандартной библиотеки C ++, которая использует дисковое пространство в качестве памяти, используемой для манипулирования большими файлами. Буферы LibXML и Protocol используются для загрузки, записи и манипулирования файлами OSM, а Boost и TBB используются для распараллеливания и представления структур данных.
Шаг 4 - Компиляция OSRM
На этом этапе мы получим исходный код OSRM и скомпилируем его.
Благодаря тому, что в качестве системы сборки OSRM выбрана CMake, после установки зависимостей довольно легко генерировать файлы сборки и компилировать OSRM.
Сначала мы клонируем исходный код с https://github.com/Project-OSRM/osrm-backend[page проекта. Проект состоит из нескольких хранилищ, работающих с различными функциями. Нас интересует серверная часть (серверная часть).
git clone https://github.com/Project-OSRM/osrm-backend.git
Далее перейдите в каталог кодов.
cd osrm-backend
Следующим шагом является использование CMake для генерации файлов сборки. Рекомендуется собирать OSRM в выделенном каталоге + build +
в корневом каталоге исходного кода, чтобы избежать загрязнения исходных каталогов временными файлами сборки.
Создайте каталог сборки.
mkdir build
Переместитесь в каталог сборки.
cd build
Наконец, мы сгенерируем файлы сборки с помощью + cmake +
. Эта команда сгенерирует несколько каталогов и файлов Makefile в дереве каталогов + build +
.
cmake ..
Если вы получили здесь ошибку, убедитесь, что вы включили обмен с помощью инструкций в предварительных условиях.
Далее скомпилируйте и установите OSRM.
sudo make install
-
Примечание *: это может занять от 5 до 10 минут.
Сборка с + sudo +
необходима здесь, потому что цель установки скопирует некоторые исполняемые файлы в двоичном пути системы, включая те, которые нам понадобятся. А именно:
-
+ osrm-extract +
, который открывает файл карты и запускает первый шаг предварительной обработки данных. -
+ osrm-prepare +
, который обрабатывает выходные данные+ osrm-extract +
и вычисляет время прохождения для всех краев карты в соответствии с заданным профилем скорости Lua. -
+ osrm-routed +
фактический демон веб-службы, который позволяет нам запрашивать расстояния и местоположения.
Шаг 5 - Настройте STXXL
На этом этапе мы создадим файл конфигурации для STXXL.
Перед запуском веб-сервиса нам нужно предварительно обработать экспорт нашей карты. Поскольку мы установили необходимые двоичные файлы в системный путь, мы можем сделать это из любого места. Для целей данного руководства мы запустим предварительную обработку в корне созданного нами каталога + osrm +
.
Сначала перейдите в каталог + osrm +
.
cd ~/osrm
Предварительная обработка карты требует много памяти. По этой причине OSRM использует библиотеку под названием STXXL для сопоставления своих внутренних операций на жестком диске. STXXL использует конфигурационный файл с именем + .stxxl +
, который находится в том же каталоге, где вы запускаете программное обеспечение, чтобы определить, сколько места выделено для структур данных STXXL. В зависимости от емкости нашего Droplet и размера карты, которую мы хотим обработать, нам нужно написать подходящий файл конфигурации + .stxxl +
, выделяя достаточно памяти для операций.
Создайте и откройте + .stxxl +
для редактирования.
nano .stxxl
Файл должен содержать одну строку в формате + disk = ,, +
, где + path +
- это путь к файлу размещения, +acity +
- емкость файла, а + access +
реализация доступа к файлам
Вот пример файла + .stxxl +
. Вы можете вставить это в + .stxxl +
, но, возможно, захотите изменить размер файла в зависимости от используемой карты и размера вашей капли. См. Http://stxxl.sourceforge.net/tags/master/install_config.html[documentation] для дополнительных параметров.
disk=/tmp/stxxl,10G,syscall
Сохраните и закройте + .stxxl +
.
Шаг 6 - Извлечь карту
На этом этапе мы будем извлекать карту.
Первым этапом предварительной обработки является извлечение карты. Команда + osrm-extract +
ожидает путь экспорта карты в качестве аргумента и предполагает наличие подходящего скрипта профиля скорости с именем + profile.lua +
в рабочем каталоге. Профиль скорости используется для определения того, какой из доступных маршрутов можно использовать (например, профиль скорости для грузовика может запрещать некоторые улицы).
Бэкэнд-дистрибутив OSRM включает в себя ряд скриптов профилей скорости по умолчанию в каталоге + examples +
репозитория. В этом уроке мы будем использовать профиль + car.lua +
, который подходит для большинства случаев использования.
Поскольку сценарий профиля скорости может зависеть от некоторых функций Lua, определенных в библиотеке профилей, мы также создаем символическую ссылку на него в том же каталоге, выполняя следующие две команды.
ln -s osrm-backend/profiles/car.lua profile.lua
ln -s osrm-backend/profiles/lib
Наш экспорт карт называется + map.osm +
, поэтому далее запустите:
osrm-extract map.osm
Этот шаг генерирует группу файлов в каталоге предварительной обработки, включая + map.osrm +
, который является входом для следующего шага.
Шаг 7 - Вычислите время в пути
На этом этапе мы рассчитаем время в пути для карты.
Этот шаг выполняется командой + osrm-prepare +
, которая снова использует скрипт профиля скорости для вычисления времени прохождения для каждого края графа карты. Для этого выполните следующую команду.
osrm-prepare map.osrm
На этом этапе также создаются некоторые дополнительные файлы, необходимые для веб-службы, которые мы настроим в следующем разделе.
Шаг 8 - Запустите и протестируйте веб-сервис
На этом шаге мы запустим OSRM и проверим его работу через браузер.
Бэкэнд OSRM поставляется с последней командой + osrm-routed +
, которая может читать обработанную карту и позволяет запрашивать ее через API веб-службы. Чтобы проверить это, запустите:
osrm-routed map.osrm
Теперь, указав в браузере + http: //: 5000 +
, вы сможете увидеть веб-сервис в действии. Появится сообщение об ошибке, подобное + {" status_message ":" Строка запроса повреждена близко к позиции 0 "," status ": 400} +
, поскольку вы не используете правильный формат запроса.
В качестве теста выберите набор координат широты и долготы в границах карты и перейдите по следующему URL-адресу, заменив ` и `
на выбранные вами координаты.
http://:5000/nearest?loc=,
Вы должны увидеть вывод JSON, похожий на этот:
{
"name": "",
"mapped_coordinate": [
,
],
"status":0
}
Если вместо этого вы получите сообщение об ошибке, возможно, вы выбрали набор координат вне границ карты, иначе синтаксис вашего запроса может быть неправильным. Чтобы узнать больше о доступных запросах, ознакомьтесь с server API.
Теперь вы можете остановить + osrm-routed +
, используя + CTRL + C +
.
Шаг 9 - Настройте Nginx
На этом шаге мы настроим Nginx для работы с + osrm-routed +.
Теперь у нас есть работающий веб-сервис, но запрашивать его, указав порт, неудобно. Более того, если мы решаем обслуживать разные карты или карты, обработанные с разными скоростными профилями, мы хотим избежать запоминания набора портов.
Nginx - это высокопроизводительный веб-сервер, который также может работать в качестве прокси-сервера и служить шлюзом для наших веб-сервисов. Настроить его для работы с + osrm-routed +
довольно просто.
Сначала мы устанавливаем Nginx.
sudo apt-get install nginx
Далее мы добавляем файл конфигурации для наших веб-сервисов. Nginx использует два каталога для своих файлов конфигурации, специфичных для сайта: + / etc / nginx / sites-available +
(все сайты, которые можно обслуживать) и + / etc / nginx / sites-enabled +
(все обслуживаемые сайты) ). Стандартный способ добавления сайта состоит в том, чтобы добавить его файл конфигурации в + sites-available +
, а затем символически связать его с + sites-enabled +
.
Итак, сначала мы добавим файл конфигурации для OSM в + sites-available
.
sudo nano /etc/nginx/sites-available/osrm.conf
Наш конфигурационный файл будет определять + upstream +
, который указывает на наш веб-сервис и сервер, который прослушивает порт 80 и перенаправляет подмножество запросов в наш апстрим.
Вставьте следующий файл конфигурации в + osrm.conf +
. Вам нужно будет указать две переменные, которые выделены ниже: IP-адрес вашего сервера и путь (который будет использоваться для доступа к веб-службе, как в + http: /// +
).
upstream osrm {
server 0.0.0.0:5000;
}
server {
listen 80;
server_name ;
location {
proxy_pass http://osrm/;
proxy_set_header Host $http_host;
}
}
После сохранения файла перейдите в каталог + sites-enabled
.
cd /etc/nginx/sites-enabled
Затем мы можем связать файл + osrm.conf +
.
sudo ln -s /etc/nginx/sites-available/osrm.conf
Далее перезагрузите конфигурацию.
sudo service nginx reload
Наконец, перезапустите Nginx.
sudo service nginx restart
Теперь повторите + osrm-routed +
.
osrm-routed ~/osrm/map.osrm
Вы должны иметь доступ к веб-сервису, указав нашему браузеру + http: /// +
. Обратите внимание, что вам больше не нужно указывать порт. Теперь вы можете остановить + osrm-routed +
, используя + CTRL + C +
.
Добавляя больше восходящих потоков и расположений и выполняя + osrm-routed +
, указывая порт с помощью + -p +
или + - port +
, мы можем запускать больше экземпляров веб-службы и связывать их с разными путями. Этот учебник не будет вдаваться в подробности об этом, но вы можете проверить OSRM документацию бэкэнда для получения дополнительной информации.
Шаг 10 - Установите и настройте Supervisor
На этом этапе мы установим и настроим Supervisor для поддержания работы Nginx, что позволит нашему веб-сервису быть доступным через перезагрузки.
Nginx теперь выступает в качестве шлюза для нашего веб-сервиса. Однако мы запустили его вручную, поэтому, если мы выйдем из системы, он перестанет работать. Для того, чтобы наши веб-службы выживали после перезагрузок и, в общем, чтобы они восстанавливались после возможных сбоев, мы можем использовать инструмент под названием http://supervisord.org [Supervisor].
Supervisor - это система управления процессами, которая в основном заботится о том, чтобы службы работали должным образом. Настроить это довольно легко. Сначала мы устанавливаем сам Supervisor.
sudo apt-get install supervisor
Затем мы добавляем наш веб-сервис в пул сервисов, контролируемых Supervisor, добавляя новый файл конфигурации.
sudo nano /etc/supervisor/conf.d/osrm.conf
Файл конфигурации должен содержать определение этой формы для каждого веб-сервиса, который мы хотим контролировать, а имя программы должно отличаться для каждого веб-сервиса.
Вставьте приведенную ниже конфигурацию в файл + osrm.conf +
, затем сохраните и закройте ее.
[program:osrm]
directory=/home/osrm/osrm
command=/usr/local/bin/osrm-routed -p 5000 map.osrm
user=osrm
Эта конфигурация говорит о том, что мы хотим, чтобы пользователь + osrm +
оставил команду + / usr / local / bin / osrm-routed -p 5000 map.osrm +
работающей, и чтобы она запускалась из указанного каталога, + / home / osrm / osrm +
(именно так мы можем указать + map.osrm +
в качестве относительного пути в команде). В этом примере мы указали порт для + osrm-routed +
, используя + -p +
, чтобы можно было добавить несколько программ, увеличив порт.
После сохранения и закрытия файла перезапустите Supervisor.
sudo service supervisor restart
Затем мы можем проверить состояние веб-службы, запустив:
sudo supervisorctl status
Если все хорошо, мы должны увидеть что-то похожее на это
osrm RUNNING pid 12698, uptime 0:00:40
Это означает, что наш веб-сервис работает. Поскольку восходящий поток указывает на порт 5000, Nginx сможет обслуживать его по указанному пути.
Заключение
В этом руководстве рассказывается об установке серверной части OSRM, но дополнительная документация доступна по адресу this page.
На момент написания статьи серверная часть OSRM все еще находилась в стадии бета-тестирования и имеет некоторые жестко ограниченные ограничения на количество местоположений, которые могут быть включены в один запрос (в настоящее время 100, что влияет на API матрицы времени). Такие ограничения могут быть отключены, но для этого необходимо изменить исходный код + osrm-routed +
.
В зависимости от размера вашей карты и емкости вашей капли вам может потребоваться выделить больший файл подкачки или увеличить емкость в конфигурационном файле «+ .stxxl +», чтобы веб-служба работала правильно. Возможно, вам придется протестировать несколько настроек, чтобы увидеть, что лучше всего подходит для вашей настройки.