Abfragen¶
Bemerkung
Dieser Abschnitt kann nicht für dynamische Dienste (siehe vorheriges Kapitel) angewendet werden. Ist bei den Eigenschaften des Dienstes im CMS unter Dynamische Abfragen
ein Wert ungleich None
eingestellt, steht dieser Abschnitt im CMS nicht zur Verfügung.
Neben der kartographischen Darstellung von Geo-Objekten in einer Karte bieten manche Kartendienste die Möglichkeit, Geo-Objekte zu suchen oder abzufragen. Dazu muss im CMS beim jeweiligen Dienst in den Abschnitt Abfragen
gewechselt werden:

Dort kann über den Button Neue Abfrage
eine neue Abfrage für diesen Dienst erstellt werden. In folgendem Dialog muss zuerst das Thema aus dem Dienst ausgewählt werden, das abgefragt werden soll:

Unter Tabelle
kann ausgewählt werden, welche Felder für dieses Thema in der Ergebnistabelle beim Erstellen importiert werden sollen:
Nichts importieren: Bei der Erstellung der Abfrage wird nichts importiert. Die gewünschten Felder werden zu einem späteren Zeitpunkt festgelegt.
Felder dynamisch - (*) importieren: Es wird für die Tabelle ein Feld mit dem „Feldnamen“
*
angelegt. Das bedeutet, dass alle Felder in der Tabelle angezeigt werden. Das Auslesen der vorhandenen Felder erfolgt hier immer zur Laufzeit im Kartenviewer. Ändert sich das Datenmodell hinter dem Layer, werden die Änderungen automatisch im Kartenviewer angepasst.Einzelne Felder importieren: Alle Felder, die zum Zeitpunkt der Erstellung der Abfrage vorhanden sind, werden für die Tabelle übernommen. Spätere Änderungen im Datenmodell müssen nachträglich manuell nachgezogen werden. Diese Option kann für ein schnelles Erstellen von Abfragen hilfreich sein. Die importierten Felder können nach Wunsch im nächsten Schritt im CMS bearbeitet (Feldtyp, Reihenfolge, Bezeichnung) und ergänzt werden.
Bemerkung
Nicht alle Diensttypen liefern über die Capabilities Auskunft über die Feldnamen der Themen. Für diese Diensttypen (z.B. WMS) kann die letzte Option auch entfallen.
Unter Allgemeine Eigenschaften
müssen noch ein Name und ein eindeutiger URL (Name)
für den Dienst vergeben werden.
Der URL (Name)
kann verwendet werden, um über einen parametrierten Aufruf der Karte eine Suche zu übergeben (...&query=adressen&...
).
Danach kann die Abfrage mit Übernehmen
erstellt werden. Die Abfrage sollte jetzt in der Liste erscheinen.
Unter der Abfrage findet man folgende Punkte:

[Abfragethema] (Eigenschaften): Eigenschaften der Abfrage.
Abfragethema: Das Thema des Dienstes, der abgefragt wird.
Exportierbare/Benutzerdefinierte Formate: Hier können spezielle Regeln definiert werden, aus denen Textdateien auf Basis der Abfrageergebnisse erstellt werden. Diese können dann vom Anwender über den Kartenviewer heruntergeladen werden. Wird hier nichts definiert, steht trotzdem ein Export der Daten als CSV zur Verfügung.
Suchfelder: Sollten Daten nicht nur abgefragt werden, sondern sollte der Anwender auch die Möglichkeit haben, innerhalb bestimmter Felder zu suchen, können diese Felder hier definiert werden.
Tabelle: Hier werden die einzelnen Spalten angeführt, die in der Ergebnistabelle angezeigt werden. Neben einfachen Werte-Spalten können auch Spalten mit Expressions und Hotlinks (setzen sich aus den Werten einer oder mehrerer Spalten zusammen) angelegt werden.
TOC-Thema für diese Abfrage: Hier können optional Themen aus diesem oder einem anderen Dienst abgegeben werden, auf die sich die Abfrage bezieht. Stellt der Anwender beim Abfragen
sichtbare Themen
ein, wird diese Abfrage mit in den Abfrageprozess einbezogen, wenn sich das Abfragethema oder eines der hier angeführten Themen im sichtbaren Kartenbereich befindet.
Allgemeine Abfrage Eigenschaften¶
Unter den allgemeinen Eigenschaften einer Abfrage lassen sich folgende Optionen einstellen:

Da eine Beschreibung der einzelnen Eigenschaften über das ?
im Dialog abrufbar ist, wird hier nicht auf alle Details eingegangen.
Allgemein
Minimaler Maßstab: Nach einer Suche wechselt der Kartenviewer-Ausschnitt zum Suchergebnis. Handelt es sich hier nur um einen einzelnen Punkt, kann hier ein Maßstab angegeben werden, auf den gezoomt werden sollte.
Erweiterte Eigenschaften
Distinct: Gibt es Objekte mit identischer Geometrie (z.B. gleicher Punkt) und sind ebenso die in der Abfrage abgeholten Attributwerte identisch, wird ein Objekt in der Ergebnisliste nur einmal angezeigt. Die Daten werden zuerst von der WebGIS-Applikation vom Karten/Feature-Dienst abgeholt und daraus das Distinct berechnet (serverseitig). Ein Anwendungsbeispiel könnten Kundenbestellungen sein, die alle an die gleiche Adresse geliefert werden. Sollte in der Ergebnistabelle beispielsweise nur der Kundenname und die Adresse angezeigt werden, würden hier für jede Bestellung identische Punkte übereinander als Marker dargestellt werden. Mit
Distinct
würden diese identischen Punkte nur noch als einfacher Marker erscheinen.Union: Ergebnismarker, die in der Karte am gleichen Ort liegen (identischer Punkt), werden zu einem Objekt zusammengefasst. Der Marker enthält in der Tabellenansicht alle betroffenen ‚Records‘. Hier kann das gleiche Anwendungsbeispiel wie bei
Distinct
herangezogen werden. Nimmt man in der Tabelle auch die Bestellnummer mit, können die einzelnen Punkte nicht mehr überDistinct
zusammengefasst werden, weil sich die Bestellnummer bei den einzelnen Punkten unterscheiden wird (Kunde:Bestellungen = 1:n). Damit nicht am selben Ort mehrere Marker in der Karte dargestellt werden müssen, können Marker mit dem gleichen Einfügepunkt zusammengefasst werden. Klickt der Anwender auf einen dieser Marker, werden als Ergebnis alle betroffenen Bestellungen angezeigt. Für jeden Record (Bestellung) wird nur die erste Spalte angezeigt. Der Anwender kann durch Klick auf das erste Attribut den Record aufklappen und sieht dadurch alle Werte.
Bemerkung
Kartendienste geben während einer Abfrage immer nur eine maximale Anzahl von Geo-Objekten zurück (z.B. ArcGIS Server Dienste liefern standardmäßig maximal 1000 Ergebnisse zurück). Wird die Option Union
für eine Abfrage gewählt und die maximale Anzahl von abfragbaren Geo-Objekten überschritten, liefert WebGIS eine Meldung zurück, dass die Abfrage nicht möglich ist. Der Grund ist, dass ansonsten eine nicht vorhandene Vollständigkeit der Daten verschleiert werden würde.
Können nicht alle Geo-Objekte abgefragt werden, würde ein Punkt zwar angezeigt werden, es wäre jedoch nicht gewährleistet, dass die angezeigten Records unter diesem Marker vollständig sind. Daher wird in diesem Fall gar kein Ergebnis mit einem Hinweis angezeigt, damit unvollständige Daten nicht fälschlicherweise als vollständig interpretiert werden.
Bemerkung
Um den oben beschriebenen Effekt abzumildern, kann unter „Maximale Anzahl“ ein größerer Wert angegeben werden. Auch wenn der zugrundeliegende Dienst nur maximal 1000 Objekte zurückliefert, kann durch Mehrfachabfragen im Hintergrund versucht werden, alle Geo-Objekte abzuholen. Der Wert sollte allerdings auch nicht zu groß sein, da es sonst zu einer höheren Serverlast kommen kann.
Bemerkung
Eine weitere Möglichkeit, den Effekt abzufangen, ist das Einstellen der Option Layer Zoomgrenzen anwenden
. Die Abfrage kann dann nur mehr durchgeführt werden, wenn der Anwender in der Karte innerhalb der Maßstabsgrenzen des Abfragethemas ist. Die Zoomgrenzen werden dabei im Kartendienst definiert. Dieser Wert ist auch sinnvoll, wenn diese Abfrage als dynamischer Inhalt über den MapBuilder oder über eine Dynamische Content Marker-Darstellungsvariante eingebunden wird.
Suchfelder¶
Suchfelder können für eine Abfrage optional parametriert werden. Enthält eine Abfrage keine Suchfelder, kann das Thema nur abgefragt werden (z.B. mit dem Identify-Werkzeug). Werden Suchfelder definiert, erscheint die Abfrage im Karten Viewer zusätzlich unter „Detailsuche“.
Bemerkung
Nicht alle Dienst-Typen unterstützen das Suchen innerhalb eines Themas, z.B. WMS.
Zum Anlegen eines Suchfeldes muss in den Bereich Suchfelder
gewechselt und auf Suchbegriff hinzufügen
geklickt werden.
Im Dialog muss zuerst das Feld ausgewählt werden, in dem gesucht werden soll.
Unter Abfragemethode
kann eingestellt werden, wie im entsprechenden Feld gesucht werden soll.
Mit Exact
muss der Anwender beispielsweise den Suchbegriff exakt so eingeben, wie er in der
Datenbank angeführt wird (sinnvoll bei IDs, Zahlen). Meistens ist es anwenderfreundlicher,
wenn automatisch mit Wildcards gesucht wird. Mit EndingWildcard
wird automatisch nach dem
eingegebenen Suchbegriff ein Wildcard (* oder %) angehängt. So werden alle Geo-Objekte gefunden,
bei denen das entsprechende Attribut mit dem eingegebenen Suchbegriff beginnt. In der Auswahlliste
werden noch weitere Optionen angezeigt, die beispielsweise alle Leerzeichen durch Wildcards
ersetzen (SpacesToWildcard
, SpacesToWildcardWithEndingWildcard
, …).
Bemerkung
Damit die Suche performant ausgeführt wird, sollte darauf geachtet werden, dass die Suchfelder in der Datenbank entsprechend indiziert sind.
Abschließend muss noch ein Name angegeben werden, der in der Suchmaske für dieses Feld angezeigt
wird. Unter Url
sollte eine für diese Abfrage eindeutige ID für das Feld eingetragen werden.
Ruft man den Karten Viewer auf, können so Parameter in der URL mitgegeben werden, die schon
beim Start eine Abfrage ausführen. Die entsprechenden Parameter für die Suchfelder entsprechen
dem hier eingetragenen (...&query=adressen&adresse=hauptplatz...
).
Schließt man den Dialog mit Übernehmen
, sollte der Suchbegriff in der Liste erscheinen.
Dort können die Eigenschaften auch noch nachträglich bearbeitet und die Reihenfolge der
Suchbegriffe geändert werden. Über die Eigenschaften können auch noch weitere Optionen wie
Auswahllisten, Whitelists, usw. parametriert werden.
Auswahllisten¶
Um die Eingabe von Suchbegriffen für den Anwender zu erleichtern, können Auswahllisten angeboten werden. Wenn der Anwender ein Zeichen in einem Suchfeld eingibt, wird im Hintergrund die Datenbank abgefragt und dem Anwender daraus Vorschläge angeboten.
Auswahllisten funktionieren auch kaskadierend: Bereits eingegebene Suchbegriffe können berücksichtigt werden. (Beispiel: Es werden nur Grundstücke einer KG angeboten, wenn bereits die KG-Nummer eingegeben wurde).
Gehen wir von einer Grundstückssuche aus, in der der Anwender eine KG-Nummer oder einen KG-Namen und eine Grundstücksnummer eingeben kann:

Die Datenbank-Felder zum Abfragen heißen im Beispiel:
KG
: Eingabefeld ID -kg
KG_NAME
: Eingabefeld ID -kgname
GNR
: Eingabefeld ID -gnr
Damit Auswahllisten funktionieren, muss das beim entsprechenden Suchfeld bei den Eigenschaften angegeben werden:

Über den Auswahllisten-Editor kann das entsprechende SQL-Statement definiert werden:

Unter ConnectionString kann die Verbindung zur Datenbank angegeben werden, die abgefragt werden soll.
Bemerkung
Verwendet man als Server ArcGIS Server oder gView (über die GeoServices REST-Schnittstelle), muss
keine direkte Verbindung zur Datenbank angegeben werden. Hier kann die Abfrage der Auswahllisten-Werte
direkt über den MapServer erfolgen (empfohlen).
In diesem Fall gibt man als ConnectionString einfach das Kürzel #
an.
Unter SqlStatement wird jetzt der Ausdruck angegeben, der für die Suche verwendet wird. Bei einer Datenbank-
Abfrage mit ConnectionString ist das in der Regel ein komplettes SELECT FROM WHERE
-Statement.
Verwendet man den MapServer zur Abfrage (ConnectionString = #
), gibt man hier nur die WHERE
-Klausel an (ohne WHERE).
Als Platzhalter können die Namen der Suchbegriffe eingegeben werden (z.B. {{kg}}
, Wildcards nicht vergessen).
Für unser Beispiel könnten die SqlStatements wie folgt aussehen:
KG
KG like '{{kg}}%'
KG Name
KG_NAME like '{{kgname}}%'
Grundstücksnummer
GNR like '{{gnr}}%'
#if kg
AND KG='{{kg}}'
#endif
#if kgname
AND KG='{{kgname}}'
#endif
Hier wird die Abfrage noch weiter eingeschränkt, wenn bereits eine KG-Nummer oder ein KG-Name eingegeben wurde.
Über die #if
-Direktiven kann hier erzwungen werden, dass der entsprechende Code-Teil nur ins Statement aufgenommen
wird, wenn der Anwender für dieses Feld einen Wert eingegeben hat.
Bemerkung
Hier im Beispiel wurden für alle drei Eingabefelder Auswahllisten definiert. Das ist nicht zwingend erforderlich. Wenn es für die Aufgabe sinnvoll ist, kann auch nur ein Eingabefeld Auswahllisten anbieten.
Tabelle¶
Hier wird angeführt, welche Felder in der Ergebnisliste angezeigt werden. Damit die Abfrage funktioniert, müssen hier Werte eingetragen werden. Eine Ausnahme stellen hier WMS-Dienste dar, wo das Schema der Daten nicht über die Capabilities bekannt ist. Hier kann in der Regel keine Tabelle definiert werden.
Hat man beim Erstellen der Abfrage (siehe oben) unter Tabelle Felder dynamisch importieren
ausgewählt, befindet sich unter Tabelle
bereits eine Spalte:

Hierbei handelt es sich um einen Sonderfall: Als Feld wird hier *
angeführt, was
bedeutet, dass die Felder automatisch zur Laufzeit bestimmt werden. Alle Attribute, die von
einer Abfrage vom Kartendienst zurückgeliefert werden können, werden angezeigt.
Bemerkung
Diese Option kann auch verwendet werden, wenn bei einem WMS-Dienst als GetFeatures Type
beispielsweise application/geojson
oder txt/xml
eingestellt wird. Dann werden auch
hier alle Felder in die Tabelle übernommen. Alternativ könnten hier auch die einzelnen
Felder manuell angelegt werden.
Möchte man mehr Kontrolle über die Tabelle haben, können hier Felder auch einzeln angegeben werden.
Dazu kann der Button Mehrere Spalten hinzufügen
und Spalte hinzufügen
verwendet werden.
Der erste Punkt funktioniert allerdings nur, wenn der zugrunde liegende Dienst auch Auskunft
über das Datenschema der einzelnen Themen liefert (AGS, IMS, …).
Wurden Spalten hinzugefügt, kann die Eigenschaften weiter bearbeitet werden:

Der Spalten-Typ
gibt an, was in der Tabellenspalte angezeigt wird. Der Standardwert ist
hier Field
, was bedeutet, dass in der Spalte der Wert eines Attributs des Geo-Objektes angezeigt
wird. Unter Definition / Quelle
muss für diesen Typ ein Feld aus dem Abfragethema angeführt
werden:

Wählt man als Spalten-Typ
beispielsweise Hotlink
, erscheint in der Tabelle ein Hotlink, über
den der Anwender auf eine neue Seite weitergeleitet werden kann. Unter Definition / Quelle
kann hier eine Hotlink-URL
angegeben werden. In dieser URL können Felder aus dem
entsprechenden Geo-Objekt als Platzhalter (in eckigen Klammern) angeführt werden:

Unter Name / Bezeichnung des Hotlinks
kann eingetragen werden, mit welchem Text der Hotlink in der
Tabelle angezeigt wird.
1:n
gibt an, ob der Link für alle Zeilen einer Tabelle aufgerufen werden kann. Dabei kann auch ein
Trennzeichen angegeben werden, mit dem die einzelnen Werte in der URL getrennt werden.
Weitere Spalten-Typen sind beispielsweise:
Expression: Hier kann ein Ausdruck bestehend aus (mehreren) Feldern und freiem Text angegeben werden. Die Platzhalter für die Felder werden wieder in eckigen Klammern angegeben, z.B.:
Fläche: [THE_AREA_FIELD]m²
. Zusätzlich können bei Expression auch Funktionen zum Berechnen und Formatieren verwendet werden (siehe unten).ImageExpression: Wie Hotlink, nur muss die Ziel-URL eine Bilddatei sein. Das Bild wird in der Ergebnistabelle angezeigt. Die Größe kann eingestellt werden.
EmailAddress, PhoneNumber: Das Ergebnis wird als anklickbare E-Mail-Adresse oder Telefonnummer in der Tabelle dargestellt.
DateTime: Das Ergebnis wird als Datum dargestellt. Unter Definition kann dabei eingestellt werden, wie das Datum formatiert werden soll.
Funktionen innerhalb von Expressions¶
Bei Tabellenspalten vom Typ Expression können innerhalb des Ausdrucks neben den oben angeführten Platzhaltern für Felder in eckigen Klammern auch Funktionen eingefügt werden. Diese dienen für spezielle Berechnungen und Formatierungen des Feldes.
Funktionen beginnen immer mit $
gefolgt vom Funktionsnamen. Das Argument wird der Funktion in Klammern übergeben, z.B. $eval(42*42)
,
Attribute aus dem aktuellen Objekt werden der Funktion wieder als Platzhalter in eckigen Klammern übergeben, z.B. $eval([THE_AREA_FIELD]*42)
.
Folgende Funktionen stehen zur Verfügung:
$eval()
: Berechnet einen mathematischen Ausdruck (Addition, Subtraktion, Multiplikation, Division), z.B.$eval(11+1)
,$eval([AREA]*[COST])
$sin()
,$cos()
,$tan()
,$asin()
,$acos()
,$atan()
: Winkelfunktionen. Die Berechnung und das Ergebnis beziehen sich immer auf das Bogenmaß. Für Umrechnungen kann die Funktion$pi()
verwendet werden, z.B.$sin(45.0*$pi()/180.0)
$round0()
…$round5()
: Rundet den übergebenen Wert. Die Zahl gibt die Nummer der Nachkommastellen an, z.B.$round0(100.123)
,$round2([AREA])
$n0()
…$n5()
: Wandelt eine Zahl ins Standard Numeric Format um. Dieses Format fügt beispielsweise Tausender-Punkte in eine Zahl ein (1000 => 1.000). Die Zahl gibt die Nummer der Nachkommastellen an. Diese Funktion kann also auch als Alternative zu$round
verwendet werden.$n0_de()
…$n5_de()
: Mit der Funktion$n()
erfolgt die Darstellung in der aktuellenCulture
des Servers. Ist die Sprache am Server Englisch, werden die Ergebnisse eventuell nicht richtig formatiert (1000,123 => 1,000.123). Um das zu vermeiden, kann mit der$n0_de()
die deutsche Darstellung erzwungen werden.
Bemerkung
Die einzelnen Funktionen können auch verschachtelt werden:
$round2($eval([AREA]*[COST])) €
$n2_de($eval([AREA]*[COST])) €
Bemerkung
$n0()
bzw. $n0_de()
sollte immer die äußerste Funktion sein. Verwendet man das Ergebnis zur Berechnung von weiteren Ergebnissen,
kann es zu Fehlern kommen, weil Berechnungsfunktionen mit Tausender-Punkten nicht umgehen können:
$eval($n0([AREA])*$n2([COST])) €
=> FALSCH$eval($round0([AREA])*$round2([COST])) €
=> RICHTIG$n2_de($eval($round0([AREA])*$round2([COST]))) €
=> RICHTIG
Bemerkung
Macht man im Ausdruck einen syntaktischen Fehler (Parametrierfehler), wird das als Exception in der Ergebnisliste angezeigt (betrifft alle Zeilen in der Tabelle).
Bemerkung
Entsteht ein Fehler bei der Rechnung des Wertes, weil in einem Feld COST
beispielsweise kein gültiger Zahlenwert steht, ist das Ergebnis in der
Tabelle NaN
(Not a Number). Das betrifft dann nur die entsprechenden Zeilen in der Tabelle.