OGC WMS

Ermöglicht den Zugriff auf OGC konforme Web Map Dienste (Web Map Service) in der Version 1.3.

Die Verwendung von RasterCss ist möglich.

Daten werden projiziert, wenn dann angefordertes CRS nicht unterstützt wird.

Filter sind möglich (SubLayer und ggf. Dimensionen des WMS Servers).

Hinweise

Es ist "nur" die aktuelle Version 1.3 (ISO 19128) des Standards implementiert, ggf. verwenden Sie Iwan6, wenn ein Dienst noch keine Version 1.3 anbietet. Da selbst der aktuelle Standard bereits recht alt (2006) ist, werden wir keine ältere Version des Standards mehr implementieren.

Dieses Feature ist aktuell in Arbeit, es gelten folgende Einschränkungen:

  • GetFeatureInfo ist noch nicht implementiert
  • GetLegendGraphic / Auswerten der Style-Urls ist noch nicht implementiert
  • die aus Iwan6 bekannten Clip-Bereiche sind noch nicht implementiert

Diese Feature ist ab Version 7.6.6 verfügbar.

Argumente

Typname: WMS

  • url: Die Endpunkt Url zu dem Dienst, alle OGC Parameter werden intern automatisch angefügt, unbekannte Parameter und Version werden beibehalten

  • layer(""): optionale Layernamen, mehrere kommagetrennt, wenn nicht angegeben, werden alle Layer des Dienstes verwendet (in cardo werden diese als Baumstruktur dargestellt)

  • expandSubLayersForSelected (true): Wenn layers angegeben sind und der gewählte Layer Unterelemente hat, dann diese mit ausgeben.

  • additionalQueryString: Optionales Query-String Fragment, was bei allen Anfragen mit übergeben wird (arg1=value&arg2=values).

  • formats("image/png"): Bevorzugtes Bildformat, kommagetrennt können mehrere angegeben werden (der erste Treffer wird verwendet)

  • featureFormats("application/json,text/plain,text/html"): Bevorzugtes Format für GetFeatureInfo, kommagetrennt können mehrere angegeben werden (der erste Treffer wird verwendet)

  • serverUser (""): optionaler Benutzername für die Anmeldung am Dienst

  • serverPwd (""): wenn serverUser angegeben ist, dann muss ein Kennwort übergeben werden, leere Kennwörter sind nicht zulässig

  • proxyUri (""): optionale Url zu einem Http-Proxyserver z.B. http://proxy:8888

  • proxyUser(""): optionaler Benutzername für die Anmeldung am proxyUri

  • proxyPwd(""): wenn proxyUser angegeben ist, dann muss ein Kennwort übergeben werden, leere Kennwörter sind nicht zulässig

  • proxyBypassList (null): optionale Bypass-Liste, wenn ein Proxyserver eingestellt ist.

  • timeoutMilliseconds (30000): Http-Timeout für die Zugriffe auf den Dienst

  • useDefaultProxy (false): Standard-Proxy des Betriebssystems verwenden

  • cacheDuration (60): Cache-Dauer eines Bildes in Sekunden, der Standard ist 1 Minute, mit 0 kann das Caching deaktiviert werden.

    Diese Feature ist ab Version 7.6.6.6 verfügbar.

  • forceLogicalRenderImageSize (true): Beim Generieren von Kartenbildern ist es möglich, dass Karteninhalte so gezeichnet werden, als wenn das Bild in einer abweichenden Bildgröße(logische Bildgröße) erstellt würde.

    Praktisch wird das z.B.verwendet, um für Druckausgaben die physische Bildgröße deutlich zu erhöhen, während die logische Bildgröße der einer äquivalenten Bildschirmausgabe entspricht.

    Bei Rasterdaten bzw.bildbasierten Diensten besteht kann mittels "forceLogicalRenderImageSize" gewählt werden, ob bei Zeichenoperationen mit unterschiedlichen physischen und logischen Bildgrößen die logische Bildgröße verwendet werden soll.

    Besonders bei bildbasierten Diensten (WMS, WMTS) kann das relevant sein, weil deren Maßstabsberechnungen allein auf der Bildgröße basieren. Standardwerte: WMS, WMTS - true, andere Rasterquellen - false

    Diese Feature ist ab Version 7.8.1.0 verfügbar.

  • perLayerProps (null): Argumente pro Ebene (siehe auch hier, ein Array von (beachte, hier in TypeScript-Notation):

    {
      /**
      * Der Name der Ebene im Dienst, erforderlich
      */
      name:string;
    
      /**
      * Stil-Name der Ebene, muss an dieser vorhanden sein (entsprechend der Vererbungs-Regeln)
      */
      preferedStyleName?:string|null;
    
      /*
      * Überschreibt den Eintrag für die Time-Dimension-Range, relevant für Auswertung in cardo.
      * Der Layer muss eine Dimension Time haben.
      */
      timeDimensionRange?:string|null;
    
      /**
      Name von weiteren Styles, die, warum auch immer ..., nicht im GetCapabilities vorhanden sind.
      */
      additionalStyleNames?:string[]|null;
    }
    

Ladevorgang

Der Zugriff auf einen Dienst läuft immer in dieser Form ab:

  • Abrufen des GetCapabilities-Dokumentes
  • Ermitteln der verfügbaren Layer
  • evtl. ermitteln von Dimensionen

Beispiel

{
"wms1":{
    "type":"WMS",
    "url":"https://www.pegelonline.wsv.de/geoserver/po-wms-mnwmhw/ows"
  }
}

GetFeatureInfo

GetFeatureInfo bei WMS Diensten ist leider so implementiert, dass nur "Abfragen" mit einer Bild-Koordinate möglich sind. D.H. ohne Informationen zum Zeichenvorgang ist ein Datenabruf nicht sinnvoll möglich (in Iwan6 haben wir dies versucht, aber auf Grund zu vieler Unbekannten wird das nicht richtig).

Für Abfragen steht daher ein eigener API Endpunkt zur Verfügung (in cardo wird dieser beim MapTip aufgerufen).

Ergebnis ist dann eine Tabelle, die je nach Dienst ...

  1. eine Spalte "RequestedUrl" enthält,
  2. eine Spalte "RequestedUrl" und "PlainTextResult" enthält,
  3. eine Spalte "RequestedUrl" und "JsonResult" enthält,
  4. ... oder wenn das Ergebnis als OGC FeatureCollection erkannt wurde die Datenspalten entsprechend der Properties der Features.

Iwan wählt dabei die verfügbaren Formate für das GetFeatureInfo in folgender Reihenfolge aus:

  • application/json
  • text/plain
  • text/html

Der Inhalt wird dann nur für text/plain oder application/json abgerufen (deswegen die unterschiedliche Spalten-Zahl).

Wenn JSON geliefert wurde und dieses als GeoJSON FeatureCollection erkannt wird, dann wird Form 4 geliefert.

In WMS-T gibt es die Möglichkeit, dass der Server per "Warning" Header über Abweichungen der angeforderten Dimension (Time) berichtete.

Sollten Warnungen ausgegeben werden, wird jeweils in das Ergebnis eine Pseudo-Spalte mit den Namen OgcSrvInfo angefügt. Dort ist die Warnung wie vom Server geliefert an jedem Datensatz angefügt.

Interpretationen für das Format application/json

Wenn das Format application/json vom Dienst angeboten wird (und dieser per featureFormat eingestellt ist), wird versucht eine Sachdatentabelle für die abgerufenen Daten zu bilden.

Diese wird erkannt, wenn:

  1. Es sich um eine FeatureCollection handelt, d.h. das JSON Objekt entspricht mindestens diesem Muster:
{
 type:"FeatureCollection";
 features: { type:"Feature", properties:IDictionary<any>}[];
}
  1. Es sich um Rasterdaten handelt, d.h. das JSON Objekt entspricht mindestens diesem Muster:
{
 layers:{ name:string, info: IDictionary<any>}[];
}

Die Eigenschaftsnamen werden dann aus dem Objekt in properties, bzw. info gebildet.

Wenn keines der beiden o.g. Formate erkannt, dann wird eine Tabelle mit den Attributen:

  • JsonResult (object)
  • RequestedUrl(varchar(2048))
  • OgcSrvInfo (varchar)

erstellt.

Implementierungsdetails / Features und Einschränkungen

  • Wenn der Layer die Zielprojektion der Kartenbildanforderung direkt unterstützt, werden die Daten in diesem KBS abgerufen.

    Sonst wird das der Anforderung "ähnlichste" KBS vom Dienst angefordert und die Daten werden automatisch projiziert.

  • Für die Darstellung kann optional ein Raster-Css angegeben werden.

  • Wenn mind. ein Layer mit Dimensionen vorhanden ist, kann ein Filter beim Zeichnen angegeben werden.

    Z.Z. wird nur die Time-Dimension ausgewertet.

    Ein "Datenabruf" an die Ebene ist auch möglich (cardo verwendet dies bspw. beim Abrufen der Werteliste für den Filter-Dialog). Dabei werden die Daten aus der Dimensions-Definition ausgewertet und als Set abgegeben.

Beim Zeichenvorgang können (hier nur schematisch betrachtet) folgende Parameter mit übergeben werden:

  • Filter auf SubLayer (bestimmte Ebenen aus dem Dienst)

    subLayers:["a","b"]
    
  • mit Filter auf (z.Z. TIME) Dimension

    {"filter":{"where":{"column":"TIME","is":"Equal","values":["2023-10-21T14:00:00Z"]}}}
    

    Es gelten folgenden Einschränkungen bei den Filtern:

    • es sind nur Operatoren zulässig, die in WMS übersetzbar sind. Bspw.. geht LIKE oder NOT NULL usw. nicht. In diesem Fall wird ein Fehler ausgelöst.

      BETWEEN, IN, EQUAL, GREATER, ... werden entsprechend der Spezifikation übersetzt,

    • der Filter darf nicht komplex sein (AND, OR...),

    • der Spaltenname muss dem Dimensionsnamen entsprechen

    Der neue Time-Filter kann hier ebenso verwendet werden:

      filter:{
         whereTime: {
           column: "time",
           is: "Equal",
           values: [{ reference: "PRESENT", period: "+PT2h" }]
        }
      }
    

    Zu den Filtern siehe auch hier

  • Ergebnisbild mit Raster-CSS modifizieren (Dienst mit Grauwerten und Transparenz)

    special-raster-properties
    {
      render-gray-scale-image:true;
      image-opacity:0.7;
    }
    
  • Ergebnisbild mittels Json (Parameter Iwan7RawJson) transparent setzen

    "style":"special-raster-properties
      {  
          image-opacity:0.7;
      }
      "
    

Besonderheiten bei Layern mit TIME Dimensionen

Ein WMS Dienst kann für Ebenen Dimensionen definieren. Bei GetMap und GetFeatureInfo kann die Dimension dann mit übergeben werden. Ein Problem dabei ist, dass die Dimension nicht pro Ebene angegeben werden kann.

Aus diesem Grund ist der Filter in cardo auch nicht am SubLayer, sondern am Root des Dienstes. Sie sollten dann besser nur den Layer in der Quelle adressieren, der die gewünschte Dimension hat, bzw. dafür sorgen, dass nur ein Layer mit Dimension enthalten ist, und alle anderen ohne.

Ein weiteres Problem ist, dass bei der Definition des Bereichs seitens des Standards unsere Meinung nach einige Einstellungen fehlen (oder wir diese noch nicht gefunden haben).

Dabei geht es um Layer, die einen gleitenden Zeitbereich definieren (nur die letzten 24 Stunden, ausgehen von "Jetzt").

Besonders schwierig wird es dann, wenn ein gleitender Zeitbereich vorliegt und der Dienst keine Interpolation der Werte zulässt (der Startpunkt fix ist).

Aus diesem Grund gibt es die Möglichkeit, den gelieferten Range pro Ebene überschreiben zu können (siehe perLayerProps/timeDimensionRange).

Ein Range besteht aus:

  • einer Liste von Zeiten und/oder ...
  • einem Triple, Startzeit-Endzeit-Interval

Zeiten können in ISO Langform (2016-01-25T12:15:00Z) oder mit dem Schlüsselwort PRESENT angegeben werden.

Wir haben dazu eine erweiterte Syntax ausgedacht.

Unser Erweiterung dazu:

  1. Start oder Endzeit kann mit einer Periode versehen werden

    PRESENT-P1D - Aktueller Zeitpunkt, minus 1 Tag PRESENT+P1D - Aktueller Zeitpunkt, plus 1 Tag

  2. "Wildcard-Date"

    Darüber hinaus gibt es noch eine Erweiterung zur Notation eines Date-String, der Teile von PRESENT darstellt. Dieses "Wildcard-Date" ist ein ISO DateTime mit * als Platzhalter für die Elemente.

    • 2016-01-25T12:15:00Z : Standard-ISO Format, UTC Zeit
    • ****-**-**T**:15:00Z : Verwende aktuelles Jahr, aktuellen Monat, aktuellen Tag, aktuelle Stunde, aber dann immer als Uhrzeit Minute 15:00.
    • *T**:15:00 : Kurzform, identisch mit obigem Beispiel, nur die Zeit fixieren

    Auch zu diesen Zeitangabe kann dann noch eine Periode addiert/subtrahiert werden.

Wozu das Ganze?: Ein Layer des DWD Dienstes gibt die Werte für die letzten 24 Stunden im Interval von 15 Minuten aus, und hat kein Nearest, d.h. es werden exakte Werte erwartet. Im Dienst wird dazu eine diskrete Liste der unterstützen Zeitpunkte generiert. Problem dabei ist, die Daten sind immer nur genau zum Zeitpunkt des Abruf des GetCapabilities gültig.

Um dies in dynamische Angaben zu übersetzen, kann folgende Ausdruck formuliert werden:

  • *T**:15:00-P1d/*T**:15:00/PT15M

    Damit werden alle Werte der letzten 24 Stunden so abgebildet, dass der Startwert immer auf einer viertel-Stunde startet, der Interval sind dabei 15 Minuten.

{
"wms1":{
    "type":"WMS",
    "url":"https://maps.dwd.de/geoserver/ows?service=wms",
    "layer":"dwd:RX-Produkt",
    "perLayerProps":[
        {
           "name":"dwd:RX-Produkt",
           "timeDimensionRange":"*T**:10:00-P1d/*T**:15:00/PT5M"
        }
    ]
  }
}

Zuletzt geändert: 20.09.2024 07:22:06 (erstmals erstellt 22.10.2023)