2014-09-03 3 views
1

У меня есть 2750 городских центров в Бельгии. Мне нужно знать расстояния между каждыми 2 центрами города. Но это приводит к матрице 57 МБ, просто чтобы запомнить эти расстояния (даже маршруты), так что жутко масштабируется.Как GraphHopper обрабатывает точку на пересечениях шоссе?

Вместо этого, я рассматриваю использование пересечений Highway в качестве концентраторов. В основном, каждый город знает, что это близлежащие города, и это близлежащие хабы (= пересечение шоссе). Все хабы знают расстояние друг к другу.

Таким образом, расстояние от 1 города A до другого не-близлежащего города B, может быть рассчитано на расстоянии cityA -> hubX -> hubY -> cityB. Поскольку в большинстве городов обычно есть 3 узла, мне может потребоваться рассмотреть все 9 комбинаций и взять кратчайший. Но в любом случае он должен масштабировать лучшую память.

Теперь проблема: Могу ли я описать пересечение шоссе как единую точку? Подумайте об этом: шоссе состоит из двух дорог (по одному в обоих направлениях), поэтому центр пересечения дорог имеет 4 дороги (даже не считая оружия).

ответ

1

Некоторые идеи:

  1. вы можете хранить эти расстояния внедорожных кучи или на диске с помощью MapDB или GraphHopper его упрощенными реализациями DATAACCESS делает RAM-независимым
  2. вы можете использовать поплавок, который должен быть только ~ 30 МБ или даже короткие и просто использовать километры
  3. вы можете попробовать по требованию маршрутизации, без сохранения, так как для вычисления маршрута требуется всего несколько мс. Отключение инструкций и расчетных точек делает его даже в два раза быстрее. Вы даже можете отключить вычисление расстояния и просто использовать path.weight - это даст вам еще одно хорошее ускорение, но требует использования более низкого уровня GraphHopper и рекомендуется только в том случае, если вы знаете, что делаете.

Теперь на ваш вопрос. GraphHopper использует графическую модель, состоящую из узлов (переходов) и ребер (улиц, соединяющих переходы). Тем не менее кольцевая развязка состоит из нескольких узлов. Но в общем случае должно быть возможно использовать такой «уходящий» узел как «hub-id».

Я вижу два подхода для расчета этих узлов:

  • либо запустив сжимающих иерархии и собирание наивысшие 1000 узлов и определить их как концентраторы - это было бы похоже на то, что описано в "transit node routing '
  • или вы рассчитываете маршруты из одного города на, например, все другие города (или только 8 географические направления) и найти последние общие узлы двух маршрутов, чтобы определить некоторые

Для обоих подходов вы должны DIGG немного глубже в GraphHopper и вам, вероятно, потребуется lower level API ,

+0

Во-первых, почему идея не будет работать в моем конкретном случае (хотя они являются хорошим советом в противном случае): выход на диск слишком медленный (включая SSD). Расчет нескольких мс на расчёт слишком медленный во время решения (не во время предвычисления). Я пробовал 32-разрядные номера (поплавки также 32-разрядные), а 20-мегапиксельная локация использует почти 2 ГБ оперативной памяти: '(20k) ² * 4' просто таков. Я хочу увеличить до 100 тыс. Мест. –

+0

Иерархия сокращений может не сработать в моем случае, поскольку узловые узлы не являются точками в моем наборе данных: точки - это центры городов, узлы узлов - связанные с шоссе. Так что листья ... –

+0

...вычисление маршрутов и поиск последних общих узлов. Мне очень нравится эта идея :) Это просто не так просто реализовать. Но это избавляет меня от того, что я выбираю вручную: –

 Смежные вопросы

  • Нет связанных вопросов^_^