Допоможіть вибрати відповідний двигун маршрутизації


16

Я будую систему планування маршрутів, але мені ще належить вирішити, який основний двигун маршрутизації я буду використовувати. Поки що я знайшов pgrouting та neo4j.

Я маю свою маршрутну мережу в базі даних postgresql / postgis (імпортовано з форм-файлу). Я зробив запити для вилучення вузлів (кінцевих точок способів, коли вам потрібно прийняти рішення, в якому напрямку рухатися або тупиків) та витягнути краї (часто складаються кількома послідовними способами). Усі мої краї двосторонні.

Моя основна мета - обчислити маршрути в цій мережі, використовуючи алгоритм зірки A, де відстань = вартість.

Моє відчуття говорить про те, що база даних графіків на зразок neo4j - це шлях (як здається, зроблений саме для цієї мети), але вони, схоже, не підтримують A-зірку за замовчуванням, а також немає справжнього геометричного відчуття . Здається, краще підходить для соціальних мереж замість карт.

  • Чи могло б pgrouting задовольнити мої потреби?
  • Це досить швидко для запитів на льоту (+ -2000 вузлів, + -4000 ребер)? Зазвичай це буде декілька мс для A-зірки, але я не впевнений у цій реалізації на sql.
  • Чи надає мені pgrouting A-star список вузлів та ребер?
  • У більшості прикладів, які я бачу щодо pgrouting, я помічаю, що зазвичай існує список команд після обчислення маршруту (наприклад, "На X повернути ліворуч тощо"). Чи виробляє це пророщування це чи це з іншої системи?

Сподіваюся, хтось може дати мені трохи інформації про те, яку систему вибрати. Neo4j, pgrouting або інша система.


3
Я думаю, що більшість алгоритмів маршрутизації не оперують "почуттям геометрії", натомість обчислюється геометричний атрибут і використовується як вартість (тобто вимірювання відстані від полілінії). Я ніколи не використовував Neo4j, але він виглядає дійсно здатним, і, можливо, незабаром його використовуватиму. Я щойно переглянув документацію, і можливо, можливо використовувати A-Star: docs.neo4j.org/chunked/stable/graph-algo.html docs.neo4j.org/chunked/stable/… pgRouting також здатний, і Я величезний шанувальник цього. Цікаво було б порівняти ефективність цих двох рішень.
Аллан Адаїр

По-перше, я б запропонував поглянути на урбансим модель використання земельних ресурсів з відкритими ресурсами . Що стосується вашого питання про маршрутизацію, якщо це планування програми, то я б запропонував спочатку переглянути програмне забезпечення типу TransCAD, CUBE, PLANAR або EMME / 2 для функціональності та інтерфейсу користувача. Зазвичай вони видають 1-годинну або 2-годинну демонстраційну версію свого програмного забезпечення (програмне забезпечення ви можете запустити протягом години або двох, щоб відчути це). Якщо ви хочете створити щось для використання в Інтернеті або для настільних ПК, то подивіться на pgRouting; однак, з досвіду, іноді, це не так просто, як те, як майстерня / підручник зображує це.
dassouki

Я почав пгутировать із зірковою роботою, і це приголомшливо! Він відповідає так на мої перші 3 запитання. Ще мені цікаво, чи хтось тут щось знає про генерування багатослівних навігаційних напрямків. Чи є якийсь інструмент, який співпрацює з pgrouting, який генерує багатослівні вказівки ("Через 200 м повернути вліво тощо") з виводу обчисленого маршруту?
mrg

Відповіді:


8

Зараз я досліджую ту саму проблему, що і ви, з метою дослідження. Перш ніж я почав тестувати ці дві бази даних, я мав таку ж презумпцію, що і ви. Ця база даних графіків Neo4j була б ідеальним рішенням для подібної проблеми. І частково це є, але з великою кількістю проблем.

Перша проблема полягає в тому, що A-Star реалізується лише в тому випадку, якщо ви використовуєте вбудовану базу даних, а не через API REST (сервер). Якщо ви хочете використовувати Neo4j з API REST, то підтримується лише алгоритм Dijkstra. Друга проблема - вимоги до апаратної пам'яті для Neo4j. Для маршрутизації (Dijkstra) в "більших" мережах потрібно багато оперативної пам'яті. Під великою мережею я маю на увазі щось на зразок розміру дорожньої бази даних Німеччини OSM . Я провів свої тести на 6 Гб оперативної пам’яті (це все, що я маю на даний момент), і лише менші мережі могли бути маршрутизовані без помилок винятку OutOfMemory. "Малі" мережі в моїх тестових випадках є, наприклад, дорожньою базою даних OSM для Австрії чи Хорватії. Одночасні запити, які я досі не тестував у Neo4j.

Всі ці проблеми не існують у pgRouting. Пам'ять не така проблема, але паралельні запити збільшують необхідний об'єм пам'яті. Наприклад, якщо у вас є два одночасні запити, потрібен подвійний об'єм пам'яті. Це не було проблемою навіть для німецького набору даних OSM, pgRouting без проблем перенаправляв усі паралельні запити.

Продуктивність: У більшості випадків Neo4j перевершує pgRouting. Але лише за наявності достатньої пам’яті для даного набору даних і якщо всі вузли та зв’язки знаходяться в пам’яті (гарячий старт). Збільшення / зниження продуктивності залежить від безлічі факторів, але в основному від розміру мережі та відстані (стрибки) між джерелом та цільовим вузлом.

Ваш розмір мережі досить невеликий, тому у вас не повинно виникнути проблем із пам'яттю. Напевно, Neo4j - це не поганий вибір, але вам доведеться адаптуватися до "трохи" іншої моделі даних, ніж у стандартних базах даних.

Щоб відповісти на запитання:

  • У pgRouting вам не доведеться турбуватися про реалізацію AStar в sql, що вже реалізовано.
  • Так, pgRouting може дати вам список вузлів та ребер
  • Я не думаю, що pgRouting може надати вам таку інформацію за допомогою певної роботи над запитами. Але, можливо, я помиляюся, можливо, хтось це зробив і може допомогти вам більше в цьому питанні.

Я не знаю, чи допоможе це вам безпосередньо, але один з найшвидших серверів маршрутизації, який я знайшов, - osm2po . Він працює з набором даних OSM і є досить швидким. Наразі реалізовано лише dijkstra, але розробник оголосив також AStar. Я сподіваюся, що щось із цього вам допоможе. :)


Це добре почути від того, хто фактично перевірив обидві системи. Тим часом у мене набагато більше досвіду роботи з pgrouting. Я помітив, що pgrouting будує весь графік для кожного запиту, і це робить його досить повільним для великих мереж (розмір Німеччини), тому я не розумію, чому для pgrouting потрібно менше пам'яті, ніж Neo4j. Наступною моєю спробою буде отримати весь графік статики в таран і маршрут на цьому (з neo4j, nx_spatial тощо), щоб забезпечити швидший відповідь на маршрутизацію в режимі реального часу.
мр

Так, чим більше графік, тим більша різниця між pgrouting та neo4j. Можливо, якщо ви помістите весь графік в пам'ять, це було б найшвидшим рішенням, про це не виникає сумнівів. Neo4j відбувається досить швидко, коли весь графік завантажується в пам'ять. Не знаю про nx_spatial, я його не перевіряв, але, можливо, буду. Я вважаю, що це може перевершити навіть Neo4j. Але це рішення добре, якщо воно прийнятне для вашої програми.
Маріо Мілер

1
@mrg не впевнений, чи все ж це проблема для вас, але є OSRM (C ++) та GraphHopper (Java). Обидва масштаби до світових графіків і, наприклад, GraphHopper потребують менше 1 Гб для Німеччини (де я є автором)
Karussell

Каруссел, дякую за інформацію! Я вже знайшов OSRM, але GraphHopper для мене новий.
mrg

0

Ви також можете ознайомитися з нашим пакетом RW Net 4 (www.routeware.dk). Він може робити такі найкоротші обчислення шляху, використовуючи A * прямо з файлу SHP. Базовий пакет у розмірі 500 євро здається достатнім для ваших потреб.


Дякую за вашу швидку відповідь, але мій проект все ще знаходиться у фазі, в якій я не впевнений, чи вимагає витратити гроші зараз. Крім того, я почав працювати над моїми даними, так що поки не вирішено невідоме.
mrg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.