Программы, необходимые перед началом работы;

  • PostgreSQL с включенными расширениями Postgis и PgRouting
  • Node.js
  • Базовые знания Node.js
  • Необязательно: Почтальон (для проверки маршрутов)

В прошлом люди использовали звезды, солнце или географические знаки, чтобы найти дорогу из одного места в другое. Подумайте о капитане, направляющемся в Америку в 1800-х годах, он должен использовать такие инструменты, как карта, секстант, компас, хронометр и т. д., чтобы точно ориентировать свою команду над океаном. Ночью он должен наблюдать за известными звездами, используя стартовую карту, а днем ​​он должен корректировать направление своих кораблей, глядя на Солнце. Они всегда отводили взгляд, чтобы ориентироваться.

В настоящее время наше представление о навигации изменилось. Смартфоны, GPS и полезные мобильные приложения делают задачу навигации простой и точной, как никогда раньше. Все, что вам нужно сделать сейчас, это выбрать место, куда вы хотите пойти! Интернет предоставляет вам данные о трафике, предложения по сокращению пути и даже предупреждения о закрытых дорогах.

Mapbox, HERE, GraphHopper и Google Maps предоставляют разработчикам высококачественные API маршрутизации. Вы можете интегрировать эти API, чтобы воспользоваться новейшими функциями, такими как инструкции на человеческом языке. Конечно, они взимают плату, когда вы пользуетесь услугой. Что делать, если вы хотите создать API маршрутизации бесплатно?

Загрузка данных OSM

Мы собираемся использовать бесплатные данные OSM на нашем внутреннем сервере маршрутизации. OSM — это карта мира с открытым исходным кодом, предназначенная для совместной работы. Существуют различные способы загрузки этих данных;

  1. Вы можете напрямую перейти на веб-сайт OSM и использовать кнопку экспорта.
  2. Overpass Turbo API — еще одно хорошее решение, поскольку вы можете использовать фильтры для получения только нужных данных OSM.
  3. Вы можете написать собственное веб-приложение для загрузки данных OSM, используя предоставленный OSM API.

Используйте эту ссылку для загрузки данных, которые я использовал.

Данные OSM загружаются в формате .osm. Это форма данных узлов, путей и отношений в формате XML.

Я предпочитаю первый вариант, потому что программа osm2pgrouting, которую мы собираемся использовать на следующем шаге, может очищать данные и вставлять в Postgres только данные, связанные с маршрутизацией.В конце вы должны были загрузить файл с расширением .osm для нужной области. .

Перенесите загруженные данные в PostgreSQL с помощью osm2pgrouting

Теперь, когда у нас есть данные, мы можем вставить их в PostgreSQL, используя специальный инструмент под названием osm2pgrouting. Он вставляет данные OSM в базу данных, поэтому вам не нужно беспокоиться о топологии. Прежде чем использовать osm2pgrouting, вы должны создать базу данных с именем routing_db (вы можете назвать свою базу данных как угодно, но не забудьте изменить ее соответствующим образом на следующих шагах!). Теперь откройте pgAdmin или из командной строки запустите эти две команды, чтобы активировать расширения;

СОЗДАТЬ РАСШИРЕНИЕ postgis;
СОЗДАТЬ РАСШИРЕНИЕ pgRouting;

Теперь откройте командную строку (или терминал, если вы используете Ubuntu или Mac) и перейдите в папку, в которой установлен PostgreSQL. Внутри папки найдите папку с именем bin.

Перед запуском команды вы должны создать XML-файл, который будет интерпретировать данные OSM при вставке базы данных. Этот XML-файл называется mapconfig.xml. XML-файл по умолчанию можно найти здесь; https://github.com/pgRouting/osm2pgrouting/blob/master/mapconfig.xml

После загрузки скопируйте файл mapconfig.xml в папку bin.

Теперь запустите команду ниже;

osm2pgrouting -d routing_db -U postgres -h localhost -p 5432 -W ваш_пароль -f map1.osm -c «ваш\путь\к\mapconfig.xml» — очистить

Теперь у вас есть данные OSM в базе данных PostgreSQL.

Тестирование данных маршрутизации с помощью SQL

Откройте новую вкладку запроса в pgAdmin и вставьте запрос, показанный в блоке;

SELECT ST_AsGeoJSON(ST_Union((the_geom))) FROM ways WHERE id in
(SELECT edge FROM pgr_dijkstra(
 ‘SELECT id,
 source,
 target,
 length AS cost
 FROM ways’,
 (SELECT id FROM ways_vertices_pgr
 ORDER BY the_geom <-> ST_SetSRID(ST_Point(32.824, 39.937), 4326) LIMIT 1), 
 (SELECT id FROM ways_vertices_pgr
 ORDER BY the_geom <-> ST_SetSRID(ST_Point(32.823, 39.934), 4326) LIMIT 1),
 directed := true) foo);

Запрос может показаться немного запутанным, даже если вы знакомы с SQL, потому что под основным запросом есть три вложенных запроса. На самом деле это самый простой запрос, который вы можете использовать в pgRouting. По сути, он принимает две координаты в качестве входных данных и возвращает линию, соединяющую эти две точки как geojson.

Теперь при запуске этого запроса он возвращает геоджсон, как показано ниже;

{“type”:”MultiLineString”,”coordinates”:[[[32.8236785,39.9328593],[32.8236427,39.9331657],[32.8235632,39.9338447]],[[32.8239203,39.9365802],[32.8242237,39.9362869],[32.824926,39.9355603],[32.8254992,39.9350228],[32.8258432,39.9347217]],[[32.824946,39.932861],[32.8247683,39.9328783],[32.8237783,39.9328717],[32.8236785,39.9328593]],[[32.8258432,39.9347217],[32.8256654,39.9346335],[32.8252273,39.9343465],[32.8250696,39.9339926],[32.8250301,39.9336153],[32.8250189,39.9335673],[32.8249706,39.9330756],[32.824946,39.932861]]]}

Вы можете использовать красивый инструмент, такой как geojson.io, чтобы проверить этот результат. Просто скопируйте результат запроса и вставьте его в белую область. Вы должны увидеть что-то вроде этого;

Создание внутреннего сервера, возвращающего результат маршрутизации

Теперь, когда мы уверены, что pgRouting возвращает желаемые результаты, мы можем настроить наш внутренний сервер с помощью Node.js. Вы также можете скачать код на Github.

Наша структура папок будет такой;

server.js
node_modules
.env
package.json
package-lock.json
server
├── routes
│   ├── api.router.js
├── db
│   ├── index.js
├── controllers
│   ├── api.routing.controller.js

Начнем с server.js. Это будет точка входа для нашего приложения Node.js.

Убедитесь, что ваши значения PGUSER и PGPASSWORD верны.

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

Тестирование сервера

Я использую Postman для тестирования серверных точек, но вы можете использовать что угодно, включая Google Chrome. Когда вы отправляете запрос на сервер, вы должны получить результат geojson, который мы получили из базы данных на предыдущих шагах.

Спасибо, если вы дочитали до этого поста. Если вы нашли этот пост полезным, пожалуйста, поделитесь, если вы видите какие-либо ошибки, пожалуйста, прокомментируйте!