\documentclass[tikz]{standalone}

\usepackage{tikz}
\usepackage{fontspec}
\usepackage{contour}

\setmainfont{Atkinson Hyperlegible}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\usetikzlibrary{arrows.meta}

\definecolor{one}{RGB}{243,155,154}
\definecolor{two}{RGB}{176,0,68}
\definecolor{three}{RGB}{213,173,0}
\definecolor{four}{RGB}{227,0,11}
\definecolor{five}{RGB}{0,150,94}
\definecolor{six}{RGB}{149,107,37}
\definecolor{seven}{RGB}{255,204,0}
\definecolor{fifteen}{RGB}{247,171,99}
\definecolor{sixteen}{RGB}{94,107,175}
\definecolor{twentyone}{RGB}{227,0,11}
\definecolor{twentytwo}{RGB}{253,195,0}
\definecolor{twentythree}{RGB}{228,142,0}
\definecolor{twentyfour}{RGB}{140,29,117}
\definecolor{twentysix}{RGB}{243,155,154}

\input{../shapes.tex}

\pgfdeclarelayer{bg}
\pgfdeclarelayer{lines}
\pgfdeclarelayer{stops}
\pgfdeclarelayer{labels}
\pgfdeclarelayer{legend}
\pgfsetlayers{bg,lines,stops,labels,main,legend}

\contourlength{.2ex}

\begin{document}

\begin{tikzpicture}[
    river/.style = {
      line width=0.5cm,
      cyan!50,
      rounded corners=0.5cm,
      -{Triangle Cap},
    },
    railway line/.style = {
      color=gray,
      line width=0.075cm,
      rounded corners=0.5cm,
    },
    railway/.style = {
      railway line,
      {Latex[length=5mm]}-{Latex[length=5mm]},
    },
    stop/.style = {
      rounded corners=0.1cm, 
      line width=0.05cm,
      fill=white, 
      draw,
      shape=stop,
      anchor=center,
      minimum height=0.2cm,
    },
    stop1/.style = {
      stop,
      minimum width=0.2cm, 
    },
    stop2/.style = {
      stop,
      minimum width=0.4cm, 
    },
    stop3/.style = {
      stop,
      minimum width=0.6cm, 
    },
    stop4/.style = {
      stop,
      minimum width=0.8cm, 
    },
    stop5/.style = {
      stop,
      minimum width=1.0cm, 
    },
    stop6/.style = {
      stop,
      minimum width=1.2cm, 
    },
    stop7/.style = {
      stop,
      minimum width=1.4cm, 
    },
    line/.style = {
      line width=0.15cm,
      rounded corners=0.1cm,
    },
    maybe line/.style = {
      line,
      line width=0.1cm,
    },
    label/.style = {
      font=\scriptsize,
    },
    line name/.style = {
      label, 
      color=white, 
      minimum width=1em, 
      minimum height=1em, 
      inner sep=0pt,
    },
  ]

  \begin{pgfonlayer}{bg}
    \draw[help lines, color=gray!10] (-10, -15) grid[step=0.1] (10, 10);
    \draw[help lines, color=gray!50] (-10, -15) grid (10, 10);
    \draw[river] 
      (12,-3) 
      -- (10,-1)
      -- (7.8,-1)
      -- (2.8,4)
      -- (-4,4);
  \end{pgfonlayer}

  \begin{pgfonlayer}{stops}
    % Quadrate
    \node[stop5, rotate=-45] (ParadeplatzW) at ($(45:-0.55)+(135:-0.5)$) {};
    \node[stop4, rotate=45] (ParadeplatzE) at (135:-1.15) {};
    \node[stop4, rotate=45] (Wasserturm) at (135:-3.1) {};
    \node[stop4, rotate=45] (Strohmarkt) at (135:-2) {};
    \node[stop4, rotate=45] (Rathaus) at (135:1.7) {};
    \node[stop4, rotate=45] (Rheinstr) at (135:3.0) {};
    \node[stop6, rotate=-45] (Marktplatz) at ($(45:1.5)+(135:-0.4)$) {};
    \node[stop6, rotate=-45] (Abendakademie) at ($(45:2.8)+(135:-0.4)$) {};
    \node[stop5, rotate=-45] (Schloss) at ($(45:-2.2)+(135:-0.5)$) {};
    \node[stop5, rotate=45] (Universität) at ($(45:-3.1)+(135:-0.9)$) {};
    \node[stop3, rotate=90] (Nationaltheater) at (0:4.2) {};
    \node[stop2, rotate=-25] (Rosengarten) at (-25:3.6) {};
    \node[stop3, rotate=60] (Kurpfalzbrücke) at (60:3.5) {};
    \node[stop3, rotate=90] (MVV Hochhaus) at (90:3.5) {};
    \node[stop3, rotate=120] (Dalbergstr) at (120:3.5) {};
    \node[stop4, rotate=-45] (Kunsthalle) at ($(135:-3.8)-(45:0.7)$) {};
    \node[stop7, rotate=-45, below left=1.2cm of Kunsthalle.one half, anchor=one half] (Hauptbahnhof) {};
    \node[stop3, rotate=45] (Tattersall) at ($(Hauptbahnhof.center)!0.5!(Kunsthalle.center)+(135:-1.1)$) {};
    \node[stop3, rotate=-45] (Theresienkrankenhaus) at ($(Nationaltheater)+(0:1.6)+(45:0.3)$) {};
    \node[stop1] (Collini-Center) at ($(Abendakademie.three quarter)+(45:1)+(135:-1)$) {};
    \node[stop1] (Lessingstr) at ($(Collini-Center)+(135:-3.0)$) {};
    \node[stop1] (Gewerkschaftshaus) at (20:3.7) {};
    %
    \node[stop1] (Fernmeldeturm) at ($(Lessingstr)+(135:-0.5)$) {};
    \node[stop1] (Holbeinstr) at ($(Fernmeldeturm)+(135:-0.4)+(0:0.4)$) {};
    \node[stop2, rotate=90, anchor=two half] (Neuostheim) at ($(Holbeinstr)+(0:0.5)$) {};
    \node[stop1] (Duale Hochschule) at ($(Neuostheim.two half)+(0:0.5)$) {};
    \node[stop1] (Pforzheimer Str) at ($(Duale Hochschule)+(0:0.5)$) {};
    \node[stop1] (Deutscher Hof) at ($(Pforzheimer Str)+(0:0.5)$) {};
    % Neckarstadt
    \node[stop5, rotate=-45] (Alte Feuerwache) at ($(45:5)+(135:-0.1)$) {};
    \node[stop2, rotate=45] (Schafweide) at ($(Alte Feuerwache)+(45:0.6)+(135:-1.8)$) {};
    \node[stop5, rotate=-45] (Universitätsklinikum) at ($(Schafweide)+(135:-2)+(45:0.4)$) {};
    \node[stop3, rotate=-45, anchor=two half] (Lange Röttgerstr) at ($(Universitätsklinikum.center)+(45:0.8)$) {};
    \node[stop3, rotate=-45] (Bonifatiuskirche) at ($(Lange Röttgerstr)+(45:0.5)$) {};
    \node[stop2, rotate=-45, anchor=two half] (Exorzierplatz) at ($(Bonifatiuskirche.two half)+(45:0.5)$) {};
    \node[stop2, rotate=45] (Bibienastr) at ($(Universitätsklinikum.three quarter)+(45:0.4)+(135:-1.0)$) {};
    \node[stop2, rotate=90] (Hauptfriedhof) at ($(Bibienastr)-(135:1.0)+(0:0.4)$) {};
    \node[stop2, rotate=90] (Pfeifferswörth) at ($(Hauptfriedhof)+(0:0.5)$) {};
    \node[stop2, rotate=90] (Neckarplatt) at ($(Pfeifferswörth)+(0:0.5)$) {};
    \node[stop1] (Am Aubuckel) at ($(Neckarplatt)+(0:0.3)+(135:-0.6)$) {};
    \node[stop1] (Liebfrauenstr) at ($(Am Aubuckel)-(135:0.5)$){};
    \node[stop1] (Blücherstr) at ($(Liebfrauenstr)-(135:0.5)$){};
    \node[stop1] (Feudenheim Kirche) at ($(Blücherstr)-(135:0.5)$){};
    \node[stop1] (Neckarstr) at ($(Feudenheim Kirche)-(135:0.5)$){};
    \node[stop1] (Feudenheim) at ($(Neckarstr)-(135:0.5)$){};
    \node[stop2] (Carl-Benz-Str) at ($(Alte Feuerwache.center)+(45:0.5)+(90:1.4)$) {};
    \node[stop2, above=0.3cm of Carl-Benz-Str] (Neuer Messplatz) {};
    \node[stop2, above=0.3cm of Neuer Messplatz] (Herzogenriedstr) {};
    \node[stop1] (Neumarkt) at ($(Alte Feuerwache.one half)+(45:0.5)+(90:0.7)+(180:1.8)$) {};
    \node[stop1, left=0.3cm of Neumarkt] (Bgm-Fuchs-Str) {};
    \node[stop1, left=0.3cm of Bgm-Fuchs-Str] (Neckarstadt West) {};
    % Luzenberg
    \node[stop2, above=0.3cm of Herzogenriedstr] (Untermühlaustr) {};
    \node[stop2, above=0.3cm of Untermühlaustr] (Luzenberg) {};
    \node[stop1] (Stolberger Str) at ($(Luzenberg.one half)+(90:0.3)+(135:0.3)$) {};
    \node[stop1] (Altrheinstr) at ($(Stolberger Str)+(135:0.5)$) {};
    \node[stop1] (Roche) at ($(Altrheinstr)+(135:0.5)$) {};
    \node[stop1] (Zellstofffabrik) at ($(Roche)+(135:0.5)$) {};
    \node[stop1] (Papyrus) at ($(Zellstofffabrik)+(135:0.5)$) {};
    \node[stop1] (Bürstädter Str) at ($(Papyrus)+(135:0.5)$) {};
    \node[stop1] (Hanfstr) at ($(Bürstädter Str)+(135:0.5)$) {};
    \node[stop1] (Sandhofen) at ($(Hanfstr)+(135:0.5)$) {};
    % Waldhof
    \node[stop1, above=0.4cm of Luzenberg.two half] (Waldhof Bf) {};
    \node[stop1, above=0.3cm of Waldhof Bf] (Waldhof Nord) {};
    % Schönau
    \node[stop1, above=0.3cm of Waldhof Nord] (Schönau Siedlung) {};
    \node[stop1, above=0.3cm of Schönau Siedlung] (Schönauschule) {};
    \node[stop1, above=0.3cm of Schönauschule] (Schönau) {};
    % Käfertal
    \node[stop2, rotate=-45] (Boveristr) at ($(Exorzierplatz)+(45:0.5)$) {};
    \node[stop2, rotate=-45] (Käfertal Süd) at ($(Boveristr)+(45:0.5)$) {};
    \node[stop2, rotate=-45] (Mannheimer Str) at ($(Käfertal Süd)+(45:0.5)$) {};
    \node[stop2, rotate=-45] (Käfertal Bf) at ($(Mannheimer Str)+(45:0.5)$) {};
    \node[stop2, rotate=-45] (Bensheimer Str) at ($(Käfertal Bf)+(45:1.2)$) {};
    \node[stop1, rotate=-45] (Platz der Freundschaft) at ($(Bensheimer Str.two half)+(45:0.5)$) {};
    \node[stop1] (Hochuferstr) at ($(Bonifatiuskirche.one half)+(45:0.2)+(90:0.3)$) {};
    \node[stop1, above=0.3cm of Hochuferstr] (Landwehrsteg) {};
    \node[stop1, above=0.3cm of Landwehrsteg] (Ulmenweg) {};
    \node[stop1, above=0.3cm of Ulmenweg] (Jugendverkehrsschule) {};
    \node[stop1, above=0.3cm of Jugendverkehrsschule] (Hessische Str) {};
    \node[stop1, above=0.3cm of Hessische Str] (Speckweg) {};
    \node[stop1, above=0.3cm of Speckweg] (Herrmann-Gutzmann-Schule) {};
    \node[stop1, above=0.6cm of Herrmann-Gutzmann-Schule] (Erlöserkirche) {};
    \node[stop1, above=0.3cm of Erlöserkirche] (Waldstr) {};
    \node[stop1, right=0.6cm of Waldstr] (Carl-Benz-Bad) {};
    \node[stop1, above=0.3cm of Waldstr] (Freilichtbühne) {};
    \node[stop1, above=0.3cm of Freilichtbühne] (Waldfriedhof) {};
    \node[stop1, right=0.6cm of Waldfriedhof] (Käfertaler Wald) {};
    \node[stop2, rotate=45] (Im Rott) at ($(Käfertal Bf.two half)!0.65!(Bensheimer Str.two half)+(135:-1.7)$){};
    % Vogelstang
    \node[stop2, rotate=45] (Vogelstang West) at ($(Im Rott)-(135:1.7)$){};
    \node[stop1] (Potsdamer Weg) at ($(Vogelstang West)+(45:0.7)$){};
    \node[stop1] (Vogelstang Zentrum) at ($(Potsdamer Weg)+(45:0.5)$){};
    \node[stop1] (Vogelstang) at ($(Vogelstang Zentrum)+(45:0.5)$){};
    \node[stop1] (Kiesäcker) at ($(Vogelstang West)-(45:0.5)$) {};
    \node[stop1] (Hölderlinstr) at ($(Kiesäcker)-(45:0.5)$) {};
    \node[stop1] (Talstr) at ($(Hölderlinstr)-(45:0.5)$) {};
    \node[stop1] (Adolf-Damaschke-Ring) at ($(Talstr)-(45:0.5)$) {};
    \node[stop1] (Ziethenstr) at ($(Adolf-Damaschke-Ring)-(45:0.5)$) {};
    % Wallstadt
    \node[stop2, rotate=90, anchor=one half] (Wallstadt West) at ($(Vogelstang West.one half)-(135:0.4)+(0:0.4)$) {};
    \node[stop2, rotate=90] (Wallstadt Bf) at ($(Wallstadt West)+(0:0.5)$) {};
    \node[stop2, rotate=90] (Wallstadt Ost) at ($(Wallstadt Bf)+(0:0.5)$) {};
    \node[stop1] (Heddesheim Bf) at ($(Wallstadt Ost.one half)+(0:0.5)$) {};
    % Franklin
    \node[stop1] (Franklinschule) at ($(Bensheimer Str.one half)+(45:0.2)+(90:0.5)$) {};
    \node[stop1, above=0.3cm of Franklinschule] (Franklin Mitte) {};
    \node[stop1, above=0.3cm of Franklin Mitte] (Sullivan) {};
    % Viernheim
    \node[stop1, rotate=-45] (Tivoli) at ($(Platz der Freundschaft)+(45:0.5)$) {};
    \node[stop1, rotate=-45] (Kapellenberg) at ($(Tivoli)+(45:0.5)$) {};
    % Oststadt
    \node[stop2, rotate=90, anchor=two half] (Werderstr) at ($(Tattersall.two half)+(135:-0.4)+(0:0.7)$){};
    \node[stop2, rotate=90, right=0.5cm of Werderstr.center, anchor=center] (Pestallozischule) {};
    \node[stop2, rotate=90, right=0.5cm of Pestallozischule.center, anchor=center] (Weberstr) {};
    \node[stop2, rotate=90, right=0.5cm of Weberstr.center, anchor=center] (Planetarium) {};
    \node[stop2, rotate=-45] (Luisenpark Technoseum) at ($(Planetarium)+(0:0.4)+(45:0.4)$){};
    \node[stop2, rotate=-45] (Carl-Benz-Stadion) at ($(Luisenpark Technoseum)+(45:0.5)$){};
    \node[stop2, rotate=-45] (Harrlach) at ($(Carl-Benz-Stadion)+(45:0.5)$){};
    \node[stop2, rotate=-45] (Lucas-Cranach-Str) at ($(Harrlach)+(45:0.5)$){};
    \node[stop2, rotate=-45] (Schwindstr) at ($(Lucas-Cranach-Str)+(45:0.5)$){};
    \node[stop1] (Technoseum Süd) at ($(Planetarium.two half)+(0:0.4)-(135:0.4)$){};
    \node[stop1] (Fahrlach) at ($(Technoseum Süd)-(135:0.5)$){};
    \node[stop1] (Husarenweg) at ($(Fahrlach)-(135:0.5)$){};
    \node[stop1] (Ulanenweg) at ($(Husarenweg)-(135:0.5)$){};
    \node[stop1] (Gerd-Dehof-Platz) at ($(Ulanenweg)-(135:0.5)$){};
    \node[stop1] (SAP Arena Süd) at ($(Gerd-Dehof-Platz)-(135:0.5)$){};
    % Schwetzingerstadt
    \node[stop1] (Kopernikusstr) at ($(Tattersall.one half)+(135:-0.4)+(90:-0.7)$) {};
    \node[stop2, below=0.4cm of Kopernikusstr, anchor=one half] (Krappmühlstr) {};
    \node[stop2, below=0.3cm of Krappmühlstr] (Hochschule) {};
    % Neckarau
    \node[stop1, below=0.4cm of Hochschule.one half] (Lettestr) {};
    \node[stop1, below=0.3cm of Lettestr] (Voltastr) {};
    \node[stop1, below=0.3cm of Voltastr] (Neckarau Bf) {};
    \node[stop2, below=0.4cm of Neckarau Bf, anchor=one half] (Friedrichstr) {};
    \node[stop1, below=0.4cm of Friedrichstr.one half] (Isarweg) {};
    % Lindenhof
    \node[stop1] (Hauptbahnhof Süd) at ($(Hauptbahnhof.two quarter)-(45:2)-(0,1)$) {};
    \node[stop1, below=0.3cm of Hauptbahnhof Süd] (Windeckstr) {};
    \node[stop1, below=0.3cm of Windeckstr] (Diesterwegschule) {};
    \node[stop1, below=0.3cm of Diesterwegschule] (Meeräckerplatz) {};
    \node[stop1, below=0.3cm of Meeräckerplatz] (Markuskirche) {};
    \node[stop1, below=0.3cm of Markuskirche] (Franz-Sigel-Str) {};
    \node[stop1, below=0.3cm of Franz-Sigel-Str] (Freiheitsplatz) {};
    \node[stop1, below=0.3cm of Freiheitsplatz] (Neckarau West) {};
    \node[stop1, below=0.3cm of Neckarau West] (Tannhäuser Ring) {};
    \node[stop1, below=0.3cm of Tannhäuser Ring] (Stollenwörth) {};
    \node[stop1, below=0.3cm of Stollenwörth] (Rheingoldhalle) {};
    % Ludwigshafen
    \node[stop5, rotate=-45] (Berliner Platz) at ($(45:-6)-(135:0.3)$) {};
  \end{pgfonlayer}

  \begin{pgfonlayer}{lines}
    \pgfmathparse{0.1*tan(45/2)}
    \let\offset\pgfmathresult

    \draw[line, one] 
      (Schönau)
      -- (Schönauschule)
      -- (Schönau Siedlung)
      -- (Waldhof Nord)
      -- (Waldhof Bf)
      -- (Luzenberg.two half)
      -- (Untermühlaustr.two half)
      -- (Herzogenriedstr.two half)
      -- (Neuer Messplatz.two half)
      -- (Carl-Benz-Str.two half)
      {[rounded corners=0.25cm]
      -- ($(Alte Feuerwache.three quarter)+(45:0.5-\offset)$)
      }
      -- (Alte Feuerwache.three quarter) 
      -- (Abendakademie.three sixth)
      -- (Marktplatz.three sixth)
      -- (ParadeplatzW.two quarter)
      -- (Schloss.two quarter)
      {[rounded corners=0.5cm]
      -- ($(Universität.center)+(135:0.6)$)
      }
      -- (Universität.center)
      -- ($(Hauptbahnhof.two half)+(45:-1.2)$)
      -- (Hauptbahnhof.two half)
      {[rounded corners=0.2cm]
      -- ($(Tattersall.one half)+(135:0.35)$)
      }
      -- (Tattersall.one half)
      -- ($(Tattersall.one half)+(135:-0.4)$)
      -- (Kopernikusstr)
      -- (Krappmühlstr.one half)
      -- (Hochschule.one half)
      -- (Lettestr)
      -- (Voltastr)
      -- (Neckarau Bf)
      -- (Friedrichstr.one half)
      -- (Isarweg)
    ;

    \draw[maybe line, one] 
      (Alte Feuerwache.three quarter)
      -- ($(45:3.3)-(135:0.3)$)
      arc[start angle=41, end angle=60, radius=3.3]
      -- (Kurpfalzbrücke.one half)
      arc[start angle=60, end angle=90, radius=3.3]
      -- (MVV Hochhaus.one half)
      arc[start angle=90, end angle=120, radius=3.3]
      -- (Dalbergstr.one half)
      arc[start angle=120, end angle=130, radius=3.3]
      -- (Rheinstr.two half)
      -- (Rathaus.two half)
      {[rounded corners=0.4cm]
      -- ($(ParadeplatzW.two quarter)+(45:0.85)$)
      }
      -- (ParadeplatzW.two quarter)
    ;


    \draw[line, two] 
      (Neckarstadt West)
      -- (Bgm-Fuchs-Str)
      -- (Neumarkt)
      {[rounded corners=0.3cm]
      -- ($(Alte Feuerwache.one half)+(45:0.5-\offset)+(90:0.7)$)
      }
      -- ($(Alte Feuerwache.one half)+(45:0.5)$)
      -- (Alte Feuerwache.one half) 
      -- ($(45:3.7)+(135:0.3)$)
      arc[start angle=49, end angle=60, radius=3.7]
      -- (Kurpfalzbrücke.two half)
      arc[start angle=60, end angle=90, radius=3.7]
      -- (MVV Hochhaus.two half)
      arc[start angle=90, end angle=120, radius=3.7]
      -- (Dalbergstr.two half)
      arc[start angle=120, end angle=136, radius=3.7]
      -- (Rheinstr.two quarter) 
      -- (Strohmarkt.two quarter) 
      -- (Wasserturm.two quarter)
      -- ($(135:-3.7)-(45:0.1)$)
      {[rounded corners=0.01cm]
      -- ($(135:-3.7)-(45:0.0)$)
      }
      arc[start angle=-45, end angle=-2.5, radius=3.7]
      -- (Nationaltheater.one half)
      {[rounded corners=0.3cm]
      -- ($(Nationaltheater.one half)+(0:0.8+2*\offset)$)
      }
      -- (Theresienkrankenhaus.two half)
      -- (Universitätsklinikum.two half)
      -- ($(Universitätsklinikum.two half)+(45:0.3)$)
      -- (Bibienastr.one half)
      {[rounded corners=0.15cm]
      -- ($(Bibienastr.one half)-(135:1.0+\offset)$)
      }
      -- (Hauptfriedhof.one half)
      -- (Pfeifferswörth.one half)
      -- (Neckarplatt.one half)
      -- ($(Neckarplatt.one half)+(0:0.4)$)
      -- (Am Aubuckel)
      -- (Liebfrauenstr)
      -- (Blücherstr)
      -- (Feudenheim Kirche)
      -- (Neckarstr)
      -- (Feudenheim)
    ;

    \draw[line, three] 
      (Sandhofen)
      -- (Hanfstr)
      -- (Bürstädter Str)
      -- (Papyrus)
      -- (Zellstofffabrik)
      -- (Roche)
      -- (Altrheinstr)
      -- (Stolberger Str)
      -- ($(Luzenberg.one half)+(90:0.3)$)
      -- (Luzenberg.one half)
      -- (Untermühlaustr.one half)
      -- (Herzogenriedstr.one half)
      -- (Neuer Messplatz.one half)
      -- (Carl-Benz-Str.one half)
      {[rounded corners=0.15cm]
      -- ($(Alte Feuerwache.two quarter)+(45:0.5+1.5*\offset)$)
      }
      -- (Alte Feuerwache.two quarter) 
      -- (Abendakademie.one half) 
      -- (Marktplatz.one half) 
      {[rounded corners=0.3cm]
      -- ($(45:0.1)+(135:0.1)$)
      }
      -- (ParadeplatzE.three quarter)
      -- (Strohmarkt.three quarter) 
      -- (Wasserturm.three quarter)
      -- ($(Wasserturm.three quarter)+(135:-0.6)$)
      -- (Kunsthalle.two quarter)
      -- (Hauptbahnhof.two quarter)
      -- ($(Hauptbahnhof.two quarter)+(45:-2)$)
      -- (Hauptbahnhof Süd)
      -- (Windeckstr)
      -- (Diesterwegschule)
      -- (Meeräckerplatz)
      -- (Markuskirche)
      -- (Franz-Sigel-Str)
      -- (Freiheitsplatz)
      -- (Neckarau West)
      -- (Tannhäuser Ring)
      -- (Stollenwörth)
      -- (Rheingoldhalle)
    ;

    \draw[maybe line, three] 
      (Alte Feuerwache.two quarter)
      ($(45:3.5)+(135:0.1)$)
      arc[start angle=47, end angle=60, radius=3.5]
      -- (Kurpfalzbrücke.center)
      arc[start angle=60, end angle=90, radius=3.5]
      -- (MVV Hochhaus.center)
      arc[start angle=90, end angle=120, radius=3.5]
      -- (Dalbergstr.center)
      arc[start angle=120, end angle=133.5, radius=3.5]
      -- (Rheinstr.three quarter)
      -- (Rathaus.three quarter)
      -- (ParadeplatzE.three quarter)
    ;

    \draw[line, four] 
      (Herrmann-Gutzmann-Schule)
      {[rounded corners=0.2cm]
      -- ($(Erlöserkirche)!0.5!(Herrmann-Gutzmann-Schule)$)
      -| (Carl-Benz-Bad) 
      }
      -- (Käfertaler Wald)
      (Waldfriedhof)
      -- (Freilichtbühne)
      -- (Waldstr)
      -- (Erlöserkirche)
      -- (Herrmann-Gutzmann-Schule)
      -- (Speckweg)
      -- (Hessische Str)
      -- (Jugendverkehrsschule)
      -- (Ulmenweg)
      -- (Landwehrsteg)
      -- (Hochuferstr)
      -- ($(Bonifatiuskirche.one half)+(45:0.2)$)
      -- (Bonifatiuskirche.one half)
      -- (Lange Röttgerstr.one half)
      -- (Universitätsklinikum.one half)
      -- ($(Universitätsklinikum.one half)-(45:0.3)$)
      -- (Schafweide.two half) 
      {[rounded corners=0.4cm]
      -- ($(Alte Feuerwache.center)+(45:0.7)$)
      }
      -- (Alte Feuerwache.center)
      -- (Abendakademie.two quarter)
      -- (Marktplatz.two quarter)
      -- ($(45:0.3)+(135:-0.1)$)
      -- (ParadeplatzE.two half)
      -- (Strohmarkt.two half)
      -- (Wasserturm.two half)
      -- ($(Wasserturm.two half)-(135:0.8)$)
      -- (Kunsthalle.three quarter)
      -- ($(Hauptbahnhof.three sixth)+(45:0.4)$)
      -- ($(Hauptbahnhof.center)+(45:0.2)$)
      -- (Hauptbahnhof.center)
      -- ($(Hauptbahnhof.center)+(45:-1.6)$)
      -- (Universität.one half)
      {[rounded corners=0.4cm]
      -- ($(Universität.one half)+(135:0.8)$)
      }
      -- (Berliner Platz.two quarter)
    ;

    \draw[line, five]
      (Deutscher Hof)
      -- (Pforzheimer Str)
      -- (Duale Hochschule)
      -- (Neuostheim.two half)
      -- (Holbeinstr)
      -- ($(Fernmeldeturm)+(135:-0.4)$)
      -- (Fernmeldeturm)
      -- (Lessingstr)
      -- (Collini-Center)
      -- ($(Abendakademie.three quarter)+(45:1)$)
      -- (Abendakademie.three quarter)
      -- (Marktplatz.three quarter)
      -- (ParadeplatzW.three quarter)
      -- (Schloss.three quarter)
      {[rounded corners=0.1cm]
      -- ($(Universität.two half)+(135:0.2)$)
      }
      -- (Universität.two half)
      -- ($(Hauptbahnhof.one half)-(45:0.8)$)
      -- (Hauptbahnhof.one half)
      -- (Kunsthalle.one half) 
      -- (135:-3.5)
      arc[start angle=-45, end angle=2.5, radius=3.5]
      -- (Nationaltheater.two half)
      -- ($(Nationaltheater.two half)+(0:0.8-2*\offset)$)
      -- (Theresienkrankenhaus.one half)
      -- (Universitätsklinikum.center)
      -- (Lange Röttgerstr.two half)
      -- (Bonifatiuskirche.two half)
      -- (Exorzierplatz.two half)
      -- (Boveristr.two half)
      -- (Käfertal Süd.two half)
      -- (Mannheimer Str.two half)
      -- (Käfertal Bf.two half)
      -- (Bensheimer Str.two half)
      -- (Platz der Freundschaft)
      -- (Tivoli)
      -- (Kapellenberg)
      (Käfertal Bf.two half)
      {[rounded corners=0.3cm]
      -- ($(Käfertal Bf.two half)!0.65!(Bensheimer Str.two half)-(45:0.1)$)
      }
      -- (Im Rott.one half)
      -- (Vogelstang West.one half)
      {[rounded corners=0.15cm]
      -- ($(Vogelstang West.one half)-(135:0.4)$)
      }
      -- (Wallstadt West.one half)
      -- (Wallstadt Bf.one half)
      -- (Wallstadt Ost.one half)
      -- (Heddesheim Bf)
    ;

    \draw[line, six] 
      (Rheinstr.one half)
      -- (Rathaus.one half)
      -- (ParadeplatzE.one half)
      -- (Strohmarkt.one half)
      -- (Wasserturm.one half)
      -- ($(Wasserturm.one half)+(135:-1.0)$)
      -- (Kunsthalle.two half)
      {[rounded corners=0.3cm]
      -- ($(Tattersall.two half)-(135:-0.95)$)
      }
      -- (Tattersall.two half)
      (Rathaus.one half)
      {[rounded corners=0.2cm]
      -- ($(45:-0.3)+(135:0.3)$)
      }
      -- (ParadeplatzW.one half)
      -- (Schloss.one half)
      {[rounded corners=0.7cm]
        -- ($(Universität.two quarter)+(135:0.8)$)
      }
      -- (Universität.two quarter)
      -- ($(Hauptbahnhof.four sixth)-(45:1.4)$)
      -- (Hauptbahnhof.four sixth)
      -- ($(Hauptbahnhof.four sixth)+(45:0.25)$)
      -- ($(Hauptbahnhof.center)+(45:0.5)$)
      {[rounded corners=0.3cm]
      -- ($(Tattersall.two half)-(135:-0.95)$)
      }
      -- (Tattersall.two half)
      -- ($(Tattersall.two half)+(135:-0.4)$)
      -- (Werderstr.two half)
      -- (Pestallozischule.two half)
      -- (Weberstr.two half)
      -- (Planetarium.two half)
      -- ($(Planetarium.two half)+(0:0.4-\offset)$)
      -- (Luisenpark Technoseum.one half)
      -- (Carl-Benz-Stadion.one half)
      -- (Harrlach.one half)
      -- (Lucas-Cranach-Str.one half)
      -- (Schwindstr.one half)
      -- (Neuostheim.one half)
      (Planetarium.two half)
      -- ($(Planetarium.two half)+(0:0.4)$)
      -- (Technoseum Süd)
      -- (Fahrlach)
      -- (Husarenweg)
      -- (Ulanenweg)
      -- (Gerd-Dehof-Platz)
      -- (SAP Arena Süd)
    ;

    \draw[line, seven]
      (Vogelstang)
      -- (Vogelstang Zentrum)
      -- (Potsdamer Weg)
      -- (Vogelstang West)
      -- (Kiesäcker)
      -- (Hölderlinstr)
      -- (Talstr)
      -- (Adolf-Damaschke-Ring)
      -- (Ziethenstr)
      -- ($(Neckarplatt.two half)+(0:0.4)$)
      -- (Neckarplatt.two half)
      -- (Pfeifferswörth.two half)
      -- (Hauptfriedhof.two half)
      -- ($(Bibienastr.two half)-(135:1.0-\offset)$)
      -- (Bibienastr.two half)
      {[rounded corners=0.3cm]
      -- ($(Universitätsklinikum.three quarter)+(45:0.5)$)
      }
      -- (Universitätsklinikum.three quarter)
      -- (Theresienkrankenhaus)
      {[rounded corners=0.2cm]
      -- ($(Nationaltheater)+(0:0.8)$)
      }
      -- (Nationaltheater)
      -- ($(0:3.7)$)
      arc[start angle=0, end angle=31, radius=3.7]
      -- ($(Abendakademie.two half)+(45:0.3)$)
      -- (Abendakademie.two half)
      -- (Marktplatz.two half)
      -- (ParadeplatzW.two half)
      -- (Schloss.two half)
      -- (Universität.center)
      -- (Universität.west)
      {[rounded corners=0.2cm]
      -- ($(Universität.west)+(45:-0.3)$)
      -- ($(Berliner Platz.one half)+(45:0.4)$)
      }
      -- (Berliner Platz.one half)
    ;

    % \draw[line, eight] 
    %   (Berliner Platz) 
    %   -- (Hauptbahnhof)
    % ;

    \draw[line, fifteen]
      (Käfertal Bf.one half)
      -- (Mannheimer Str.one half)
      -- (Käfertal Süd.one half)
      -- (Boveristr.one half)
      -- (Exorzierplatz.one half)
      -- (Bonifatiuskirche.center)
      -- (Lange Röttgerstr.center)
      -- (Universitätsklinikum.two quarter)
      {[rounded corners=0.3cm]
      -- ($(Universitätsklinikum.two quarter)-(45:0.5)$)
      }
      -- (Schafweide.one half)
      {[rounded corners=0.2cm]
      -- ($(Alte Feuerwache.two half)+(45:0.5)$)
      }
      -- (Alte Feuerwache.two half)
      -- (Abendakademie.four sixth)
      -- (Marktplatz.four sixth)
      -- (ParadeplatzW.center)
      -- (Schloss.center)
      {[rounded corners=0.3cm]
      -- ($(Universität.three quarter)+(135:0.4)$)
      }
      -- (Universität.three quarter)
      -- ($(Hauptbahnhof.three sixth)+(45:-1.0)$)
      -- (Hauptbahnhof.three sixth)
      (Käfertal Bf.one half)
      {[rounded corners=0.4cm]
      -- ($(Käfertal Bf.one half)!0.65!(Bensheimer Str.one half)+(45:0.1)$)
      }
      -- (Im Rott.two half)
      -- (Vogelstang West.two half)
      -- ($(Vogelstang West.two half)-(135:0.4-2*\offset)$)
      -- (Wallstadt West.two half)
      -- (Wallstadt Bf.two half)
      -- (Wallstadt Ost.two half)
    ;

    \draw[line, sixteen]
      (Bensheimer Str.one half)
      -- ($(Bensheimer Str.one half)+(45:0.2)$)
      -- (Franklinschule)
      -- (Franklin Mitte)
      -- (Sullivan)
    ;

  \end{pgfonlayer}

  \begin{pgfonlayer}{labels}
    \foreach\stop/\placement/\anchor/\rotate in {
      Duale Hochschule/below/west/-45,
      Pforzheimer Str/below/west/-45,
      Deutscher Hof/below/west/-45,
      Neuostheim/below left/west/-45,
      Strohmarkt/right/west/45,
      Rathaus/left/east/0,
      Rheinstr/left/east/0,
      Marktplatz/left/east/0,
      Abendakademie/left/east/0,
      Schloss/left/east/0,
      Universität/right/west/0,
      Nationaltheater/left/north west/0,
      Rosengarten/right/west/0,
      Kunsthalle/left/east/0,
      Alte Feuerwache/left/east/0,
      MVV Hochhaus/left/north/0,
      Im Rott/left/north/-45,
      Vogelstang West/left/east/0,
      Dalbergstr/right/east/0,
      Berliner Platz/left/east/0,
      Tattersall/right/west/45,
      Werderstr/right/south west/45,
      Pestallozischule/right/south west/45,
      Weberstr/right/south west/45,
      Planetarium/right/south west/45,
      Luisenpark Technoseum/right/west/-45,
      Technoseum Süd/left/east/45,
      Fahrlach/left/east/45,
      Husarenweg/left/east/45,
      Ulanenweg/left/east/45,
      Gerd-Dehof-Platz/left/east/45,
      SAP Arena Süd/left/east/45,
      Carl-Benz-Stadion/right/west/-45,
      Harrlach/right/west/-45,
      Lucas-Cranach-Str/right/west/-45,
      Schwindstr/right/west/-45,
      Hauptbahnhof/left/east/0,
      Hauptbahnhof Süd/left/east/0,
      Windeckstr/left/east/0,
      Diesterwegschule/left/east/0,
      Meeräckerplatz/left/east/0,
      Markuskirche/left/east/0,
      Franz-Sigel-Str/left/east/0,
      Freiheitsplatz/left/east/0,
      Neckarau West/left/east/0,
      Lange Röttgerstr/right/west/-45,
      Bonifatiuskirche/right/west/-45,
      Exorzierplatz/right/west/-45,
      Boveristr/right/west/-45,
      Käfertal Süd/right/west/-45,
      Mannheimer Str/right/west/-45,
      Käfertal Bf/right/west/-45,
      Bensheimer Str/right/west/-45,
      Platz der Freundschaft/right/west/-45,
      Tivoli/right/west/-45,
      Kapellenberg/right/west/-45,
      Wallstadt West/left/west/-45,
      Wallstadt Bf/left/west/-45,
      Wallstadt Ost/left/west/-45,
      Heddesheim Bf/below/west/-45,
      Potsdamer Weg/right/west/0,
      Kiesäcker/right/west/-45,
      Hölderlinstr/right/west/-45,
      Talstr/right/west/-45,
      Vogelstang Zentrum/right/west/0,
      Vogelstang/right/west/0,
      Franklinschule/left/east/0,
      Franklin Mitte/left/east/0,
      Sullivan/left/east/0,
      Tannhäuser Ring/left/east/0,
      Stollenwörth/left/east/0,
      Rheingoldhalle/left/east/0,
      Kurpfalzbrücke/left/east/0,
      Kopernikusstr/left/east/0,
      Hochschule/left/east/0,
      Lettestr/left/east/0,
      Voltastr/left/east/0,
      Neckarau Bf/left/east/0,
      Friedrichstr/left/east/0,
      Isarweg/left/east/0,
      Krappmühlstr/left/east/0,
      Schafweide/left/east/0,
      Hochuferstr/left/east/0,
      Landwehrsteg/left/east/0,
      Ulmenweg/left/east/0,
      Jugendverkehrsschule/left/east/0,
      Hessische Str/left/east/0,
      Speckweg/left/east/0,
      Herrmann-Gutzmann-Schule/left/east/0,
      Erlöserkirche/left/east/0,
      Waldstr/left/east/0,
      Carl-Benz-Bad/right/west/0,
      Carl-Benz-Str/left/east/0,
      Neuer Messplatz/left/east/0,
      Herzogenriedstr/left/east/0,
      Untermühlaustr/left/east/0,
      Luzenberg/left/east/0,
      Stolberger Str/left/east/0,
      Altrheinstr/left/east/0,
      Roche/left/east/0,
      Zellstofffabrik/left/east/0,
      Papyrus/left/east/0,
      Bürstädter Str/left/east/0,
      Hanfstr/left/east/0,
      Sandhofen/left/east/0,
      Waldhof Bf/right/west/0,
      Waldhof Nord/right/west/0,
      Schönau Siedlung/right/west/0,
      Schönauschule/right/west/0,
      Schönau/right/west/0,
      Käfertaler Wald/right/west/0,
      Collini-Center/right/west/0,
      Freilichtbühne/left/east/0,
      Waldfriedhof/left/east/0,
      Universitätsklinikum/left/east/-45,
      Bibienastr/above left/east/45,
      Hauptfriedhof/right/west/45,
      Pfeifferswörth/right/west/45,
      Neckarplatt/right/west/45,
      Am Aubuckel/left/east/0,
      Liebfrauenstr/left/east/0,
      Blücherstr/left/east/0,
      Feudenheim Kirche/left/east/0,
      Neckarstr/left/east/0,
      Feudenheim/left/east/0,
      Adolf-Damaschke-Ring/right/west/-45,
      Ziethenstr/right/west/-45,
      Theresienkrankenhaus/right/west/0,
      Lessingstr/right/west/0,
      Fernmeldeturm/right/west/0,
      Gewerkschaftshaus/left/east/45,
      Neumarkt/above/east/-45,
      Bgm-Fuchs-Str/above/east/-45,
      Neckarstadt West/above/east/-45,
      Wasserturm/left/east/0%
    } \node[label, \placement=0.05cm of \stop, rotate=\rotate, anchor=\anchor] {\contour{white}{\stop}};
    \node[label, left=0.1cm of ParadeplatzW, rotate=0, anchor=east] {\contour{white}{Paradeplatz}};
    \node[label, line name, fill=one, left=0.2cm of Schönau] {\bf 1};
    \node[label, line name, fill=two, left=0.2cm of Neckarstadt West] {\bf 2};
    \node[label, line name, fill=two, right=0.2cm of Feudenheim] {\bf 2};
    \node[label, line name, fill=three, above=0.2cm of Sandhofen] {\bf 3};
    \node[label, line name, fill=three, right=0.2cm of Rheingoldhalle] {\bf 3};
    \node[label, line name, fill=four, above=0.2cm of Waldfriedhof] {\bf 4};
    \node[label, line name, fill=four, above=0.2cm of Käfertaler Wald] {\bf 4A};
    \node[label, line name, fill=five, right=0.2cm of Heddesheim Bf] {\bf 5A};
    \node[label, line name, fill=seven, above=0.2cm of Vogelstang] {\bf 7};
    \node[label, line name, fill=fifteen, right=0.2cm of Wallstadt Ost.east, anchor=south west] {\bf 15};
    \node[label, line name, fill=sixteen, right=0.2cm of Sullivan] {\bf 16};
    \node[label, line name, fill=sixteen, left=0.2cm of Bensheimer Str] {\bf 16};
  \end{pgfonlayer}

\end{tikzpicture}

\end{document}
% vim: nospell conceallevel=0
