Auch für mich als langjährigen MapServer-Fan tauchen immer einmal wieder neue Möglichkeiten bei der Konfiguration von OGC-Diensten auf. Die technische Funktion, um die es hier gehen soll, ist alt und bekannt. Im Rahmen eines Consulting-Projektes hat sich mir jedoch eine neue Anwendungsmöglichkeit erschlossen.
Die Aufgabe lautete, Sachdaten nur dann anzuzeigen, wenn andere Werte belegt sind. Stellen wir uns eine Weltkarte vor, deren Grundlage die NaturalEarth-Daten sind. Wenn Sachdaten für ein Land in Europa angefragt werden (also, wenn Nutzende mit einem Abfragewerkzeug in ein europäisches Land klicken), sollen Ländername, Kontinent und weitere Daten angezeigt werden. Bei anderen Ländern soll im Ergebnis nur der Name des Landes ausgegeben werden, sowie die Information, dass es sich nicht um ein europäisches Land handelt.
Den meisten dürfte bekannt sein, dass in Map-Dateien und auch FeatureInfo Template-Dateien mit eckigen Klammern auf Attribute der Geodaten zugegriffen werden kann. Bei der Informationsabfrage wird dies genutzt, um die Attribut-Werte der betroffenen Objekte anzuzeigen.
Für diese Anzeige im Browser sieht der zugehörige Template-Schnipsel so aus:
<!-- Mapserver Templates -->
<h2>standard templating</h2>
<p style="font-family:arial;font-size:10pt">
<ul>
<li>Land: [admin]</li>
<li>Kontinent: [continent]</li>
<li>Bevölkerung: [pop_est]</li>
</ul>
</p>
MapServer zeigt uns an, welche Werte die Spalten admin, continent und pop_est für die angeklickte Fläche haben. Wenn einer der Werte nicht gesetzt ist, gibt es einen leeren Eintrag.
Nicht so schön:
An dieser Stelle kommen wir zu einer erweiterten Möglichkeit, die über das reine [spaltenname] hinaus geht. Dieses Beispiel führt zum selben Ergebnis wie oben.
[item name="pop_est" format="$value"]
item ist ein fest stehender Begriff, mit name wird auf die Attribut-Spalte verwiesen und mit format="$value" wird angegeben, dass der Wert des items aus den Geodaten ausgegeben werden soll. Über den zusätzlichen Parameter nullformat kann definiert werden, was ausgegeben werden soll, wenn das entsprechnde Attribut leer ist:
[item name="pop_est" format="$value" nullformat="unbekannt"]
Bei beiden Vorgaben für die Ausgabe der Information format und nullformat können wir beliebigen weiteren Text mitgeben, auch die HTML-Listen-Elemente und HTML-Formatierungsoptionen:
[item
name="pop_est"
escape=none
format="<b>$value</b>"
nullformat="<i>unbekannt</i>"
]
Hinweise:
Nach diesem Prinzip kann man nun auch den gesamten Listeneintrag weglassen, wenn der Wert nicht gesetzt ist:
<ul>
<li>Land: [admin]</li>
<li>Kontinent: [continent]</li>
[item
name="pop_est"
escape=none
format="<li>Bevölkerung: $value"</li>
]
</ul>
Was aber, wenn ich Ländername, Kontinent und Bevölkerung nur anzeigen möchte, wenn ein Land in Europa abgefragt wird? Ich war sehr erfreut festzustellen, dass wir in der Konstruktion mit item. $value und $nullformat auch auf andere Attribute zugreifen können. Darüber hinaus kann der Wert $value mit einem regulären Ausdruck abgeglichen werden und dadurch Attributwerte nur ausgeben, wenn auf sie eine bestimmte Bedingung zutrifft. In meinem etwas fantasielosen und eurozentrischen Beispiel nur dann, wenn ein europäisches Land angeklickt wird:
[item
name="continent"
pattern="Europe"
escape=none
format="<ul>
<li>Land: [admin]</li>
<li>Kontinent: [continent]</li>
<li>Bevölkerung: [pop_est]</li>
</ul>"
nullformat="[admin] liegt nicht in Europa."
]
1) Das hier Geschriebene gilt nur für FeatureInfo Template-Dateien, nicht für Map-Dateien.
2) Man könnte auf die Idee kommen, die Konstruktion im FeatureInfo-Template noch weiter zu verschachteln:
[item
name="continent"
escape=none
pattern="Europe"
format=
"<ul>
<li>Land:
[item
name="admin"
format="$value"
]</li>
<li>Kontinent: [continent]</li>
<li>Bevölkerung: [pop_est]</li>
</ul>"
nullformat="Bitte ein Land in Europa wählen"
]
Leider funktioniert das nicht, das innere $value greift den ersten item-name wieder auf:
Aber es gibt durchaus noch weitere Möglichkeiten und Optionen für die Gestaltung der FeatureInfo-Templates, ein Blick in die Dokumentation lohnt sich. Zur MapServer Templating Dokumentation