Datenzugriff

Die Steuerung von IWAN war ursprünglich durch einfache Befehle geplant. Die Syntax sah keine Möglichkteiten der Steuerung des Pogrammfluss vor. Ebenso gab es keine Funktionen oder ähnliche Sprachkonstrukte. Erst mit der Einführung des IWS Parsers stehen sinnvolle Möglichkeiten zur Verfügung. Die Projektdefinition und weitere GIS-Funktionen sind und bleiben aber nach wie vor ausschließlich durch die "alten" Sprachfunktionen verfügbar. Durch die Möglichkeiten der IWS Funktion ExecOld ist eine komfortable Nutzung beider Ansätze erreicht.

Einsatz

Alle folgenden Befehle können ausgeführt werden durch:

  • angeben innerhalb eines Go;End; Block in einer .httpmap Datei
  • innerhalb eines Aufruf der Pseudodatei ___MAP.__SYS__
  • durch ausführen der IWS Funktion ExecOld
Möglichkeiten

Mittels der angegebenen Funktionen können:

  • Projekte und Ebenen erstellt und definiert,
  • Selektionen auf Sachdaten oder Geometrien durchgeführt,
  • Kartenbilder erstellt,
  • Ausgabe und Darstellungsparameter definiert,
  • und Kartenbilder als EMail versendet werden.
Ebenenerstellung

IWAN organisiert die Daten in einer Projekt-Ebenen Hierarchie. Ein Projekt stellt dabei einen Kontainer für Ebenen dar. Jede Sitzung kann immer nur auf die Ebenen eines Projektes zugreifen. Die Projekt und Ebenendefinition erfolgt temporär durch Skriptanweisungen. Die dafür notwendinge Befehle sind in den folgenden Unterpunkten definiert. Hinweise zu Erstellung eines Projektes finden Sie [hier].

Das Laden einer Ebene zieht i.d.R. (Zeit) Kostenintensive Schritte nach sich. Aus diesem Grunde werden die Ebenen in einem Projekt nicht durch den Mapserver selber aktualisiert. Änderungen an der Definition einer bereits geladenen Ebenen setzten einen "UNLOAD" Befehl vorraus.

Die Definition einer Ebene kann grob durch die Angaben:

  • Quellbeschreibung (Datei, Datenbankverbindung und Tabellennamen, etc.),
  • Darstellungsregeln (Symbolnummern, Symbolsets, Klassifikationen, etc.),
  • Sichtbarkeitsregeln (Min und Max-Maßstab für die Darstellung)
  • Filterdefinitionen,
  • Performance-Hinweise (Anzahl der gleichzeitigen Zugriffe etc.),
  • Projektion (immer als EPSG - Nummer)

beschrieben werden. Die meisten der Parameter sind dabei optional und mit sinnvollen Standardwerten belegt.

Je nach Typ oder Quelle der Ebene sind bestimmte Parameter für den Vorgang des Ladens notwendig. Fast alle (neueren Ebenentypen) sind im Zugriff, wie z.B. Selektionen, Darstellung, Filter usw. für den Programmierer und Anwender transparent. Bei der Entwicklung von Iwan wurde der Schwerpunkt auf eine gleichartige Repräsentation aller Datenquellen Wert gelegt.

Festlegen von Parametern

Alle Aktionen wie Selektionen, Kartendarstellungen usw. setzten bestimmte Parameter vorraus. Die Befehle zur Erstellung dieser Sitzungsparameter werden in den folgenden Unterpunkten beschrieben.

Die gesetzten Parameter werden in der Sitzung, welche jedem Klienten zugeordnet wird, gespeichert. Damit ist es mögich für alle folgenden Anforderungen nur die jeweils anderen Parameter erneut zu definieren. Beispielhaft genannt sei die Liste der Namen der auf der Karte darzustellenden Ebene, die Ausgabebildgröße usw.

Bei einigen Parametern werden globale Einstellungen geändert. Diese werden erst nach dem Neuladen des Projektes wirksam. In diesem Fall finden Sie einen entsprechenden Hinweis.

Kartenerstellung/Navigation

Nachdem eine Sitzung Zugriff auf die Ebenen eines Projektes hat, können die Daten als Kartenbild generiert werden. Dabei wird typischerweise, mittels Angabe von Koordinaten oder allgemeine Aussagen wie:"Ändere den Kartenausschnitt entsprechnd der Geometrien aller Elemente der Ebene XY", eine räumliche Navigation durch den Datenbestand vorgenommen.

Ein weiteres Ziel bei der Implementierung von IWAN stellt der einfachen Zugriff auf Aktionen dieser Art dar. Die Informationen zum aktuellen Kontext der Sitzung sind immer vorhanden. Dadurch können Befehle wie Pan, ZoomIn usw. direkt abgesetzt werden.

Je nach Aktion wird das Kartenbild unmittelbar erzeugt. Entgegen vieler anderer Mapserversystem wird das Kartenbild dabei im Speicher der Sitzung gehalten. Ein umständlicher Zugrifff via "Redirect" u.Ä. ist dabei nicht notwendig. Iwan ist jederzeit in der Lage die Bilddaten direkt in den Ausgabestrom der anfordernden Anwendung zu übertragen.

Selektion/Filter

Eine weitere wichtige Aufgabe für einen Mapserver besteht im dem Zugriff auf die Sachdaten der einzelnen Ebenen nach bestimmten Kriterien. Diese umfassen dabei die Selektion nach Sachattributen "ObjektArt=2004" und vor allem die Selektion nach räumlichen Kriterien ("Liegt im Gebiet des Polygons x1,y1,xn,yn).

Iwan stellt für diesen Zweck z.Z. drei Befehle zur Verfügung. Diese können unabhängig von der Art der Ebene verwendet werden. Damit ist auch nach einer Migration, z.B. von Shapedateien zu PostgreSQL, keine Änderung an der durch Sie erstellten Anwendung notwendig.

Auf die Sach- und Geodaten selektierten Elemente wird durch eine Art Recordset zugegriffen. Auch dieses ist von der zugrundeliegenden Datenquelle unabhängig.

Abfragesprache ISQL

IWAN ist ab Version 3.1.0 in der Lage Filter auf Layer zu setzen. Zusammen mit LinkLayern ist somit einfach eine "Sicht" auf bestehende Daten möglich.
Die Abfragesprache dazu ist ein SQL ähnlicher Dialekt, genannt ISQL (Iwan-SQL). Die Möglichkeiten sind dabei natürlich nicht so umfangreich wie bei "richtigen" Datenbanken. Das ISQL Statement wird je nach tatsächlicher Datenquelle umgesetzt und bietet somit einen von der Datenquelle weitgehend unabhängigen Zugriff. Im Falle von der Ebene zugrunde liegenden Datenbanken wird das Statement nur leicht modifiziert an die Datenquelle durchgereicht, wodurch die Funktionen des originalen Datenspeichers genutzt werden können.

Die Ausdrücke werden z.B. für die Erstellung von Filtern an Shapedateien, ODBC-Quellen, Splinetexte oder bei der Ausführung von Selektionen verwendet.

ISQL Syntax

Die Syntax ähnelt wie oben angegeben dem SQL Standard. Eine Abfrage besteht aus den Teilen:

  • SELECT
  • FROM
  • WHERE
  • JOIN

Der Ausdruck wird immer von einer vorgegeben Ebene ausgeführt. Diese Quelle wird dabei immmer als $SELF referenziert und muss in jedem Ausdruck vorhanden sein.
Die Auswahl von einzelnen Spalten wird z.Z. *nicht* untersützt. Um die syntaktische Gültigkeit des Ausdruck zu gewährleisten muss der ISQL Ausdruck immer mindestens einen Aufbau in der Form "SELECT MY.* FROM $SELF AS MY" haben.

Als besonderes Feature kann vor dem SELECT Ausdruck ein in Klammern gefasster Block mit weiteren Steuerinformationen vorhanden sein. Dabei handelt es sich um Argument=Werte Paaren welche durch ein Semikolon getrennt werden. Mögliche Parameter sind:

  • ILFFILE
  • OptimizeSQL
  • COMPARENOCASE
  • NEWPARSER (ab Version 4.0.0.60)

Die Parameter und Werte werde case-insensitiv ausgewertet. Die Werte müssen in einfachen Hochkommata angegeben werden.

ILFFile gibt den (relativen) Namen zu einer ILF Datei an. siehe "Symbolinformationen aus externen Quellen"

OptimizeSQL ist im Zusammenhang mit "JOIN" Angaben sinnvoll. Es wird dabei versucht, die SQL-Anweisung so zu modifizieren, dass nur noch für diese Operation wichtige Felder enthalten sind. Des Weiteren wird die Abfrage entsprechend dem internen Index sortiert. Damit kann u.U. eine Performancesteigerung erreicht werden.
Führen die Optimierungen zu einem Fehler, werden diese rückgängig gemacht, und die gleiche Operation mit dem Ausgangsausdruck ohne Optimierung wird wiederholt. Mögliche Werte sind true oder false

COMPARENOCASE legt fest wie Zeichenkettenvergleiche durchgeführt werden sollen. Mögliche Werte sind true oder false. Standard ist false.

NEWPARSER legt fest, ob beim Parsen des Statements der ab Version 4.0.0.60 neu entwickelte Parser verwendet werden soll. Mit diesem Parser kann innerhalb der WHERE-Klausel geklammert und somit der Vorrang vor anderen Tests geregelt werden. Weiterhin wurden seit der Version 4.0.0.60 Rangfolgen bei der Abarbeitung der logischen Verknüpfungen eingeführt. Hierbei hat ein AND einen höheren Stellenwert, als ein OR. Des Weiteren ist es möglich mehrere Geometrievergleiche innerhalb einer Abfrage zu tätigen. Es ist ebenfalls möglich innerhalb eines Stringvergleichs auf doppelte oder einfache Hochkommata zu testen, indem diese, wie bei üblichen SQL,  doppelt hintereinander geschrieben werden. Mögliche Werte bei der Einstellung dieses Parameters sind true oder false. Der Standardwert bei Nichtverwendung ist false.

Externe Datenquellen

Der Zugriff auf maximal eine externe Datenquelle ist möglich. Der JOIN zwischen den Datenquellen erfolgt z.Z. immer als EQUI-Join. Die externe Datenquellen wird dabei primär durchlaufen. Die Verknüpfung ist auf jeweils eine Spalte beschränkt. Als externe Datenquellen kommen alle über ODBC verfügbaren Datenbanken in Frage.
Die externe Quelle wird dabei als String in folgender Definition referenziert:

ODBC-Verbindungzeichenfolge;SQL=\exterenesSttm\

Das externe SQL-Statement wird dabei durch die Zeichen "\" am Anfang und Ende maskiert. Der gesamte Ausdruck muss mit "AS" als Alias deklariert werden.
Der JOIN - Ausdruck findet sich als letztes Argument des ISQL Ausdruck in der Form:

JOIN ALIAS_1.SPALTE = ALIAS_2.SPALTE
Symbolinformationen aus externen Quellen

"Filter" können ebenfalls dazu benutzt werden die Symbolinformationen, Feld für Klassifikation oder Unique-Value, aus einer externen Datenbank zu beziehen. Dazu kann in einem "Filterausdruck" in Klammern am Anfang weitere Parameter gesetzt werden.
"ILFFILE", dort wird der (relative) Name zu einer ILF Datei erwartet.
Enthält der Filterausdruck eine "JOIN" Angabe, wird geprüft ob der in der angegebenen ILF Datei angegebene Feldname in der Shape oder Externen Datenquelle enthalten ist und die Zuweisung entsprechend durchgeführt. 

Hinweis: Der Filter muss dabei nicht unbedingt über "WHERE" Angaben verfügen, daher hier die Hervorhebung mittels Hochkommata. 

Ein Beispiel:

Go;
  //wie im obigen Bsp. ein Filter
  //mit Angabe einer ILF Datei zur Klassifikation
  extSql="(ILFFILE='..\leg\my.ilf')SELECT MY.* FROM $SELF AS MY"
	  +",'DSN=ORA1;uid=user;pwd=passWd;SQL=\"+extSql+"\ AS ORATAB "
	  +"JOIN MY.ID = ORATAB.SHAPE_ID";
  ret=ExecOld("AddTheLinkLayer",
               theName:"GEM_WITH_MIDDLE_SIZE",
               theLayer:"GEM_ALL",
               theSymbol:25,
               theFilter:sqlStmt);
End;


Filter mit Geometrien

In ISQL Ausdrücken kann neben Sachdatenabfragen auch auf die Geometrie der Datenquelle bezug genommen werden. Z.Z. ist pro Ausdruck nur eine Geometrie zulässig. Das Format der Geometrie ist [hier] beschrieben. Wird das Statement gegen einen Datenquelle eines Geodatenservers (PostgreSQL, SDO,...) abgesetzt wird dieser Ausdruck in einen SQL Statement passend zu der Datenbank umgesetzt. Der Geometrievergleich wird immer primär ausgeführt.

Go;
  //eine Angabe für Selektion
  //dieser Ausdruck könnte ebenso als Filter eingesetzt werden
  //Sucht alle Gebäude, welche nicht in der angegeben Box liegen und 
  //bei welchen das Feld STRNAME mit "Fried" beginnt, mit "e" endet
  //und dazwischen "stra" vorkommt
strGeom="gBox:5410554.985636|5658802.778980|5410974.569360|5659303.152116"; sql="SELECT MY.* FROM $SELF AS MY "
+" WHERE NOT MY.$GEOM = "+strGeom+" AND STRNAME LIKE 'Frie%stra%e'"
; ret=ExecOld("ExecuteTheSelectionEx", theLayer:"Gebaeude", FetchGeo:false, theStmt:sql); End;
Komplexes Beispiel
Go;
  //Laden einer "normalen" Shapedatei...
  ret=ExecOld("AddTheShapeLayerA",
               theName:"GEM_ALL",
               theFile:"..\daten\gemeinde.shp",
               theSymbol:12);
                   
  //auf diese Ebene wird eine Filter gelegt
  //das Attribut "onlyInUserScope" definiert eine Sitzungsbezogen Gültigkeit 
  //der Ebene. Das Schlüsselwort $SELF bezieht sich dabei auf Felder der Shapedatei
  //AREA ist dabei ein Sachdatenfeld in der zum Shape gehörenden DBF Datei
  ret=ExecOld("AddTheLinkLayer",
               theName:"GEM_WITH_MIDDLE_SIZE",
               theLayer:"GEM_ALL",
               theSymbol:25,
               theFilter:"SELECT MY.* FROM $SELF AS MY WHERE AREA > 10 AND AREA < 100");

  //auch diese Ebenen basiert auf GEM_ALL und wird mit einem Filter versehen
  //diese Filter bezieht aber die Verknüpfung zu einer externen Datenquelle
sqlStmt="SELECT MY.* FROM $SELF AS MY,"
+"'DSN=ORA1;uid=user;pwd=passWd;SQL=\SELECT ID,NUTZUNG FROM TAB.TABLE1\'"
+" AS ORATAB "
+"WHERE "
+"ORATAB.NUTZUNG LIKE 'Acker' AND MY.AREA > 1000 "
+"JOIN MY.ID = ORATAB.SHAPE_ID";











ret=ExecOld("AddTheLinkLayer", theName:"GEM_WITH_MIDDLE_SIZE", theLayer:"GEM_ALL", theSymbol:25, theFilter:sqlStmt); /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HINWEISE: Wird die den Linklayern zugrunde liegende Ebene entladen, so werden auch alle damit verknüpften Ebenen entladen. ein Linklayer kann nur auf generische Ebenen zeigen welche nicht im "UserScope" sind durch die Angabe "OnlyInUserScope:true" wird jeder Filter für jede neue Sitzung ausgeführt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ End;
Allgemeine Hinweise

Einige Optionen erfordern weiteren Erklärungsbedarf. Diese Optionen werden in den folgenden Unterpunkten erläutert. Es handelt sich hierbei um eine lose Folge von Attributen, Befehlen und Konzeptbeschreibung bei welchen wir der Meinung waren einen extra Seite zu widmen.