Überlappende Linien rendern

24

Ich erstelle eine Karte mit Informationen zu öffentlichen Verkehrsmitteln: Busse, Straßenbahnen usw. Die Karte enthält einen Layer, der beispielsweise die Straßenbahnlinien enthält. Jede Linie hat ihre eigene Farbe und wird durch eine Linienzeichenfolgengeometrie dargestellt.

Das Problem ist, dass viele der Linien überlappende Teile haben, wobei mehr als eine Straßenbahnlinie denselben Abschnitt abdeckt. Um dies dem Benutzer zu zeigen, möchte ich lieber, dass die Linien parallel zueinander verlaufen, anstatt übereinander gezeichnet zu werden. Sehen Sie sich als Beispiel an, wie Google Maps die New Yorker U-Bahnlinien anzeigt.

Ich vermute, dass dies ein häufiges Problem in der Kartografie ist, weiß aber nicht, nach welcher Terminologie ich suchen soll.

Ich verwende PostGIS / GeoServer / OpenLayers als meinen Stack, aber jede Open Source-Lösung wäre akzeptabel.

Liedman
quelle
Dasselbe Problem mit U-Bahnen. Haben Sie eine akzeptable Lösung gefunden / implementiert?
Geert-Jan
Unglücklicherweise nicht. Der Kunde hat dies nicht priorisiert, und wir haben einen ziemlich üblen Hack ausgeführt, um Überschneidungen zu vermeiden.
Liedman

Antworten:

7

Wenn Sie mehr über diesen Bereich erfahren möchten, wird das Problem als kartografische Verschiebung und als ein Aspekt der kartografischen Verallgemeinerung bezeichnet .

Ein paar Artikel über Verschiebungen und Lösungsansätze für das Problem:

scw
quelle
"Verschiebung"! Das war der andere Begriff, an den ich mich erinnern wollte. Wir haben ein Tool in FME (Entschuldigung - nicht Open Source), das "Annäherungskonflikte zwischen Features mithilfe einer Variante des Nickerson-Verschiebungsalgorithmus löst". Wenden Sie sich also vielleicht an ein Google von Nickerson, um zu sehen, was auf Sie zukommt.
Mark Ireland
scholar.google.com/… wirft einen Link zum Originalartikel (leider mit einem Mauerwerk versehen) auf, auf den viele Leute verweisen. Einige der verwandten Artikel sind kostenlos und sehen interessant aus.
Ian Turton
4

Dieses Problem ist sehr typisch für die kartografische Verallgemeinerung. Dafür gibt es automatisierte Methoden, aber es sind noch keine Implementierungen verfügbar.

Auf " Beams " und " Snakes " basierende Methoden liefern effiziente Ergebnisse zur Lösung dieser kartografischen Konflikte von Netzwerkdaten (siehe auch die Referenzen von scw ). Hier sind einige Ergebnisse der Beam-Algorithmen für Straßendaten:

Vor:

Alt-Text

Nach:

Alt-Text

Siehe auch dieses Dokument und diese Präsentation , in denen erklärt wird, wie diese Transformation durchgeführt wird .

EDIT: Ich habe es noch nie getestet, aber es scheint, dass es in GRASS etwas gibt, das mit Schlangen zu tun hat. Sehen Sie hier .

julien
quelle
1
Funktioniert dies, wenn zwei Liniensegmente (Busspuren) genau die gleiche Geometrie haben?
Underdunkel
1
Dies gilt für zu geschlossene Linien und sollte bei genau überlappenden Linien nicht so gut funktionieren. Eine Anpassung ist erforderlich.
Juli
1

Ich kenne keine Lösung, aber ich denke, der Begriff, den Sie suchen, ist "Konfliktlösung" - ein Thema der Kartenverallgemeinerung. Eine Google-Suche zu "Kartenverallgemeinerungskonflikten" zeigt einige interessante Informationen - aber ich weiß nicht, dass es viel praktischen Nutzen gibt.

Markieren Sie Irland
quelle
1

In aktuellen Implementierungen finden Sie häufig entweder "Versatz" oder "Versetzung". Unter Verwendung Ihres aktuellen Stacks ist es etwas schwierig, automatisch parallele Linien zu erstellen:

Um es zusammenzufassen: Der einfachste Weg, den ich kenne, wäre, UMN Mapserver und den Offset-Wert dort zu verwenden. Beispielstil für Ihr Mapfile:

STYLE
 SYMBOL 7
 OUTLINECOLOR 160 160 160
 SIZE 5
 OFFSET 2 -99 # <-- This will offset the line to the right.
 ANTIALIAS FALSE
END # STYLE
Underdunkel
quelle
0

Wenn Sie Linienebenen zeichnen, die sich überlappen, haben Sie verschiedene Optionen, damit der Betrachter alle Linien sehen kann.

  1. Breite - Sie können die Linienbreite zwischen den Ebenen variieren und die breiteren Linien unten platzieren.
  2. Deckkraft / Transparenz - Sie können einzelne Linienebenen teilweise undurchsichtig machen, sodass Sie einzelne Ebenen durchsehen können.
  3. Versatz - Sie können das Liniensymbol, das das tatsächliche Linien-Feature darstellt, zu einer Seite der tatsächlichen Geometrie der Linie versetzen. Einzelne Ebenen können unterschiedlich stark und in unterschiedliche Richtungen versetzt werden, damit alle Ebenen sichtbar sind.
  4. Linien können durch eine Reihe von Punktsymbolen mit einer definierten Lücke zwischen den Symbolen dargestellt werden. Indem Sie das Symbol, die Symbolfarbe, die Symbolgröße und den Abstand zwischen den verschiedenen Linienebenen variieren, sollten Sie jede einzelne Linienebene unterscheidbar machen.

Ich verwende GeoServer nicht, aber ich weiß, dass MapServer über die Funktionalität verfügt, um all diese Dinge zu erledigen. Es ist wahrscheinlich, dass GeoServer dies auch tut.

DavidF
quelle
Es hört sich so an, als wollten wir Nummer 3, aber nur für überlappende Features. Ist das möglich?
Wanderer
2
MapServer und andere Webkartenserver und GIS lösen Konflikte bei Beschriftungen, mir ist jedoch keine Funktion bekannt, mit der Sie diese sofort ausführen können. Wenn Ihre Daten relativ statisch waren, können Sie Ihre Daten natürlich vorverarbeiten, um zu ermitteln, wo sich Linien aus verschiedenen Layern schneiden (oder innerhalb einer Toleranz liegen), und die Daten basierend darauf zu klassifizieren. Ihre Karten-Rendering-Engine könnte dann die Verschiebungssymbolik basierend auf einem Attribut in Ihren Daten anwenden.
DavidF