Renderowanie nakładających się linii

24

Tworzę mapę zawierającą informacje o transporcie publicznym: autobusy, tramwaje itp. Mapa będzie miała warstwę zawierającą na przykład linie tramwajowe. Każda linia ma swój własny kolor i jest reprezentowana przez geometrię ciągu linii.

Problem polega na tym, że wiele linii ma zachodzące na siebie części, w których więcej niż jedna linia tramwajowa obejmuje ten sam odcinek. Aby pokazać to użytkownikowi, wolałbym, aby linie biegły równolegle do siebie, zamiast być nanoszone jeden na drugim. Na przykład zobacz, jak Mapy Google pokazują linie metra w Nowym Jorku.

Podejrzewam, że jest to dość powszechny problem w kartografii, ale nie wiem, jakiej terminologii powinienem szukać.

Używam PostGIS / GeoServer / OpenLayers jako mojego stosu, ale każde rozwiązanie typu open source byłoby dopuszczalne.

Liedman
źródło
Ten sam problem z liniami metra. Czy znalazłeś / wdrożyłeś akceptowalne rozwiązanie?
Geert-Jan
Niestety nie. Klient nie traktował tego priorytetowo i zrobiliśmy dość nieprzyjemny hack, aby zapobiec nakładaniu się.
Liedman,

Odpowiedzi:

7

Jeśli chcesz dowiedzieć się więcej o tym obszarze, problem nazywa się przesunięciem kartograficznym i jest jednym z aspektów uogólnienia kartograficznego .

Kilka artykułów omawiających przemieszczenie i podejścia do rozwiązania problemu:

scw
źródło
"Przemieszczenie"! To był inny termin, który próbowałem zapamiętać. Mamy narzędzie w FME (przepraszam - nie open source), które „rozwiązuje konflikty bliskości między funkcjami za pomocą wariantu algorytmu przesunięcia Nickersona” - więc może Google z Nickerson, aby zobaczyć, co się pojawi?
Mark Ireland
scholar.google.com/… wyświetla link do oryginalnego artykułu (niestety opłacony), a wiele osób się do niego odwołuje. Niektóre powiązane artykuły są bezpłatne i wyglądają interesująco.
Ian Turton
4

Ten problem jest bardzo typowy w uogólnieniu kartograficznym. Istnieją do tego zautomatyzowane metody, ale nie są jeszcze dostępne żadne implementacje.

Metody oparte na „ wiązkach ” i „ wężach ” dają skuteczne wyniki w rozwiązywaniu tych konfliktów kartograficznych danych sieciowych (patrz także referencje podane przez scw ). Oto niektóre wyniki algorytmów wiązek dla danych drogowych:

Przed:

alternatywny tekst

Po:

alternatywny tekst

Zobacz także ten artykuł i prezentację, które wyjaśniają, jak to zrobić tę transformację .

EDYCJA: Nigdy go nie testowałem, ale wydaje się, że w GRASS jest coś związanego z wężami. Zobacz tutaj .

Julien
źródło
1
Czy to działa, jeśli dwa segmenty linii (tory autobusowe) mają dokładnie taką samą geometrię?
podmrok
1
Dotyczy to zbyt zamkniętych linii i nie powinno działać tak dobrze dla linii, które dokładnie się pokrywają. Konieczna jest adaptacja.
Julien
1

Nie znam rozwiązania, ale myślę, że termin, którego szukasz, to „rozwiązywanie konfliktów” - temat uogólnienia mapy. Wyszukiwanie w Google „konfliktów uogólnienia mapy” pokazuje kilka interesujących informacji - ale nie wiem, czy ma to praktyczne zastosowanie.

Mark Ireland
źródło
1

W aktualnych implementacjach często można znaleźć „Offset” lub „Dislocation”. Korzystając z aktualnego stosu, uzyskanie automatycznych linii równoległych wydaje się nieco trudne:

Podsumowując: Najłatwiejszy sposób, jaki znam, to użycie UMN Mapserver i wartości Offset. Przykładowy styl pliku map:

STYLE
 SYMBOL 7
 OUTLINECOLOR 160 160 160
 SIZE 5
 OFFSET 2 -99 # <-- This will offset the line to the right.
 ANTIALIAS FALSE
END # STYLE
podmrok
źródło
0

Jeśli rysujesz warstwy linii, które się nakładają, masz kilka opcji, które pozwalają widzowi zobaczyć wszystkie linie.

  1. Szerokość - zmieniasz szerokość linii między warstwami i umieszczasz szersze linie na dole.
  2. Nieprzezroczystość / Przezroczystość - poszczególne warstwy mogą być częściowo nieprzezroczyste, dzięki czemu można „przejrzeć” poszczególne warstwy.
  3. Przesunięcie - możesz przesunąć symbol linii reprezentujący rzeczywisty element linii do jednej strony faktycznej geometrii linii. Poszczególne warstwy można przesunąć o różne ilości i w różnych kierunkach, aby umożliwić oglądanie wszystkich warstw.
  4. Linie mogą być reprezentowane przez serię symboli punktowych ze zdefiniowaną przerwą między symbolami. Zmieniając symbol, kolor symbolu, rozmiar symbolu i odstęp między różnymi warstwami linii, należy rozróżnić poszczególne warstwy linii.

Nie używam GeoServera, ale wiem, że MapServer ma funkcjonalność pozwalającą wykonywać wszystkie te czynności. Prawdopodobnie GeoServer również to robi.

DavidF
źródło
Wygląda na to, że chcemy # 3, ale tylko w przypadku nakładających się funkcji. Czy to jest możliwe?
mwalker
2
MapServer i inne serwery map internetowych oraz GIS rozwiązują konflikty dla etykiet, ale nie znam funkcji, która pozwoliłaby ci to robić w locie. Oczywiście, jeśli twoje dane były dość statyczne, możesz wstępnie przetworzyć swoje dane, aby zidentyfikować, gdzie przecinają się linie z różnych warstw (lub mieszczą się w tolerancji) i na tej podstawie sklasyfikować dane. Silnik renderowania mapy może następnie zastosować symbolikę „przemieszczenia” w oparciu o atrybut w danych.
DavidF