.. _sym_construction: ***************************************************************************** Konstruktion von kartographischen Signaturen ***************************************************************************** :Author: Peter Freimuth :Contact: pf at mapmedia.de :Author: Arnulf Christl :Contact: arnulf.christl at wheregroup.com :Revision: $Revision: 8484 $ :Date: $Date: 2009-01-31 16:38:27 +0100 (Sa, 31. Jan 2009) $ .. contents:: Inhaltsverzeichnis :depth: 2 :backlinks: top .. index: single: Symbol Construction; Übersicht ========= Dieses Dokument bezieht sich auf die Syntax der Map-und Symboldatei für die MapServer Version 4.6. Es basiert auf Ergebnissen eines Projektes für die Universität Hannover – Institut für Landschaftspflege und Naturschutz – vertreten durch Herrn Dipl.Ing. Roland Hachmann und dem Praktikumsbericht von Karsten Hoffmann, "Geographiestudent der Humboldt Universität zu Berlin mit dem Nebenfach Kartographie an der FU Berlin!!". Im Rahmen eines bei der Firma GraS GmbH durchgeführten Praktikums gehörte die Zeichengenerierung im UMN MapServer zu einem der Schwerpunkte. (`Download des Praktikumsbericht`_ in Deutsch) Seine Diplomarbeit wird sich ebenfalls mit dieser Thematik beschäftigen. Am Ende des Dokumentes finden Sie auch den Download-Link zu einem Diskussionspapier zur Weiterentwicklung des UMN MapServers im Bereich kartographische Darstellungsmöglichkeiten. Ich bitte alle an dieser Thematik Interessierten um eine konstruktive Diskussion der dort angesprochenen Punkte. Des weiteren sollten wir über die Liste Feature-Wünsche im Bereich MapServer-Graphik zusammentragen. .. _`Download des Praktikumsbericht`: http://www.mapmedia.de/fileadmin/user_upload/dokumente/umn_signaturen_howto/Praktikumsarbeit.zip Einleitung ========== Kartographische Zeichen werden nach punkthaften, linienhaften und flächenhaften Zeichen unterschieden. Diese Zeichen können dann nach bestimmten Merkmalen (Variablen) variiert werden. Bertin (1974) entwarf ein klares und logisch aufgebautes Zeichenmodell in denen Zeichen nach bestimmten Graphischen Variablen verändert werden können. Im MapServer kommen folgende Variablen zur Anwendung: Form, Größe, Muster, Farbton und Helligkeit. Des Weiteren gibt es für punkt- und flächenhafte Objekte sowie für Schrift (TTF) noch die Möglichkeit diese mit einer 1-Pixel breiten Linie zu umranden, so dass also noch die Variable Kontur hinzugefügt werden kann. Mehrfaches Rendern und Überlagern --------------------------------- Eine Kontur für Flächen mit mehr graphischen Möglichkeiten kann auch mittels zweier Layer erzeugt werden, wobei beides mal auf dieselben Vektordaten (Polygone) zugegriffen wird. Es wird zunächst ein Layer vom TYPE LINE, welche also die Flächen mit einer Liniensignatur umrandet, definiert. Darüber kann dann ein zweiter Layer vom TYPE POLYGON gezeichnet werden, welcher die Flächensignatur zum Füllen der Polygone festlegt. Hierbei wird dann aber die innerhalb der Fläche liegende Hälfte der Umrandungslinie verdeckt (eine Art clipping), womit eine asymmetrische Liniensignatur erzeugt werden kann. Für eine vollständig sichtbare Umrandungslinie wird der Layer der Flächensignatur einfach unterhalb des Layers der Umrandungslinie angeordnet. Eine weitere und etwas aufwendige Möglichkeit zur Konstruktion von asymmetrischen Liniensignaturen für Flächenumrandungen wäre die Erzeugung von kleineren oder größeren Polygonen (von den Originalflächen), welche also innerhalb der Originalpolygone liegen oder diese überdecken und deren Ränder einen konstanten Abstand zueinander haben. Auf diese neuen Flächenrändern lässt sich dann eine Liniensignatur erzeugen. Dieses kann derzeit über die Verwendung des OFFSET Parameters erreicht werden, wobei der y-Wert -99 betragen muß. Allerdings ist diese Funktion noch nicht voll ausgereift!! (Featurewunsch? - Pufferzonen könnten hier ideale Aufsatzgeometrieen liefern. Sobald die „geos“ Bibliothek im MapServer integriert ist, sollte dies dann auch möglich sein.) Skalierung von Symbolen ----------------------- Es gibt zwei verschiedene Wege um die Größe von Symbolen oder kartographischen Elementen zu beeinflussen. Die Größe von kartographischen Objekten wird entweder in Bildschirmpixel oder realen Größeneinheiten angegeben. - Werden reale Größeneinheiten benutzt (z.B. Meter), sind kartographische Objekte skalierbar. Sie werden ihre Größe dem jeweiligen dargestellten Maßstab anpassen. - Werden Bildschirmpixel benutzt, werden die Symbole immer in dieser Größe dargestellt, unabhängig vom Kartenmaßstab. UMN MapServer benutzt die Methode mit Angabe der Bildschirmpixel. Zusätzlich kann die Größe der Elemente für bestimmte Maßstäbe defininiert werden, somit ergibt sich für die Größe gewissermassen eine Maßstabsabhängigkeit. Die dafür zu benutzenden Parameter sind SYMBOLSCALE, MINSIZE und MAXSIZE. Alle hier verwendeten Symbole und Style Definitionen sind in dem ZIP-Archiv (download_vortrag.zip) enthalten. Link befindet sich am Ende des Dokuments! Folgende Abbildung verdeutlicht die theoretische Struktur von kartographischen Zeichen, die auch im UMN MapServer Verwendung findet: **Abbildung1: Kartographische Zeichenstruktur`** .. image:: ../../images/carto-elements.png :height: 400 :width: 600 Die Definitionen der einzelnen Variablen werden in einer MapServer-Anwendung wie folgt auf die Map- und die Symboldatei aufgeteilt: *MAP* file: - Bestimmung der Geometrie (Punkt, Linie, Fläche) im jeweiligen Layer über TYPE, die Zeichen werden dann entweder auf Punkte, auf Linien oder auf Flächen angewandt - Definition der Farbe, der Helligkeit (über die Farbe), der Größe und der Kontur in der STYLE-Sektion einer CLASS-Sektion des Layers über COLOR, SIZE und OUTLINECOLOR - Kombination von mehreren „Grundelementen“ zu einer gewünschten Signatur über mehrere STYLEs im Layer (Zeichenreihenfolge beachten) *Symbol* file: - Definition der Form und des Musters über TYPE, POINTS, IMAGE, FILLED, STYLE (meint hier pattern) und GAP Folgende Übersicht veranschaulicht diese Zusammenhänge und erläutert den Aufbau der Abschnitte der Map- und der Symboldatei, die für die Konstruktion von Signaturen relevant sind: **Abbildung2: Schema zur Erläuterung der Map-und der Symboldatei** .. image:: ../../images/map-symbolfile-interaction.png Erstellung von kartographischen Signaturen mit dem UMN MapServer ================================================================ Die „Grundelemente“ (graphische Basiselemte) in der Symboldatei können aus Vektoren, TrueTypeFonts, Rasterbildern oder Cartolines bestehen, was über den TYPE-Parameter bestimmt wird. Es werden nun alle vier Typen der „Grundelemente“ und die Kombinationen dieser Elemente zu Signaturen näher erläutert. Zunächst wird aber noch eine kurze Betrachtung der Skalierungsproblematik (SYMBOLSCALE, MINSIZE, MAXSIZE) vorangestellt, da sie für den Einsatz komplexerer Signaturen im MapServer sehr wichtig sind. Skalierung von Signaturen ------------------------- Mit SYMBOLSCALE kann in der LAYER-Sektion eine Maßstabszahl angegeben werden, bei der die Signatur bzw. Beschriftung in ihrer über SIZE definierten Größe dargestellt wird. In anderen Maßstabsbereichen werden die Signaturen bzw. Beschriftungen dann mitskaliert. Mittels MAXSIZE und MINSIZE innerhalb des STYLE Blocks kann dieser Skalierungsvorgang auf ein für die Signatur vertretbaren Bereich eingegrenzt werden. Dabei sollte die „graphische Mindestgröße“ genauso wie der Flächenbedarf der Signatur in der Karte berücksichtigt werden. Bei Signaturen für Linien und Flächenfüllungen werden Symbole (Grundelemente) vom TYPE „PIXMAP“ nicht skaliert!. Des weiteren treten beim Skalierungsprozeß diverse Darstellungsprobleme auf, die primär auf die Aufrasterung aller Signaturen und die dabei zwangsweise auftretenden Rundungsungenauigkeiten zurückzuführen sind (Integerarithmetik der GD). Bei Signaturen, die aus mehreren „Grundelementen“ kombiniert sind, kann es vorkommen, dass in einigen Maßstabsbereichen (vor allem in den kleineren) die Elemente nicht mehr genau zueinander zentriert sind oder sich in der Form leicht verändern. Außerdem werden bei Linienmustern die Abstände und Längen der Linienabschnitte (also das Muster an sich) nicht mitskaliert. Diese bleiben immer gleich und nur die Breite der Linie wird verändert. Dies hat einen unschönen Effekt auf das eigentliche Muster, das sich scheinbar verändert. Da sich für die STYLE Sektionen keine Darstellungsintervalle via MINSCALE und MAXSCALE definieren lassen (Featurewunsch?) muß dieses Feintuning auf Layerebene gelöst werden. Dazu legt man sich mehrere Layer mit denselben Daten für verschiedene Maßstabsbereiche an und ordnet ihnen entsprechend die passenden Signaturen zu. Beachten Sie, dass Signaturen immer eine große Maßstabsabhängigkeit aufweisen! Denken Sie also bei der Umsetzung Ihrer Projekte immer an das Zusammenspiel von Inhalt, Signatur und Maßstab. Alles drei muß aufeinander abgestimmt werden, um gute Visualisierungsergebnisse (Bildschirmkarten) zu erzielen. Signaturen vom TYPE VECTOR und ELLIPSE -------------------------------------- Beim TYPE VECTOR wird durch die Angabe von x- und y-Werten innerhalb von POINTS und END die Form eines Zeichens definiert (die max Anzahl der Punkte kann über den Parameter MS_MAXVECTORPOINTS in mapsymbols.h verändert werden / default ist 100). Beachten Sie, dass Sie für eine geschlossene Figur auch den Endpunkt mitdefinieren müssen. Erster und letzter Punkt sind dabei identisch. Mit -99 -99 fügen Sie ein 'Pen up' Kommando ein. Soll heißen, der darauf folgenden Punkt wird nicht mit dem vorangegangenen verbunden. Dazu kann man sich ein kartesisches Koordinatensystem vorstellen mit dem Koordinatenursprung in der linken oberen Ecke. Bei der Erstellung von Signaturen vom TYPE „VECTOR“ sollte auch darauf geachtet werden, gewisse Gestaltungsrichtlinien zu beachten, wie z.B. die Vermeidung von gewissen Neigungswinkeln bei Linien die später als Füllmuster verwendet werden sollen, da diese zu starken Aliasingeffekten führen können. Des Weiteren sollten bestimmte Mindestgrößen nicht unterschritten werden, was natürlich für alle Typen von Signaturen gilt. Beim Definieren der Form sollten Sie zudem im Hinterkopf behalten, das die Punktfolge im Grunde Pixelkoordinaten (also nur ganzzahlig) in einer Bitmap darstellen. Aus jedem Symbol vom Typ Vector und Ellipse wird eine Bitmap erstellt, die dann zum Zeichnen verwendet wird! (Dies ist das allg. Grundprinzip des GD basierten Graphik-Kernels). PIXMAP Symbole können demnach direkt zum Zeichnen verwendet werden. Zur Darstellung von Kreisen und Ellipsen benutzt man den TYPE „ELLIPSE“. Hier erfolgt die Bestimmung der Form über die Festlegung der Radien in x- und y-Richtung innerhalb von POINTS und END. Konstruktion von Punktsignaturen -------------------------------- In folgendem Schema sind mehrere „Grundelemente“ zu einer Punktsignatur kombiniert worden. Die Kombination erfolgt über die Definition mehrerer STYLEs im Layer. Diese beziehen sich jeweils auf ein „Grundelement“ aus der Symboldatei, welche dann zentriert übereinander gezeichnet werden. Bei Punktsignaturen ist noch zu beachten, dass die SIZE-Angabe in der STYLE-Sektion nur für die Größe in y-Richtung gilt. So ist ein Rechteck, welches hochkant steht, kleiner als das Rechteck, wenn es liegt und die gleiche SIZE hat. Bei der Kombination von mehreren Elementen übereinander werden diese nicht immer zentriert. Es konnte hier noch keine feste Regel festgestellt werden. Es wird aber empfohlen, die Elemente, die kombiniert werden sollen, mit einer geradzahligen SIZE zu versehen. Bei der Kombination von Elementen mit geradzahligen und ungeradzahligen SIZE-Angaben sind die Verschiebungen meist größer. **Abbildung3: Konstruktion von Punktsignaturen** .. image:: ../../images/point-symbols.png :height: 400 :width: 600 Konstruktion von Liniensignaturen --------------------------------- Bei der Anwendung der Elemente aus der Symboldatei auf Linien, wird oft ein einfacher Punkt (gefüllter Kreis / SYMBOL 0) verwendet. Dieser wird dann sozusagen auf jedem Pixel der zu zeichnenden Linien gezeichnet, was eine durchgehende Linie mit runden Enden ergibt. Um Linienmuster zu erzeugen, gibt es eine STYLE-Sektion in der Symboldatei (nicht zu verwechseln mit der STYLE Sektion der CLASS), in der man angibt, wie viele Pixel das Element gezeichnet wird und wie viele dann nicht. Dies wiederholt sich dann immer wieder, so dass ein Muster entsteht. Folgendes Schema verdeutlicht diesen Aspekt. Leider läßt sich derzeit noch kein OFFSET für ein Muster definieren, um gegeneinander versetzte Muster zu erzeugen.(Featurewunsch?) **Abbildung4: Konstruktion von Liniensignaturen** .. image:: ../../images/line-symbols.png :height: 400 :width: 600 Bei der Verwendung des Punktzeichens gibt es aber den Effekt, dass die Enden der Linien nicht gerade abschließen, sondern rund (ist besonders bei großen SIZE-Angaben sichtbar). Dies kann gewünscht oder ungewünscht sein. Wenn man breite Linien verwenden möchte, kann man genauso gut ein Rechteck zum Zeichnen der Linie benutzen. Dieses kann dann auch noch mit einem STYLE-Parameter versehen werden, um ein Linienmuster zu erzeugen (siehe folgende Tabelle). **Tabelle 1. Konstruktion einer Signatur für eine Eisenbahnlinie** +----------------------------------+---------------------------------+ | CLASS-section from the Mapfile | Character from the Symbolfile | +==================================+=================================+ |.. code-block:: mapfile |.. code-block:: mapfile | | | | | CLASS | SYMBOL | | STYLE | NAME 'point' | | COLOR 102 102 102 | TYPE ELLIPSE | | SYMBOL 'point' | POINTS | | SIZE 4 | 1 1 | | END | END | | STYLE | FILLED TRUE | | COLOR 255 255 255 | END | | SYMBOL 'rectangle-train' | | | SIZE 2 | SYMBOL | | END | NAME 'rectangle-train' | | END | TYPE VECTOR | | | POINTS | | | 0 0 | | | 0 0.6 | | | 1 0.6 | | | 1 0 | | | 0 0 | | | END | | | FILLED TRUE | | | STYLE | | | 8 12 8 12 | | | END | | | END | +----------------------------------+---------------------------------+ .. image:: ../../images/railway.png Generell kann der STYLE-Parameter für alle Elemente der Symboldatei vom TYPE „VECTOR“, „ELLIPSE“, „CARTOLINE“ und „PIXMAP“ benutzt werden. Dieser wirkt sich dann bei der Anwendung der Zeichen auf eine Linie aus und steuert in welchen Abständen das Symbol gezeichnet wird. Beim Symboltype „Truetype“ wird dies mittels des GAP Parameters realisiert. Dazu aber später mehr. Bei der Kombination mehrerer Elemente auf einer Linie werden diese auf der Aufsatzlinie (in Pixelkoordinaten transformierte Geometrie des Objektes) gezeichnet. Auch hier gibt es wieder das Problem der Zentrierung. Es wurde beobachtet, dass in den meisten Fällen der MapServer von der Mitte ausgeht. Eine Kombination von einer 6-Pixel breiten Linie mit einer 4-Pixel breiten Linie ergibt eine Liniensignatur mit einem 1-Pixel breiten Rand auf beiden Seiten. Wenn man dann aber noch eine 1-Pixel breite Mittellinie einzeichnen möchte, muss man die SIZE-Angaben verändern, damit sie auch wirklich in der Mitte liegt. Das ist z.B. bei einer 7- und einer 5-Pixel breiten Linie der Fall. Auch hier gilt also der Hinweis bei der Kombination mehrerer Linien diese alle mit geradzahligen oder ungeradzahligen SIZE-Angaben zu versehen. (siehe obiges Beispiel). In der STYLE-Sektion der Map-Datei gibt es noch den OFFSET-Parameter. Man gibt einen x- und y-Wert in Pixeln (sofern über SIZEUNITS nichts anderes definiert wurde) an und kann damit also Zeichen in x- und in y-Richtung verschieben. Leider orientieren sich die x- und y-Richtungen beim OFFSET nicht an der Linie sondern am Kartenbild (Ausnahme: OFFSET n -99). Somit werden dann die wiederholt gezeichneten Zeichen alle in die gleiche Richtung verschoben, unabhängig davon in welche Richtung die Linie verläuft (siehe folgendes Beispiel). Zur Erzeugung von asymetrischen Liniensignaturen oder linienbegleitenden Signaturen müssen Sie beim y Wert des OFFSET den Wert -99 einsetzen. Über den x Wert definieren Sie dann den Abstand in dem eine parallele zur Originalgeometrie konstruiert wird, auf welche die gewählte Signatur angewendet wird. (Schade das dies nirgends dokumentiert war!) **Tabelle 2: Verwendung des OFFSET-Parameters bei Liniensignaturen** +--------------------------------+-------------------------------+--------------------------------+-------------------------------+ | CLASS-section from the Mapfile | Character from the Symbolfile | CLASS-Section from the Mapfile | Character from the Symbolfile | +================================+===============================+================================+===============================+ |.. code-block:: mapfile |.. code-block:: mapfile |.. code-block:: mapfile |.. code-block:: mapfile | | | | | | | CLASS | SYMBOL | CLASS | SYMBOL | | STYLE | NAME "circle" | STYLE | NAME "circle" | | SIZE 1 | TYPE ELLIPSE | SIZE 1 | TYPE ELLIPSE | | COLOR 0 0 0 | POINTS | COLOR 0 0 0 | POINTS | | END | 1 1 | ANTIALIAS | 1 1 | | STYLE | END | END | END | | SYMBOL "circle" | STYLE | STYLE | STYLE | | SIZE 7 | 1 10 1 10 | SYMBOL "circle" | 1 10 1 10 | | COLOR 0 0 255 | END | SIZE 12 | END | | OFFSET 8 -8 | END | COLOR 0 0 255 | END | | END | | OFFSET -8 -99 | | | END | | ANTIALIAS TRUE | | | | | END | | | | | END | | +--------------------------------+-------------------------------+--------------------------------+-------------------------------+ .. image:: ../../images/symbol-offset-1.png .. image:: ../../images/symbol-offset-1.png Flächen ------- Flächen (Polygone) können mit Elementen der Symboldatei gefüllt werden, um z.B. Schraffuren oder Raster zu erzeugen. Diese werden dann ohne Abstände hintereinanderweg in x- und y-Richtung gezeichnet und füllen somit die gesamte Fläche aus. Es können einfache Linienschraffuren (z.B. horizontal, vertikal und diagonal) erzeugt werden, indem die Fläche mit einem definierten Linienabschnitt aus der Symboldatei gefüllt wird (siehe Bsp.5). Bei Linienschraffuren gibt der SIZE-Parameter in der STYLE-Sektion aber nur die Abstände zwischen den Linien an und nicht deren Breite. Die Linienbreite beträgt bei diesen Schraffuren immer 1 Pixel. Einen Parameter für die Liniendicke gibt es leider nicht. (Featurewunsch?) Des Weiteren ist zu beachten, dass dieselbe SIZE-Angabe für horizontale und für vertikale Linien nicht dieselben Abstände ergibt. Bei vertikalen Linien ergibt die SIZE-Angabe von 8 einen Abstand von 8 Pixeln zwischen den Linien. Bei horizontal verlaufenden Linien dagegen sind die Abstände bei derselben SIZE-Angabe wesentlich geringer (siehe Bsp.5). Dies ist vor allem bei der Erstellung von Kreuzschraffuren zu beachten, die man bei der Kombination von vertikalen und horizontalen Linien erhält. Eine Kreuzschraffur mit gleichen Linienabständen lässt sich derzeit am besten mit einem einfachen Kreuz aus der Symboldatei erzeugen. Bemerkung: Auch dieses Problem wurde im Rahmen der Code-Recherche beseitigt. Flächen können auch mit anderen punkthaften Elementen gefüllt werden, um bestimmte Flächenmuster zu erhalten (z.B. mit Kreisen oder Dreiecken). **Tabelle 3: Konstruktion einer Kreuzschraffur mit unterschiedlichen Linienabständen** +--------------------------------+-------------------------------+ | CLASS-Section from the Mapfile | Character from the Symbolfile | +================================+===============================+ |.. code-block:: mapfile |.. code-block:: mapfile | | | | | CLASS | SYMBOL | | STYLE | NAME "line-vertical" | | SYMBOL "line-vertical" | TYPE vector | | SIZE 8 | POINTS | | COLOR 255 102 51 | 0.5 0 | | OUTLINECOLOR 0 0 0 | 0.5 1 | | END | END | | STYLE | END | | SYMBOL "line-horizontal" | SYMBOL | | SIZE 8 | NAME "line-horizontal" | | COLOR 204 102 51 | TYPE vector | | OUTLINECOLOR 0 0 0 | POINTS | | END | 0 0.5 | | END | 1 0.5 | | | END | | | END | +--------------------------------+-------------------------------+ .. image:: ../../images/crosshatch.png Signaturen vom TYPE PIXMAP -------------------------- Zeichen vom TYPE PIXMAP sind kleine Rasterbilder. Diese werden in der Symboldatei definiert und dort über den IMAGE Parameter eingebunden. MapServer unterstützt die Formate GIF und PNG. Hierbei ist auf die Farbtiefe der Bilder zu achten. Es sollte vermieden werden, ein 24-bit PNG-Symbol für eine Ausgabe im 8-bit Modus zu verwenden. Dies kann zu unvorhergesehenen Farbveränderungen führen. Bei der Nutzung von Rasterbildern für Signaturen kann man nachträglich keine graphischen Veränderungen (z.B. die der Farbe) mehr vornehmen. In der Symboldatei kann mit dem TRANSPARENT Parameter eine Farbe, durch die Angabe des entsprechenden Indexes in der Farbpalette des Rasterbildes, definiert werden. Diese Farbe wird dann transparent dargestellt. Im Ergebnis scheint die darunter liegende Graphik dann praktisch durch. Bei der Anwendung von PIXMAP Symbolen als Punkt-Marker, läßt sich deren Größe über die SIZE-Angabe noch variieren. Hier wird dann aber z.B. bei einer Vergrößerung die Pixelstruktur des Bildes sichtbar. Dies kann durch setzen des MAXSIZE Parameters aber unterbunden werden. Bei der Anwendung des Bildes auf Linien oder Flächen wird es immer in seiner Originalgröße dargestellt. Somit sind PIXMAP Symbole nicht oder nur eingeschränkt für Signaturierungen die einen hohen Skalierungsbedarf haben einsetzbar. PIXMAP Symbole werden bei der Benutzung als linienbegleitendes Zeichen immer in die gleiche Richtung visualisiert. Sie richten sich nicht nach der Richtung und dem Verlauf der Linien (d.h. sie werden nicht gedreht). Sie haben somit das gleiche Manko wie Symbole vom Type VECTOR oder ELLIPSE. Nur TrueType Symbole besitzen diesen Mechanismus, wenn auch mit einigen Mängeln. Dazu aber später mehr. Um komplexere Flächenfüllungen zu erreichen, z.B. mit Abständen zwischen den einzelnen Zeichen oder Schraffuren mit breiten Linien, sind Rasterbilder wohl derzeit am besten geeignet. Je nach gewünschtem Muster muss das Rasterbild mit seinen graphischen Elementen millimetergenau in einem Grafikprogramm erstellt werden. Für eine in der Fläche regelmäßig verteilte und diagonal angeordnetes Zeichen könnte man das Rasterbild in Abb. 1 verwenden. **Abbildung5: Rasterbild für eine regelmäßige Flächenfüllung** .. image:: ../../images/polygon-symbol-fill.png :height: 400 :width: 600 **Abbildung6: Rasterbild für eine Flächenschraffur** .. image:: ../../images/hatch-symbol-fill.png :height: 400 :width: 600 Anstelle der Kreise können natürlich auch andere Zeichen benutzt werden. B bezeichnet die Breite und H die Höhe des Rasterbildes. Für eine regelmäßige Anordnung der Zeichen in einem 45-Grad Winkel gilt B = H. Für Signaturen, die regelmäßig neben- und untereinander ohne Versatz angeordnet sind, würde ein Zeichen reichen, welches in der Bildmitte liegt und gleiche Abstände in x- und y-Richtung zum Bildrand hat. Eine regelmäßige Schraffur mit breiteren Linien kann mit dem Rasterbild in Abb. 2 erstellt werden. Für eine 45 Grad-Schraffur gilt dabei: :: B = H and x = y Zur Erstellung der Legende muss beachtet werden, dass das Rasterbild nur einmal in der Mitte des Legendenkästchens und in Originalgröße gezeichnet wird. Im folgenden sind ein paar Beispiele von PIXMAP-Zeichen aufgeführt, die auf Flächen angewandt wurden und Transparenz benutzen. Die Rasterbilder wurden mit dem Grafikprogramm FreeHand konstruiert und mit Photoshop nachbearbeitet und in das PNG-Format unter Beachtung der verwendeten Farbpalette exportiert. In der STYLE-Sektion in der CLASS muss eine Farbe (COLOR) angegeben werden, damit das Rasterbild visualisiert wird. Für das Aussehen und die Farbe des Bildes hat diese Angabe aber keine Auswirkung. **Tabelle 4: Konstruktion einer waagerecht angeordneten Flächensignatur** +--------------------------------+-------------------------------------------------+ | CLASS-Sektion aus der Mapdatei | Zeichen aus der Symboldatei | +================================+=================================================+ |.. code-block:: mapfile |.. code-block:: mapfile | | | | | CLASS | SYMBOL | | STYLE | NAME "in_the_star" | | COLOR 255 255 0 | TYPE PIXMAP | | END | IMAGE "stern.png" | | STYLE | TRANSPARENT 8 | | SYMBOL "in_the_star" | END | | COLOR 0 0 0 | | | OUTLINECOLOR 0 0 0 |.. image:: ../../images/star-symbol.png | | END | :align: left | | END | | +--------------------------------+-------------------------------------------------+ .. image:: ../../images/horizontal-area-symbol.png **Tabelle 5: Konstruktion einer diagonal angeordneten Flächensignatur** +--------------------------------+-------------------------------------------------+ | CLASS-Sektion aus der Mapdatei | Zeichen aus der Symboldatei | +================================+=================================================+ |.. code-block:: mapfile |.. code-block:: mapfile | | | | | CLASS | SYMBOL | | STYLE | NAME "in_point1" | | SYMBOL "in_point1" | TYPE PIXMAP | | COLOR 0 0 0 | IMAGE "flaeche1_1.png" | | OUTLINECOLOR 0 0 0 | TRANSPARENT 13 | | END | END | | END | | | |.. image:: ../../images/dot-symbol.png | | | :align: left | +--------------------------------+-------------------------------------------------+ .. image:: ../../images/diagonal-area-symbol.png **Tabelle 6: Konstruktion einer Flächenschraffur** +--------------------------------+-------------------------------------------------+ | CLASS-Sektion aus der Mapdatei | Zeichen aus der Symboldatei | +================================+=================================================+ |.. code-block:: mapfile |.. code-block:: mapfile | | | | | CLASS | SYMBOL | | STYLE | NAME "in_hatch" | | COLOR 255 255 0 | TYPE PIXMAP | | END | IMAGE "schraffur.png" | | STYLE | TRANSPARENT 2 | | SYMBOL "in_hatch" | END | | COLOR 0 0 0 | | | OUTLINECOLOR 0 0 0 |.. image:: ../../images/hatch.png | | END | :align: left | | END | | +--------------------------------+-------------------------------------------------+ .. image:: ../../images/hatch-symbol.png Signaturen vom TYPE „CARTOLINE“ ------------------------------- Der TYPE „Cartoline“ ist im Grunde kein wirklich eigenständiger SYMBOL Typ. Er ist lediglich für die Konstruktion von Liniensignaturen verwendbar. Großer Vorteil gegenüber der herkömmlichen Methode ist das 'Antialiasing' von beliebig breiten Linien dieses Typs. Herkömmliche Linien konnten nur mit einer Breite von 1 mit einem antialiasing gezeichnet werden. Bei diesem Linientyp können Sie im STYLE Block der CLASS Definition genauso wie bei TrueType Symbolen oder Schriften ebenfalls den ANTIALIAS Parameter verwenden. Auch hier können Linienmuster und Offsets definiert werden. Die Gestaltung der Linienenden kann mittels des LINECAP Parameters gesteuert werden. Der LINECAP Wert „butt“ beendet die Signatur exakt am Ende der Aufsatzlinie. Author dieses Features ist Tomas Krecmer (tokr at tmapy.cz). Bei Fragen zu diesem Signaturentyp oder bei Verbesserungsvorschlägen empfehle ich eine direkte Kontaktaufnahme mit dem Author. Gestrichelte Linie vom Typ Cartoline ............................................................................... .. code-block:: mapfile SYMBOL NAME "cartoline" TYPE cartoline LINECAP round #[butt|round|square|triangle] LINEJOIN miter #[round|miter|bevel] LINEJOINMAXSIZE 3 STYLE 40 17 1 17 1 17 1 17 END END LINEJOIN ............................................................................... Die verschiedenen Werte für den Parameter LINEJOIN haben folgende visuellen Auswirkungen (default ist 'none'), wobei 'none' kein gültiger Wert für diesen Parameter ist. Sollten Sie kein LINEJOIN verwenden wollen, so lassen Sie den Parameter einfach komplett weg. .. image:: ../../images/linejoin.jpg Miter hier werden die Linienkanten bis zum Schnittpunkt verlängert und die entstehende Fläche gefüllt. Round s.o. Bevel s.o. None Linien werden nicht verbunden sondern an den jeweiligen Enden mit LINECAP 'butt' gezeichnet. .. image:: ../../images/miter-linejoin.jpg LINEJOINMAXSIZE ............................................................................... Definiert die maximale Länge für m (nur für LINEJOIN miter von Bedeutung). Der Wert dient dabei als Multiplikationsfaktor (default ist 3). Die tatsächliche max. Länge berechnet sich wie folgt: :: m - current join size d - symbol size m_max = d * LINEJOINMAXSIZE Wenn current m > m_max dann wird die Verbindungslänge auf m_max gesetzt. Signaturen vom TYPE „TRUETYPE“ ------------------------------ Als letztes lassen sich noch Zeichen aus TrueTypeFonts verwenden. Die Definition erfolgt auch hier in der Symboldatei. Dabei gibt man die Nummer des gewünschten Zeichens aus der TrueTypeFont-Datei bei CHARACTER an. Bei FONT wird der Alias-Name der Fontdatei angegeben der in der Datei fonts.list definiert ist. Es muss dabei natürlich der FONTSET in der Map-Datei auf die fonts.list-Datei gesetzt werden. Mit ANTIALIAS wird festgelegt, ob ein Antialiasing für das Zeichen durchgeführt werden soll. Gerade bei komplexeren Zeichen und solchen, die sich nicht gut in die Rastermatrix einpassen und bei denen die Pixelstruktur deutlich sichtbar ist, wird empfohlen das Antialiasing anzuwenden. Desweiteren läßt sich noch die POSITION [ul|uc|ur|cl|cc|cr|ll|lc|lr] definieren. In der STYLE-Sektion im Layer können für TrueType-Zeichen unterschiedliche Farben und Größen (wie bei den Zeichen vom Typ Vektor) festgelegt werden (siehe auch Abb. 12). Für die Anwendung eines TrueType-Zeichens als Linienbegleitendes Zeichen, kann man in der Symboldatei mit GAP einen Abstand in Pixeln definieren, in dem das Zeichen nicht dargestellt wird. Ein komplizierteres Muster wie mit dem STYLE Parameter der VECTOR, ELLIPSE oder PIXMAP Symbole läßt sich hiermit jedoch nicht generieren. (Featurewunsch?) Der OFFSET-Parameter kann hier derzeit ebenfalls noch nicht benutzt werden. TrueType-Zeichen richten sich nach der Linienorientierung und ändern somit auch ihre Ausrichtung mit der Linie. Bei der Nutzung von nichtsymmetrischen Zeichen, welche eine Fläche umranden, zeigt das Zeichen aber leider nicht immer nach außen oder nach innen, sondern es variiert. Die Zeichen werden, wenn möglich, nach oben zeigend dargestellt (bei waagerechten und schrägen Linien). Bei senkrechten Linien werden sie je nach Zeichenrichtung der Linie nach rechts oder nach links zeigend visualisiert. Wenn die Linie von unten nach oben gezeichnet wird, wird das TrueType-Zeichen nach links zeigend dargestellt und bei einer von oben nach unten gezeichneten Linie nach rechts zeigend visualisiert. Dies kann man in der Bsp.8 erkennen. Beim Bild links in der Tabelle wurde die Linie im Uhrzeigersinn und beim rechten Bild entgegengesetzt dem Uhrzeigersinn gezeichnet. Duch einen negativen GAP Wert, kann dieses Verhalten jedoch abgeschaltet werden!! Probieren Sie dies einfach mal aus. Sie werden überrascht sein! **Tabelle 7: TrueType-Zeichen angewandt auf Linien** +--------------------------------+-------------------------------------------------+ | CLASS-Section from the Mapfile | Character from the Symbolfile | +================================+=================================================+ |.. code-block:: mapfile |.. code-block:: mapfile | | | | | CLASS | SYMBOL | | STYLE | NAME "T" | | SYMBOL "T" | TYPE TRUETYPE | | SIZE 12 | FONT "arial" | | COLOR 0 0 255 | CHARACTER "T" | | END | ANTIALIAS TRUE | | END | GAP 10 | | | END | | | | +--------------------------------+-------------------------------------------------+ .. image:: ../../images/truetype-character-clockwise.png .. image:: ../../images/truetype-character-cc.png Um die Character-Nummer eines Zeichens herauszufinden stehen folgende Optionen zur Wahl: * FontMap benutzen (Shareware, aber freie Try Version zum downloaden)(danke Till!) * Zeichenkarte von MS Windows benutzten * "Try And Error" Prinzip verfolgen Achten Sie darauf, das bei sogenannten „Symbol Fonts“ die Nummerierung erst bei 61440 beginnt. Um also auf den Character T zuzugreifen, müssten Sie dazu 61440 + 84 =  verwenden. (total tricky, oder!!) Beispiele ========= Hier sind einige Beispiele, die die verschiedenen Möglichkeiten des UMN MapServers zur kartographischen Signaturierung der vektorbasierten Kartenobjekte aufzeigen sollen (dies hat in keinerlei Hinsicht den Anspruch auf Vollständigkeit): Basic Symbols ------------- .. image:: ../../images/point-symbol-examples.png .. image:: ../../images/line-symbol-examples.png .. image:: ../../images/pattern-symbol-examples.png Complex Symbols --------------- .. image:: ../../images/point-symbol-complex.png .. image:: ../../images/line-symbol-complex.png .. image:: ../../images/pattern-symbol-complex.png Aktuelle Probleme ================= Bei nichtgeschlossenen (z.B. einem Kreuz) und bei ungefüllten Zeichen vom TYPE VECTOR gibt es in der aktuellen Version noch das Problem, dass der MapServer diese, wenn sie als linienbegleitendes Zeichen verwendet werden, verändert. Die Zeichen werden geschlossen und gefüllt. (siehe Bsp.3). Dieser Fehler wurde im Rahmen unserer Code-Recherche behoben und wird in einem zukünftigen Release wohl beseitigt sein. Außerdem ist der OUTLINECOLOR-Parameter zur Erzeugung einer 1-Pixel breiten Umrandung nicht für Zeichen auf einer Linie anwendbar. Dies kann aber wie zuvor bereits beschrieben wurde wesentlich besser und flexibler durchgeführt werden. Ein weiteres Problem ist die Verwendung von Linienmustern (z.B. gestrichelte Linie) auf Linien mit vielen Ecken und Kurven. Das Linienmuster wird dann oftmals nicht mehr regelmäßig dargestellt (siehe Bsp.4). **Tabelle 8: Verwendung eines einfachen Kreuzes auf einer Linie** +--------------------------------+-------------------------------------------------+ | CLASS-Section from the Mapfile | Character from the Symbolfile | +================================+=================================================+ |.. code-block:: mapfile |.. code-block:: mapfile | | | | | CLASS | SYMBOL | | STYLE | NAME "cross2" | | SIZE 1 | TYPE VECTOR | | COLOR 0 0 0 | POINTS | | END | 0 0 | | STYLE | 1 1 | | SYMBOL "cross2" | -99 -99 | | SIZE 8 | 0 1 | | COLOR 204 153 0 | 1 0 | | OFFSET 1 -7 | END | | END | STYLE | | END | 1 15 1 15 | | | END | | | END | +--------------------------------+-------------------------------------------------+ .. image:: ../../images/cross-fill-example.png **Tabelle9: Unregelmäßigkeiten bei Linienmustern** +--------------------------------+-------------------------------------------------+ | CLASS-Section from the Mapfile | Character from the Symbolfile | +================================+=================================================+ |.. code-block:: mapfile |.. code-block:: mapfile | | | | | CLASS | SYMBOL | | STYLE | NAME "border2" | | SYMBOL "border2" | TYPE VECTOR | | SIZE 2 | POINTS | | COLOR 255 0 0 | 0 0 | | END | 1 0 | | END | 1 0.8 | | | 0 0.8 | | | 0 0 | | | END | | | STYLE | | | 10 6 1 6 | | | END | | | FILLED TRUE | | | END | +--------------------------------+-------------------------------------------------+ .. image:: ../../images/irregular-line-pattern.png Alle hier dargestellten Signaturen wurden mit Mapfiles und Symbolfiles erstellt, die in einem ZIP-Archiv zusammengefasst worden sind (`Download`_). Sollten Sie das Symbolfile verwenden wollen, so beachten Sie bitte, das Ihr Mapserver mindestens 50 Symbols verarbeiten kann. Ansonsten erhalten Sie eine entsprechende Fehlermeldung beim Laden des Symbolfiles. .. _`Download`: http://www.mapmedia.de/fileadmin/user_upload/dokumente/umn_signaturen_howto/vortrag_demo.zip Ich hoffe das Ihnen dieses Dokument bei der Visualisierung Ihrer Daten mit dem UMN Mapserver weiterhilft und die Grundlagen und Möglichkeiten des im UMN Mapserver zum Einsatz kommenden kartographischen Konzepts, aber auch dessen Schwächen, verdeutlichen konnte. Es wäre schön wenn wir eine Art kartographische Signaturen-Bibliothek zusammentragen könnte, die dann allen Nutzern zur Verfügung steht. Dies betrifft insbesonder TrueType-Fonts die im Rahmen von Projekten entstanden sind und typische Signaturen für kartographische Zwecke enthalten. `Diskussionspaper für die Weiterentwicklung des MapServer Graphik-Kernels`_. .. _`Diskussionspaper für die Weiterentwicklung des MapServer Graphik-Kernels`: http://www.mapmedia.de/fileadmin/user_upload/dokumente/umn_signaturen_howto/DiskussionsPaper-UMNGraphikKernel.pdf