DE:OpenSeaMap/smfilter
smfilter
smfilter ist ein Programm, das Teil des OpenSeaMap Renderingprozesses ist. Es ist ein Präprozessor, der vor dem eigentlichen Rendering druchlaufen wird. smfilter liest eine OSM-Datei von Standard-Eingang, verarbeitet alle Leuchtfeuer und gibt das Ergebnis wieder im OSM-Format auf Standard-Ausgang aus. Die Ausgabe enthält sämtliche Eingangsdaten und zusätzliche Nodes, Ways und Tags, die für die Sektoren von Leuchtfeuern erzeugt wurden. Das vereinfacht den Renderingprozess und verringert die Datenmenge in der OSM-Datenbank.
Sektoren von Leuchtfeuern werden definiert durch einige Tags wie sie Datenmodell beschrieben sind. Anfang und Ende eines Sektors sind definiert durch seamark:light:#:sector_start=* und seamark:light:#:sector_end=*. Die Werte sind Gradangaben zwischen 0° und 360°. Achtung: die Angaben sind Peilungen vom Beobachter zum Leuchtfeuer, d.h. die Angaben sind um 180° gedreht. Das ist die für Seefahrer übliche Angabe. smfilter liest und verarbeitet die Sektordaten und fügt einen Sektorbogen in Form von Nodes die durch einen Weg verbunden sind hinzu und zwei radiale Wege vom Feuer zu den beiden Endpunkten des Sektorbogens. Diese Wege können danach vom Renderer ganz einfach verarbeitet werden.
Alle Wege werden mit speziellen Tags versehen, die Informationen enthalten, damit der Renderer diese auch richtig darstellen kann. Diese Wege und Tags bilden interne, virtuelle Daten, die nicht in der OSM-Datenbank verwendet werden, sondern nur temporär im Renderingprozess zwischen smfilter und DE:Osmarender existieren.
Radius-Erweiterung
seamark:light:#:radius=* (siehe Rendering Sector Arcs) ist ein optionales Tag, um das Verhalten von smfilter zu steuern. Es definiert den Radius eines Sektors und zusätzliche Informationen, die die Kartendarstellung beeinflussen. Bitte beachte, dass diese Information keine Relevanz für die Navigation hat.
Die Werte von seamark:light:#:radius=* sind wie folgt definiert:
seamark:light:#:radius = <arcdef>[;<arcdef>][;...] <arcdef> ::= [<radius>][:<secdef>] <secdef> ::= <segment>[:<style>] | <style>[:<segment>] <radius> ::= Radius in Seemeilen. <segment> ::= Winkel des Sektorbogensegments in Grad relativ zu sector_start. <style> ::= 'solid' | 'dashed' | 'suppress'
<segment> kann auch eine negative Zahl sein, wodurch es sich gegen den Uhrzeigersinn auf sector_end bezieht. Das ist allerdings nur im letzten <arcdef> erlaubt. Falls nur ein einziges <arcdef> existiert wird ein virtuelles solid (dicker Balken) Segment automatisch davor eingefügt (siehe Sektor 3 des unten angeführten Beispiels).
<radius> und <segment> müssen als Kommazahl ohne Einheiten angegeben werden (Einheiten würden einfach ignoriert). Negative Werte von <radius> werden ignoriert, stattdessen wird ein Standardwert angenommen.
Falls die Summe von allen Winkeln der Segmente nicht dem eigentlichen Bereich des Sektors entspricht, wird smfilter das Ganze strecken oder stauchen, damit es wieder dem Sektorwinkel entspricht (siehe Beispiel, Sektor 2). Dabei handelt es sich immer um einen Mapping-Fehler und das Ergebnis wird in der Regeln nicht dem entsprechen, was der Kartenzeichner eigentlich wollte. Falls ein negativer Wert für <segment> im letzten <arcdef> gesetzt wird, so wird smfilter das vorangehende Segment so weit dehnen, dass die Winkel im Summe dem Sektor entsprechen (siehe Sektoren 1 und 5 des Beispiels).
Special Cases
Currently, two special case with different behavior as described above exist: First, unsectored lights with a seamark:light:radius = x. An annular arc way will be generated with the specified radius and no radial ways. Second, lights with seamark:light:[#:]category = directional and seamark:light:[#:]orientation = x which is correct tagging for directional lights. A small arc (of about 4 degress) is drawn having one radial way in the center of the arc. This radial way corresponds to the value of the orientation tag.
Example
The following light shows some examples of how to use the radius tag. It has 5 different sectors and additional there is a leading sector defined be seamark:light:orientation=* (such a light would probably not exist in reality).
<?xml version='1.0' encoding='UTF-8'?> <osm version='0.6' generator='Bernhard R. Fischer'> <node id='1' version='1' visible='true' timestamp='2008-07-25T11:12:13Z' lat='38.3' lon='25.1'> <tag k='seamark:name' v='smfilter test object' /> <tag k='seamark:type' v='light_minor' /> <tag k='seamark:light:character' v='Fl' /> <tag k='seamark:light:period' v='8' /> <tag k='seamark:light:category' v='directional' /> <tag k='seamark:light:orientation' v='230' /> <tag k='seamark:light:radius' v='1.2' /> <tag k='seamark:light:1:sector_start' v='40'/> <tag k='seamark:light:1:sector_end' v='70'/> <tag k='seamark:light:1:colour' v='white'/> <tag k='seamark:light:1:radius' v='1:10;:dashed;:solid:-10'/> <tag k='seamark:light:2:sector_start' v='120'/> <tag k='seamark:light:2:sector_end' v='190'/> <tag k='seamark:light:2:colour' v='red'/> <tag k='seamark:light:2:radius' v='.5:20;:10:suppress;:10:dashed;:10:solid'/> <tag k='seamark:light:3:sector_start' v='300'/> <tag k='seamark:light:3:sector_end' v='20'/> <tag k='seamark:light:3:colour' v='green'/> <tag k='seamark:light:3:radius' v='.3:-25:suppress'/> <tag k='seamark:light:4:sector_start' v='25'/> <tag k='seamark:light:4:sector_end' v='35'/> <tag k='seamark:light:4:colour' v='red'/> <tag k='seamark:light:4:radius' v='1.5'/> <tag k='seamark:light:5:sector_start' v='250'/> <tag k='seamark:light:5:sector_end' v='300'/> <tag k='seamark:light:5:colour' v='red;green'/> <tag k='seamark:light:5:radius' v='1'/> </node> </osm>