Konstruktion von Diagrammen mit dem UMN MapServer 5.0

Dieses Dokument erläutert die dynamische Konstruktion von Kreissektoren- und Balkendiagrammen im UMN MapServer 5.0.
Diese Anleitung setzt Grundkenntnisse in UMN MapServer-Anwendungen und dem Erstellen einer Map-Datei voraus.
==Einleitung==
Seit der Version 5.0 existiert mit dem neuen Layertyp CHART eine komfortable Möglichkeit automatisch Kreissektoren- oder Balkendiagramme auf der Basis von Sachdaten zu erzeugen. Dieser Layertyp ist auf punkt-, linien- und flächenhaften Daten anwendbar. I.d.R. werden Balken- und Kreissektorendiagramme in der thematischen Kartographie nur auf Punkt- und Flächenobjekten angewandt. Es lassen sich nun recht einfach thematische Karten vom Typ Standortdiagrammkarte und Flächendiagrammkarte erzeugen.
Bei linienhaften Objekten können quantitative Attributwerte über verschiedene Linienbreiten dargestellt werden. Dies ergibt eine Liniendiagrammkarte.
Zur Erstellung der Diagramme werden Vektordaten mit dazugehörigen Sachdaten in einer Attributtabelle verwendet.
==Unterstützte Bibliotheken==
Der Layertyp CHART wird im UMN MapServer von der GD- und der AGG-Bibliothek unterstützt. Die Ausgabe mittels AGG bietet jedoch eine qualitativ bessere Darstellung, besonders bei Kreisdiagrammen aufgrund des generellen Antialiasing. 
Eine Ausgabe der Diagramme in anderen Formaten, wie PDF, SWF oder SVG, die mit anderen Bibliotheken erstellt werden, ist nicht möglich.
 
Output mit GD und AGG
==Kreissektorendiagramme==
Diagramme werden in einem gesonderten LAYER vom Typ CHART erzeugt. Der Diagramtyp und die Diagrammgröße werden über PROCESSING-Parameter bestimmt. 
Für jeden Kreissektor im Diagramm wird ein CLASS-Block angelegt. Im dazugehörigen STYLE-Block wird dann mit SIZE [Attributname] auf den jeweiligen Wert in der Attributtabelle verwiesen. Mit diesem Wert wird dynamisch die Größe (der Winkel) des entsprechenden Kreissektors erzeugt.
Folgende Übersicht erläutert den Aufbau näher:
 LAYER
 TYPE CHART
 PROCESSING "CHART_TYPE=PIE" # Diagrammtyp, voreingestellt ist PIE für Kreissektorendiagramme
 PROCESSING "CHART_SIZE=30" # Größe (Durchmesser) der Diagramme in Pixel
 …
 CLASS
 NAME "Text" # Erläuterung bzw. Name des Kreissektors, der in der Legende erscheint
 STYLE
 	SIZE [Attributname] # gibt an, aus welcher Spalte der Attributtabelle die Sachdaten zur Erzeugung der Sektorengrößen 
 # benutzt werden sollen
 	COLOR r g b # Farbe, mit der der Kreissektor gefüllt wird
 OUTLINECOLOR r g b # wenn angegeben, wird eine Umrandungslinie um den Kreissektor gezeichnet
 WIDTH w # Breite der Umrandungslinie in Pixel, wenn OUTLINECOLOR spezifiziert wurde
 OFFSET a b # ’a’ gibt die Anzahl der Pixel an, um die der Kreissektor nach außen verschoben werden soll, bei ’b’ muss
 # auch ein Wert angegeben werden, der aber ignoriert wird
 END
 END
 CLASS
 …
 END
 …
 END
Im STYLE-Block kann bei SIZE auch ein fester Wert angegeben werden. Mindestens zwei CLASS-Blöcke sind erforderlich, um die Diagramme zu erzeugen.
===Beispiel eines LAYERs mit Kreissektorendiagrammen===
 LAYER
 NAME unternehmen
 TYPE CHART
 DATA pbezirke
 STATUS ON
 PROCESSING "CHART_TYPE=pie"
 PROCESSING "CHART_SIZE=39"
 CLASS
 NAME "übrige Dienstleistungen"
 STYLE
 SIZE [L_M_N]
 OUTLINECOLOR 0 0 0
 COLOR 56 168 0
 END 
 END
 CLASS
 NAME "Dienstleistungen für Unternehmen"
 STYLE
 SIZE [J_K_O]
 COLOR 230 230 0
 OUTLINECOLOR 0 0 0
 END
 END
 CLASS
 NAME "Handel, Gastgewerbe, Verkehr, ..." 
 STYLE
 SIZE [G_H_I]
 COLOR 0 112 255
 OUTLINECOLOR 0 0 0
 END
 END
 CLASS
 NAME "Produzierendes Gewerbe" 
 STYLE
 SIZE [D_E_F]
 COLOR 255 0 0
 OUTLINECOLOR 0 0 0
 END 
 END
 END
In diesem LAYER wird die Anzahl der Betriebe in den Stadtbezirken Berlins aufgeteilt auf die verschiedenen Wirtschaftsbereiche dargestellt. Die Angaben bei SIZE verweisen jeweils auf eine Spalte in der Attributtabelle, in der die Anzahl der Betriebe für einen bestimmten Wirtschaftsbereich vorliegen.
Die daraus resultierende und mit AGG erzeugte Karte sowie die Legende sehen folgendermaßen aus:
Datenquelle: Statistisches Landesamt Berlin 2005
Folgendes Beispiel zeigt das gleiche Thema, nur mit einem OFFSET 7 7 für den Kreissektor "Produzierendes Gewerbe". Dieser OFFSET wird leider auch in der Legende dargestellt.
Datenquelle: Statistisches Landesamt Berlin 2005
Ein Nachteil ist, dass in der Version 5.0 nur Kreissektorendiagramme mit einer festen Größe (Durchmesser) erzeugt werden. Man kann die Kreissektoren also nicht im Zusammenhang zu einem übergeordneten Attribut darstellen. Nur die Anteile der jeweiligen Werte können anhand der Kreissektoren abgelesen werden.
===Dynamische Kreisgrößen ab Version 5.2===
Ab der Version 5.2 wird es mit einem zusätzlichen PROCESSING-Parameter möglich sein, die Kreisgrößen abhängig von einem Attribut zu variieren:
 PROCESSING "CHART_SIZE_RANGE=itemname minsize maxsize minval maxval"
Dabei ist:
* itemname der Name des Attributs, welches die Kreisgröße bestimmt
* minsize und maxsize die minimale und maximale Größe der Kreisdiagramme in Pixel
* minval und maxval die minimalen und maximalen Werte des Attributs, welches die Kreisdiagrammgrößen bestimmt, diese korrespondieren dann mit den bei minsize, maxsize angegeben Größen
Sind die Attributwerte kleiner als minval wird die Kreisgröße mit der Angabe bei minsize gezeichnet und sind die Attributwerte größer als maxval werden die Kreisdiagramme mit der bei maxsize angegeben Größe erstellt.
==Balkendiagramme==
Balkendiagramme werden nach dem gleichen Prinzip wie die Kreissektorendiagramme erzeugt. Es gibt jedoch ein paar zu beachtende Besonderheiten.
Hier zunächst die Erläuterung der LAYER-Struktur:
 LAYER
 TYPE CHART
 PROCESSING "CHART_TYPE=BAR" # Diagrammtyp, hier BAR für Balkendiagramme
 PROCESSING "CHART_SIZE=30 40" # Breite und Höhe der Balkendiagramme in Pixel
 PROCESSING "CHART_BAR_MINVAL=val" # kleinster Attributwert
 PROCESSING "CHART_BAR_MAXVAL=val" # größter Attributwert
 …
 CLASS
 	NAME "Text" # Erläuterung bzw. Name des Balkens, der in der Legende erscheint
 	STYLE
 	 SIZE [Attributname] # gibt an, aus welcher Spalte der Attributtabelle die Sachdaten zur Erzeugung der Balkenhöhen 
 # benutzt werden sollen
 	 COLOR r g b # Farbe, mit der der Balken gefüllt wird
 OUTLINECOLOR r g b # wenn angegeben, wird eine Umrandungslinie um den Balken gezeichnet
 WIDTH w # Breite der Umrandungslinie in Pixel, wenn OUTLINECOLOR spezifiziert wurde
 END
 END
 CLASS
 …
 END
 …
 END
Auch hier gilt: Im STYLE-Block kann bei SIZE auch ein fester Wert angegeben werden. Mindestens zwei CLASS-Blöcke sind erforderlich, um die Diagramme zu erzeugen.
===PROCESSING-Parameter CHART_BAR_MINVAL und CHART_BAR_MAXVAL===
Die beiden optionalen Parameter PROCESSING "CHART_BAR_MINVAL=val" und PROCESSING "CHART_BAR_MAXVAL=val" erzeugen miteinander vergleichbare Balkendiagramme in einer Karte. Ohne diese Angabe werden die Diagrammhöhen nicht relativ zueinander gezeichnet und sie sind nicht miteinander vergleichbar. In diesem Fall wird der größte Balken in jedem Diagramm mit der bei PROCESSING "CHART_SIZE=Breite Höhe" angegeben Höhe gezeichnet, unabhängig von dem jeweiligen Attributwert. Alle anderen Balken in einem Diagramm werden anhand ihrer Sachdaten relativ zu dem größten Balken in diesem Diagramm erzeugt.
Um also miteinander vergleichbare Balkendiagramme zu erstellen, müssen die beiden zusätzlichen Parameter (oder auch nur einer davon) angegeben werden.
I.d.R. reicht die Angabe des größten darzustellenden Attributwertes aus. Die vertikale Achse (y-Achse) des Diagramms reicht dann von 0 bis zum größten Wert bei positiven Attributwerten. Es können aber auch negative Werte in den Diagrammen dargestellt werden.
Folgendes Beispiel soll den Unterschied der Nicht-Verwendung sowie der Benutzung von PROCESSING "CHART_BAR_MINVAL=val" und PROCESSING "CHART_BAR_MAXVAL=val" verdeutlichen:
Vorgegeben sind 2 Objekte A und B mit folgenden Attributwerten:
* A mit 1000, 500, 200
* B mit 2000, 500, 200
Als Ergebnis ohne eine minval- und maxval-Angabe erhält man:
Die roten Balken haben bei beiden Diagrammen dieselben Größen während sich die anderen Balken unterscheiden. Diese Darstellung entspricht nicht den Attributwerten und vermittelt falsche Informationen.
Bei der Verwendung der minval- und maxval-Angabe werden die Diagramme in einem richtigen Verhältnis zueinander erzeugt. Der rote Balken bei A ist halb so groß 
wie bei B und die blauen und gelben Balken haben jeweils dieselbe Größe. Diese Darstellung entspricht somit den Daten. 
Wenn nur ein Wert für maxval angegeben wird, wird der Balken immer vom Wert 0 aus gezeichnet. Eine Angabe bei minval verlagert die horizontale Achse von der aus der Balken erzeugt wird. 
Bei Attributwerten die größer als der maxval-Wert sind, werden die Balken auch so hoch wie bei dem dort angegebenen Wert gezeichnet. Bei Werten die kleiner als der minval-Wert sind, wird kein Balken erstellt.
===Beispiel eines LAYERs mit Balkendiagrammen===
 LAYER
 NAME wahlen
 TYPE CHART
 DATA pbezirke
 STATUS ON
 PROCESSING "CHART_TYPE=bar"
 PROCESSING "CHART_SIZE=50 55"
 PROCESSING "CHART_BAR_MAXVAL=43"
 CLASS
 NAME "CDU"
 STYLE
 SIZE [CDU]
 OUTLINECOLOR 0 0 0
 COLOR 0 77 168
 END 
 END
 CLASS
 NAME "SPD"
 STYLE
 SIZE [SPD]
 COLOR 230 0 0
 OUTLINECOLOR 0 0 0
 END
 END
 CLASS
 NAME "PDS" 
 STYLE
 SIZE [PDS]
 COLOR 169 0 230
 OUTLINECOLOR 0 0 0
 END
 END
 CLASS
 NAME "Grüne" 
 STYLE
 SIZE [GRUENE]
 COLOR 56 168 0
 OUTLINECOLOR 0 0 0
 END 
 END
 CLASS
 NAME "FDP" 
 STYLE
 SIZE [FDP]
 COLOR 255 255 0
 OUTLINECOLOR 0 0 0
 END 
 END
 CLASS
 NAME "Sonstige" 
 STYLE
 SIZE [SONSTIGE]
 COLOR 130 130 130
 OUTLINECOLOR 0 0 0
 END 
 END
 END
In diesem LAYER wird das Ergebnis der Europawahl 2004 in Berlin auf Ebene der Stadtbezirke dargestellt. Der bei PROCESSING "CHART_BAR_MAXVAL=43" angegebene Wert 43 ist die bei dieser Wahl höchste erreichte Prozentzahl von einer Partei in einem Bezirk.
Die daraus resultierende Karte sowie die Legende sehen folgendermaßen aus:
Datenquelle: Statistisches Landesamt Berlin 2005
Ein Nachteil ist hierbei, dass in der automatisch erstellten Legende nur die Farben der Balken erläutert werden aber nicht die Balkenhöhen. Der Kartenleser kann also nicht einschätzen welche Balkenhöhe wie viel Prozent entspricht.
==Links==
http://mapserver.org/output/dynamic_charting.html
https://trac.osgeo.org/mapserver/ticket/2136
----
Dieses Dokument wurde erarbeitet von Karsten Hoffmann.
Category:MapServer