Das ist eine sql-Funktion “viewpointdirection()”, die das Feld liest, Anfangs- und Endwinkel ggf. berechnet und rundet und die Werte Mapnik-gerecht zurückliefert:
gis=> select viewpointdirection('0-188');
--------------------
(4,184,180,,,)
select viewpointdirection('west-NE;180-210');
-------------------------
(270,45,135,165,225,60)
select viewpointdirection('irgendwas nicht interpretierbares');
--------------------
(0,360,360,,,)
Die 4 Werte für Anfangswinkel und “Breite” des Icons werden dann aus der Datenbank gelesen
(SELECT way,tourism,
(viewpointdirection(direction)).s1 as firstrotation,(viewpointdirection(direction)).a1 as firstangle,
(viewpointdirection(direction)).s2 as secondrotation,(viewpointdirection(direction)).a2 as secondangle
FROM planet_osm_point WHERE tourism='viewpoint')
und an Mapnik verfüttert, das für jedes vorhandene Icon eine Regel hat (also eigentlich zwei Regeln: für das erste und das zweite Segment, falls vorhanden) und dieses Icon um den Anfangswinkel gedreht ausgibt.
Bisschen blöd dabei ist, dass man die Funktion 4x abfragen muss, weil ich keine Möglichkeit gefunden habe, Mapnik einen zusammengesetzten Datentyp auslesen zu lassen. Allerdings ist die Funktion auch recht billig, ein paar Zeichenkettenvergleiche, simple Rechnerei und in den meisten Fällen ist sie sowieso nach ein paar Zeilen Code fertig. Das sollte also den Renderer nicht allzusehr aufhalten.
Jo, wär auch was
Nachtrag: Hab nachgesehn, die OpenSeaMap verwendet ein eigenes, rendererfreundliches Schema für Leuchtfeuer mit seamark:light:(N):sector_start/end. Das könnte man vermutlich direkt an Mapnik weitergeben, ohne Versuche das zu interpretieren. Da sind ja nur Zahlen erlaubt und auch nur je eine pro Schlüssel.
Grüße
Max