Community • 11. Januar 2024

Wenn-Dann-Logik in MapServer-Templates für Sachdaten-Abfragen (FeatureInfo)

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.

Ein paar Grundlagen

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:

Erweiterte Möglichkeiten der Attribut-Ausgabe

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:

  • Hier ist zusätzlich der Parameter „escape=none“ notwendig, damit die HTML-Tags nicht escaped werden.
  • Für eine bessere Lesbarkeit wurden die Beispiele mit Zeilenumbrüchen versehen, im MapServer-Template müssen sie in einer Zeile stehen und dürfen keine Umbrüche enthalten.

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>

Wenn... dann via [item]

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."
]

Grenzen

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

Jörg Thomsen

Jörg Thomsen ist Diplom-Geograph und seit vielen Jahren im Bereich Open-Source-GIS engagiert. Seit 2016 ist er Teil des WhereGroup-Teams in Berlin. Außerdem ist er langjähriger Dozent der FOSS Academy, dem Schulungsinstitut der WhereGroup und Lehrbeauftragter im Bereich Geoinformatik an der Beuth-Hochschule.

 

Artikel teilen: