Рендеринг перекрывающихся линий

24

Я делаю карту, содержащую информацию об общественном транспорте: автобусах, трамваях и т. Д. На карте будет слой, содержащий, например, линии трамвая. Каждая строка имеет свой цвет и представлена ​​геометрией строки.

Проблема заключается в том, что многие линии имеют перекрывающиеся части, где несколько трамвайных линий покрывают один и тот же участок. Чтобы показать это пользователю, я бы предпочел, чтобы линии проходили параллельно друг другу, а не рисовались поверх друг друга. Например, посмотрите, как Карты Google показывают линии метро Нью-Йорка.

Я подозреваю, что это довольно распространенная проблема в картографии, но не знаю, какую терминологию мне следует искать.

Я использую PostGIS / GeoServer / OpenLayers в качестве стека, но любое решение с открытым исходным кодом будет приемлемым.

Liedman
источник
Имея ту же проблему с линиями метро. Вы нашли / внедрили приемлемое решение?
Герт-Янв
К сожалению нет. Заказчик не расставил приоритеты, и мы сделали довольно неприятный хак, чтобы избежать дублирования.
Лиедман

Ответы:

7

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

Пара статей, обсуждающих смещение и подходы к решению проблемы:

SCW
источник
«Смещение»! Это был другой термин, который я пытался вспомнить. У нас в FME есть инструмент (извините, но не с открытым исходным кодом), который «решает конфликты близости между объектами с помощью варианта алгоритма смещения Никерсона» - так что, возможно, воспользуемся Google из Никерсона, чтобы увидеть, что произойдет?
Марк Ирландия
scholar.google.com/… выдает ссылку на оригинальную статью (к сожалению, за стеной), и многие люди ссылаются на нее. Некоторые из связанных статей бесплатны и выглядят интересными.
Ян Тертон
4

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

Методы, основанные на « Лучах » и « Змеях », дают эффективные результаты для решения этих картографических конфликтов сетевых данных (см. Также ссылки, предоставленные scw ). Вот некоторые результаты алгоритмов лучей на дорожных данных:

До:

альтернативный текст

После:

альтернативный текст

Смотрите также эту статью и эту презентацию, которые объясняют, как сделать это преобразование .

РЕДАКТИРОВАТЬ: Я никогда не проверял это, но кажется, что есть что-то, связанное со змеями в GRASS. Смотрите здесь .

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

Я не знаю решения, но думаю, что термин, который вы ищете, - это «разрешение конфликтов» - тема обобщения карты. Поиск Google по «конфликтам обобщения карты» показывает некоторую интересную информацию - но я не знаю, есть ли много практического использования.

Марк Ирландия
источник
1

В текущих реализациях вы часто можете найти «Смещение» или «Смещение». Используя ваш текущий стек, выглядит немного сложным для автоматического достижения параллельных линий:

Подводя итог: Самый простой способ, который я знаю, это использовать UMN Mapserver и значение Offset там. Пример стиля для вашего файла карты:

STYLE
 SYMBOL 7
 OUTLINECOLOR 160 160 160
 SIZE 5
 OFFSET 2 -99 # <-- This will offset the line to the right.
 ANTIALIAS FALSE
END # STYLE
Подземье
источник
0

Если вы рисуете слои линий, которые перекрываются, у вас есть несколько опций, позволяющих зрителю видеть все линии.

  1. Ширина - вы меняете ширину линии между слоями и размещаете более широкие линии внизу.
  2. Непрозрачность / прозрачность - вы можете сделать отдельные слои линий частично непрозрачными, чтобы вы могли видеть сквозь отдельные слои.
  3. Смещение - вы можете сместить символ линии, представляющий фактический линейный объект, на одну сторону от фактической геометрии линии. Отдельные слои могут быть смещены на разные величины и в разных направлениях, чтобы можно было увидеть все слои.
  4. Линии могут быть представлены серией точечных символов с определенным промежутком между символами. Изменяя символ, цвет символа, размер символа и расстояние между различными слоями линий, вы должны сделать каждый отдельный слой линий различимым.

Я не использую GeoServer, но я знаю, что MapServer обладает функциональностью для выполнения всех этих задач. Вероятно, что GeoServer делает то же самое.

DavidF
источник
Звучит так, как будто мы хотим №3, но только для перекрывающихся функций. Это возможно?
mwalker
2
MapServer и другие серверы веб-карт и ГИС разрешают конфликты для меток, но я не знаю функции, которая позволяла бы вам делать это на лету. Конечно, если ваши данные были довольно статичными, вы могли бы предварительно обработать ваши данные, чтобы определить, где линии из разных слоев пересекаются (или находятся в пределах допуска), и классифицировать данные на основе этого. Ваш движок рендеринга карты может затем применить символ «смещение» на основе атрибута в ваших данных.
DavidF