Требуемый результат:
База данных с двумя таблицами, «ребрами» и «узлами», которые можно использовать для создания графика, который представляет все проезжие дороги (шоссе) вопределенный район (например, город).Набор данных анализируется из файла .osm.
Справочная информация:
Я собираюсь вторую попытку создать базу данных с двумя таблицами - узлами и ребрами, которыеможет использоваться для различных вычислений кратчайшего пути на нем.
Сначала я попытался вручную извлечь различные данные в базу данных (сценарии php):
- разобрать все узлы из.OSM-файл в таблицу «узлов»
- парсит все ребра в таблицу «ребер» (то есть разбирает пути и генерирует ребра (состоящие из начального узла и узла назначения) из них, добавляя теги кодновременно ребра;
- удаляют все ребра, которые имеют черные списки тегов (которые не являются магистралями) из таблицы ребер;
- удаляют все узлы, которых нет в таблице ребер, из таблицы узлов.
Проблема в том, что эта последовательность очень ненадежна и работает «так себе» только на небольших наборах данных, таких как тысячи узлов, но не миллионы.
Problem:
С базой данных, состоящей из миллионов узлов и ребер, извлечение дорог (например, генерация ребер на основе определенного фильтра тегов) происходит крайне медленно.
Возможнорешение:
Что я собираюсь сделать на этот раз:
- настроить PostgreSQL rdbms;
- проанализировать файл .osm с OSM ready-созданы скрипты для получения полных таблиц узлов, путей и отношений;
- извлекает все ребра с определенными тегами (например, "шоссе") в новую таблицу "ребер" из таблицы путей;
- извлекает всеузлы, которые присутствуют в таблице ребер в новую таблицу graph_nodes;
- после этого я, вероятно, смогу сгенерировать граф 'roads' из таблиц 'edges' и 'graph_nodes'. Вопрос:
Как правильно проанализировать файл .osm в базе данных, чтобы в результате были получены таблицы «ребер» и «узлов»?
Как извлечь из базы данных .osm только проезжие дороги в базу данных?
Как мне сделать это быстро (я имею в виду часы работы скриптов для миллионов узлов и таблиц ребер, а не недель)?
Должен ли я учитывать отношения?
Если да, как мне это сделать?