Как построить график «дорог» в базе данных из файла .osm - PullRequest
5 голосов
/ 26 апреля 2011

Требуемый результат:

База данных с двумя таблицами, «ребрами» и «узлами», которые можно использовать для создания графика, который представляет все проезжие дороги (шоссе) вопределенный район (например, город).Набор данных анализируется из файла .osm.

Справочная информация:

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

Сначала я попытался вручную извлечь различные данные в базу данных (сценарии php):

  • разобрать все узлы из.OSM-файл в таблицу «узлов»
  • парсит все ребра в таблицу «ребер» (то есть разбирает пути и генерирует ребра (состоящие из начального узла и узла назначения) из них, добавляя теги кодновременно ребра;
  • удаляют все ребра, которые имеют черные списки тегов (которые не являются магистралями) из таблицы ребер;
  • удаляют все узлы, которых нет в таблице ребер, из таблицы узлов.

Проблема в том, что эта последовательность очень ненадежна и работает «так себе» только на небольших наборах данных, таких как тысячи узлов, но не миллионы.

Problem:

С базой данных, состоящей из миллионов узлов и ребер, извлечение дорог (например, генерация ребер на основе определенного фильтра тегов) происходит крайне медленно.

Возможнорешение:

Что я собираюсь сделать на этот раз:

  • настроить PostgreSQL rdbms;
  • проанализировать файл .osm с OSM ready-созданы скрипты для получения полных таблиц узлов, путей и отношений;
  • извлекает все ребра с определенными тегами (например, "шоссе") в новую таблицу "ребер" из таблицы путей;
  • извлекает всеузлы, которые присутствуют в таблице ребер в новую таблицу graph_nodes;
  • после этого я, вероятно, смогу сгенерировать граф 'roads' из таблиц 'edges' и 'graph_nodes'. Вопрос:

    Как правильно проанализировать файл .osm в базе данных, чтобы в результате были получены таблицы «ребер» и «узлов»?

    Как извлечь из базы данных .osm только проезжие дороги в базу данных?

    Как мне сделать это быстро (я имею в виду часы работы скриптов для миллионов узлов и таблиц ребер, а не недель)?

    Должен ли я учитывать отношения?

    Если да, как мне это сделать?

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

Как я уже упоминал в своем комментарии, где действительно нет необходимости вставлять края, которые находятся в черном списке. Также мне приходит в голову другая проблема. Почему вам все равно нужно удалять узлы из таблицы узлов? Вы можете добавить специальное поле флага (назовем его used ) в таблицу узлов.

Когда вы вставляете новую строку в таблицу узлов, это поле имеет значение false. Также вы можете реализовать триггер для вставки в таблицу ребер, чтобы для каждой вставленной строки соответствующие строки в таблице узлов отмечались как использованные.

После того, как вы закончите с этим, вы можете просто удалить все неиспользуемые узлы. То есть, я полагаю, сейчас вы используете что-то вроде этого:

delete from nodes where id not in (select start_node from edges);
delete from nodes where id not in (select end_node from edges);

И я предлагаю вам сделать следующее:

delete from nodes where used = false;
0 голосов
/ 10 августа 2012

Вы можете использовать осмос для выполнения задачи.Тогда вам просто нужно предоставить ограничивающую рамку ... Для нескольких примеров и дальнейшего объяснения проверьте: эта ссылка (см. Главу "Использование примеров")

...