Как упростить топологию с сохранением линейной сети?

9

У меня есть шейп-файл (состоящий из основных европейских дорог) с примерно 250 000 сегментов, которые я должен упростить для pgrouting. Но я не могу найти способ сделать это правильно.

Вот как это выглядит:

http://i.stack.imgur.com/qJ2OJ.png

и вот как это должно выглядеть:

http://i.stack.imgur.com/FN4Z6.png

Мне как-то приходится удалять каждую точку линий, которая связана менее чем с 3 линиями (не являясь пересечением), сохраняя при этом топологические связи между остальными точками. Если у кого-то есть идея, она будет очень признательна!

С наилучшими пожеланиями

РЕДАКТИРОВАТЬ: я пытался реализовать идею @dkastl и удалось получить из моей сети только ненужные узлы (узлы только с 2 смежными линейными строками) с помощью приведенного ниже кода (создание сети взято из блога Underunder) http://underdark.wordpress.com / 2011/02/07 / a-beginners-guide-to-pgrouting / ):

SELECT * FROM
   (SELECT tmp.id as gid, node.the_geom FROM 
     (SELECT id, count(*) FROM network 
     JOIN node 
     ON (start_id = id OR end_id = id) AND (end_id = id OR start_id = id)
     GROUP BY id ORDER BY id) as tmp
   JOIN node ON (tmp.id = node.id)
   WHERE tmp.count = 2) as unn_node;

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

chriserik
источник
1
Почему вы должны сделать это для pgRouting? Если у вас уже есть назначенный идентификатор источника / цели, вы можете создать новую геометрию, в которой строки линий содержат только идентификатор источника и цели. Это должно выглядеть как ваше второе изображение.
dkastl
Проблема в том, что линии сегментированы (если вы посмотрите на первое изображение, которое я разместил, каждая точка, которую вы видите, начинает / заканчивает новый сегмент), ваш подход упрощает геометрию (что хорошо), но не топологию.
chriserik
1
Я не думаю, что из вашего изображения очевидно, что каждая точка начинает новую геометрию линии. Вы уже запустили функцию assign_vertex_id pgRouting для заполнения столбцов источника / цели? В этом случае вы можете позже выполнить некоторые запросы, чтобы идентифицировать идентификаторы источника / цели, которые существуют только дважды, что означает, что вы должны иметь возможность объединить два линейных сегмента в этой точке. Если идентификатор источника / цели существует более двух раз, он должен быть пересечением.
dkastl
@dkastl: очень хорошая идея! Я обновил свой вопрос, показывая, как далеко я получил с ним.
chriserik

Ответы: