User:Maxbe/Beschriftung von Seen

From OpenStreetMap Wiki
Jump to: navigation, search

Worum gehts

Maxbe lakelabel simschiemsee wunsch.png

Üblicherweise werden Seen und andere Flächen mittig horizontal beschriftet. Mapnik oder Mapserver sucht sich einen Punkt in der Mitte der Fläche, zieht von dort einen Strich nach links und rechts und platziert auf diesem Strich den Text.

Schöner wäre eine Funktion, die aus der Geometrie der Fläche eine Linie berechnet, auf der die Beschriftung platziert werden kann. Das kann eine horizontale Linie sein bei z.B. runden Seen, ein schräger Strich bei länglichen Seen oder eine elegant sich durch den See schlängelnde Linie bei Seen, deren Uferlinie kompliziert ist oder die zu viele Inseln haben für einen geraden Strich.

Beispiele für diese Art der Beschriftung finden sich z.B. in älteren Karten und Google Maps.

Motivation für diese Suche nach Beschriftungen war ein issue der OpenTopoMap.

Versuche mit der medialen Achse...

Maxbe medialaxis test.png

... sind fehlgeschlagen.

Eigentlich war die Idee verlockend. Die mediale Achse eines Sees verläuft eben in der Seemitte und genau dort will man die Beschriftung haben. Allerdings ist diese Achse definiert durch "Menge aller Punkte, deren minimale Entfernung zum Rand für zwei Stellen am Rand zutrifft". Das Beschreibt nicht nur die "Mitte des Sees", sondern auch z.B. die Mitte einer Bucht oder die Mitte zwischen zwei Hafenmolen und führt zu einem Strich zu jeder nach aussen gerichteten Ecke des Ufers.

Bei einfachen Seen (links oben) sieht das vielversprechend aus, bei komplizierten Seen wäre es schwierig gewesen, die richtigen Linien auszusuchen. Versuche, die Küstenlinie zu vereinfachen führten zu wunderlichen Ergebnissen, die bei unterschiedlichen Geometrien auch schwer vorhersagbar waren.

Die Kästchenmethode

Maxbe chiemseekaestchen.png

Ursprünglich war das nur ein Versuch, den See für die mediale Achse so zu bearbeiten, dass er zum einen seine Form (und seine Inseln) behält und zum anderen unabhängig von seiner Größe eine handhabbare Form bekommt. Hat aber nicht gut geklappt und deshalb werden die Kästchen zum zentralen Element und Kästchenzählen zur Methode erhoben.

Zerlegung des Sees

Man legt ein willkürlich gewähltes 25x25-Gitter über das begrenzende Rechteck des Sees. Dann malt man jedes Rechteck, das innerhalb des Wassers liegt und merkt sich zu jedem Kästchen, wie weit es vom Ufer weg ist. "Weit weg" bedeutet hier die Anzahl der Kästchen bis zum Ufer. Ausserdem bestimmt man das Kästchen, das am weitesten vom Ufer weg liegt (im Bild das rote). Falls mehrere gleich weit weg liegen, nimmt man irgend eines davon.


Ausdünnen der Kästchen

Maxbe chiemseekaestchenbepunktet.png

Kästchen, die nicht in der Mitte liegen interessieren nicht weiter. Die erkennt man daran, dass sie zusammen mit ihren Nachbarn auf dem Weg zur Mitte liegen, also z.B. der linke Nachbar näher am Ufer liegt als das Kästchen selbst und zugleich der rechte Nachbar weiter vom Ufer weg (das ganze noch mit oben unten und in umgekehrter Richtung). Diese Kästchen sind im Bild rechts transparent dargestellt.

Suche des Anfangs- und Endpunktes der Beschriftung

Der Anfang der Beschriftung ist der Punkt, der am weitesten von der Mitte entfernt ist, aber noch von der Mitte aus erreichbar ist (im Bild der grüne links unten).

"Erreichbar" heisst in diesem Fall "durch hüpfen von Kästchen zu Kästchen erreichbar", gehüpft wird in der 3x3-Nachbarschaft, also auch diagonal. Berücksichtigt werden nur die interessanten (im Bild weissen) Kästchen.

"Weit weg" wird durch Distanz der Luftlinie berechnet, nicht durch Kästchenzählen. Deshalb liegt der grüne Punkt im Bild rechts nicht weiter im Norden. Zählen wurde auch probiert, führte zu Linien, die nicht sonderlich mittig erschienen.

Der Endpunkt der Beschriftung ist der Punkt, der am weitesten (Luftlinie, nicht durch zählen ermittelt) vom Anfangspunkt entfernt liegt (im Bild der blaue rechts oben). Ausserdem muss dieser Punkt ebenfalls vom Mittelpunkt (und damit auch vom Anfangspunkt aus) erreichbar sein.

Verbinden von Anfangs- und Endpunkt

Maxbe chiemseezacken.png

Zum Verbinden des Anfangs- und Endpunktes wird wieder über die Kästchen gehüpft und ein Strich gezogen. Zum Abrunden der Zacken wird ein gleitender Mittelwert über die Linie berechnet und zusätzlich noch die Kanten gerundet


Die einfachen Fälle

Maxbe simssee.png

Viele Seen sind nicht so kompliziert, dass sie eine geschlungene Beschriftung bräuchten, eine diagonale Linie würde reichen. Deshalb wird vor der Wegsuche quer durch den See einfach ein Linie vom weitest entfernten Kästchen zur Mitte gezogen, bis zum gegenüberliegenden Ufer verlängert und dann nachgesehen, ob dieser Strich nicht doch eine Insel schneidet. Falls er das tut (oder die Linie zu kurz ist), muss man halt doch den komplizierten Weg nehmen.

Die ganz einfachen Fälle

Oft reicht es auch, einfach einen geraden Strich durch die Mitte zu ziehen. Deshalb wird ganz am Anfang geprüft, ob der See sich dafür eigenet (d.h. er ist rund oder liegt in Ost-West-Richtung und füllt seine bounding box zur hälfte aus) und dann dieser Strich durch die Mitte gezogen. Falls dieser Strich dann mindestens halb so breit ist wie die bounding box, wird nicht weiter gerechnet.

Ähnliche Qualitätskriterien werden auch bei der Diagonalen und bei den Kurven verwendet. Falls die Kriterien nicht erfüllt werden, oder z.B. keine verbundenen Kästchen gefunden werden, wird wieder auf den horizontalen Strich (ein dann halt sehr kurzer) zurückgegriffen.

Eine Stichprobe über 29000 deutsche Seen zeigt, dass fast die Hälfte horizontal beschriftet werden können, 1/3 diagonal und nur der Rest eine Kurve bekommt. Bei 2% wird auf diese Weise gar keine vernünftige Linie gefunden, die bekommen dann einen kurzen Strich durch die Mitte.

Das Programm dafür und der Kartenstil

Maxbe lakelabel otm chiemsee.png

Wird im github der OpenTopoMap gepflegt. An den Buchstaben wird noch gearbeitet, man sieht also derzeit nur eine noch vorläufige Darstellung z.B. des Ammer- und Starnberger Sees oder der Küste Norwegens mit ihren vielen natural=bay