Надання ліній, що перекриваються


24

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

Проблема полягає в тому, що багато ліній мають частини, що перекриваються, де більше однієї трамвайної лінії охоплюють один і той же відрізок. Щоб показати це користувачеві, я б краще хотів, щоб лінії проходили паралельно один одному, а не були намальовані один на одного. Для прикладу дивіться, як Карти Google показують лінії метро в Нью-Йорку.

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

Я використовую PostGIS / GeoServer / OpenLayers як мій стек, але будь-яке рішення з відкритим кодом було б прийнятним.


З тією ж проблемою, що і з лініями метро. Ви знайшли / реалізували прийнятне рішення?
Герт-Ян

На жаль, немає. Клієнт не надав цього пріоритету, і ми зробили досить неприємний злом, щоб запобігти перекриттю.
Ледман

Відповіді:


7

Якщо вам цікаво дізнатися більше про цю область, проблема називається картографічним переміщенням та її одним із аспектів картографічного узагальнення .

Кілька статей, які обговорюють переміщення та підходи до вирішення проблеми:


"Зсув"! Це був інший термін, який я намагався запам'ятати. У FME у нас є інструмент (вибачте - не з відкритим кодом), який "Вирішує конфлікт близькості між функціями, використовуючи варіант алгоритму переміщення Нікерсона" - так, можливо, зробить Google з Нікерсона, щоб побачити, що з'являється?
Марк Ірландії

scholar.google.com/… пересилає посилання на оригінальну статтю (на жаль платять стіни), і багато людей посилаються на неї. Деякі з пов’язаних статей безкоштовні і виглядають цікавими.
Ян Тертон

4

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

Методи, засновані на " Променях " і " Зміях ", дають ефективні результати для вирішення цих картографічних конфліктів мережевих даних (див. Також посилання, наведені на scw ). Ось деякі результати алгоритмів балок на даних про дороги:

Перед:

alt текст

Після:

alt текст

Дивіться також цей документ і цю презентацію, які пояснюють, як зробити цю трансформацію .

EDIT: Я ніколи його не тестував, але, здається, є щось, що стосується змій у 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.


Здається, ми хочемо №3, але лише для функцій, що перекриваються. Це можливо?
mwalker

2
MapServer та інші сервери веб-карт та ГІС вирішують конфлікти для міток, але я не знаю функції, яка дозволила б вам це робити на ходу. Звичайно, якщо ваші дані були досить статичними, ви можете попередньо обробити свої дані, щоб визначити, де перетинаються лінії з різних шарів (або в межах допуску) та класифікувати дані на основі цього. Ваш механізм візуалізації карт може потім застосувати символу "переміщення" на основі атрибута у ваших даних.
DavidF
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.