Web Feature Service
Unter einem Web Feature Service (WFS) versteht man den internetgestützten Zugriff auf Geodaten innerhalb eines verteilten GIS. Der WFS beschränkt sich dabei ausschließlich auf Vektordaten, wie sie in Datenbanken abgelegt werden können.
Im Rahmen der Spezifikationen des OpenGIS Consortium (OGC) ermöglicht ein WFS den Zugriff auf geographische Features in Datenbanken und gibt das Ergebnis mindestens als unabhängiges Dateiformat Geography Markup Language (GML) zurück.
Unter einem Feature versteht man hierbei die allgemeine Abstraktion eines Fakts der Realität ("real world phenomena"). Ein Feature Type ist die Darstellung mithilfe eines Namens, weiteren Attributen und, bei geographischen Feature Types, mit einer Geometrie. Beispielsweise enthält eine Datenbank Feature Types des Typs "Fluss". Eine Instanz eines Features (eine Feature Instance) ist damit dann ein konkreter Fluss.
Inhaltsverzeichnis
Technischer Hintergrund eines OGC-konformen WFS
Um einen OGC-konformen WFS - d.h. ein Web Feature Service, der die Spezifikation des Open Geospatial Consortium erfüllt - zu nutzen, wird bislang zur Kommunikation auf das Hypertext Transfer Protocol (HTTP) zurückgegriffen. Die Anfrage wird dabei als HTTP-Request von einem Client an den WFS gesendet. Der WFS besitzt sechs Operationen, die von einem Benutzer angefragt werden können:
- GetCapabilities: Hierbei wird nach den Fähigkeiten des WFS gefragt. Als Antwort wird ein XML-Dokument an den Benutzer zurückgeschickt, das neben allgemeinen Angaben zum Anbieter des WFS die abfragbaren Feature Types und die möglichen Operationen beinhaltet.
- DescribeFeatureType: Bei dieser Anfrage werden Informationen zur Struktur der einzelnen Feature Types zurückgegeben.
- GetFeature: Mit diesem Request werden die einzelnen Feature Instanzen, d.h. die eigentlichen Daten zurückgegeben. Es sollte möglich sein, dass bei der Anfrage näher spezifiziert wird, welche Eigenschaften der Features zurückgegeben werden und ob diese räumliche Informationen beinhalten.
- GetGmlObject: Der WFS kann dadurch Elemente liefern, die durch Xlinks beschrieben sind.
- Transaction: Ein WFS kann Anfragen der Transaktion bereitstellen, d.h. die Möglichkeit die eigentlichen Features in der Datenbasis zu ändern. Darunter fällt das Anlegen, die Aktualisierung und die Löschung geographischer Features.
- LockFeature: Hiermit wird vom WFS gewährleistet, dass bei einer Operation auf einem Feature Type, dieses nicht während der Transaktion von einer anderen Instanz geändert wird.
Nimmt man diese Operationen als Grundlage, kann man drei Typen von WFS unterscheiden:
- Basic WFS: Der Basic WFS bietet den nur-lesenden Zugriff mit den Operationen GetCapabilities, DescribeFeatureType und GetFeature an.
- XLink WFS: Bietet die Funktionen des Basic WFS und zusätzlich noch Xlink Unterstützung durch die Funktion GetGmlObject.
- Transaction WFS: Der Transaction WFS ermöglicht darüber hinaus auch den schreibenden Zugriff auf die Daten mit den Operationen Transaction und optional LockFeature.
Damit muss ein WFS zwingend Anfragen mit den ersten drei Operationen anbieten, der GetGMLObject, Transaction und LockFeature Request sind optional. Letzterer muss auch bei einem WFS mit Schreibzugriff nicht implementiert werden.
Der übliche Ablauf der Kommunikation zwischen Client und einem WFS in einem verteilten System läuft daher folgendermaßen ab:
- Der Client fragt mit dem GetCapabilties Request nach den Fähigkeiten des WFS und die angebotenen Feature Types.
- Darauf aufbauend kann mit dem DescribeFeatureType Request die Struktur der einzelnen Feature Types eingesehen werden.
- Dadurch kann mit dem GetFeature Request eine spezielle Instanz eines Features angefordert werden. Alternativ kann bei einem WFS mit Schreibzugriff der Transaction oder der LockFeature Request durchgeführt werden.
Innerhalb des OGC-Kontexts ist die Verbindung eines Web Feature Service mit einem Web Map Service (WMS) ein Beispiel für die Architektur eines verteiltes GIS. Der WFS ist für den Zugriff auf die Geodaten verantwortlich, während der WMS nur noch für die de:Visualisierung der Daten zuständig ist. Dabei beschränkt sich der WFS nur auf den Zugriff von Vektordaten, während ein weiterer Service, der Web Coverage Service (WCS) den speziellen Zugriff auf Rasterdaten steuert.
Somit ist im Sinne des Client-Server Prinzips der WMS der Client des WFS. Darüber hinaus kann dieser WFS als kaskadierender WFS wiederum Client eines oder mehrerer weiterer WFS sein. Diese Architektur kann als Typ eines Web GIS gesehen werden.
Transactional Web Feature Server (WFS-T)
Transactional Web Feature Server erfüllen die Anforderungen für Simple Features und ermöglichen das Hochladen derselbigen.
Beispiele
getCapabilities
The getCapabilities call returns an OGC WFS Capabilities Document (XML) which contains all information that an OGC WFS Client needs to request the server for features.
describeFeatureType
This request returns all metainformation about one feature of the WFS. This metainformation is necessary to be able to query for the values of an object and to be able to edit and store features.
http://my_wfs_server&VERSION=1.1.1&REQUEST=GetCapabilities&SERVICE=WFS
The returned XML document contains the description of the feature (geo object)
(the format of the XML has been modified for HTML presentation)
<xs:schema targetNamespace="http://www.openplans.org/topp" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0"> <xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://wms1.ccgis.de:80/geoserver/data/capabilities/gml/2.1.2/feature.xsd"/> <xs:complexType name="mapbender_user_Type"> <xs:complexContent> <xs:extension base="~gml:AbstractFeatureType"> <xs:sequence> <xs:element name="gid" minOccurs="0" nillable="true" type="xs:int"/> <xs:element name="firstname" minOccurs="0" nillable="true" type="xs:string"/> <xs:element name="lastname" minOccurs="0" nillable="true" type="xs:string"/> <xs:element name="usertype" minOccurs="0" nillable="true" type="xs:int"/> <xs:element name="orga" minOccurs="0" nillable="true" type="xs:string"/> <xs:element name="url" minOccurs="0" nillable="true" type="xs:string"/> <xs:element name="town" minOccurs="0" nillable="true" type="xs:string"/> <xs:element name="email" minOccurs="0" nillable="true" type="xs:string"/> <xs:element name="fullname" minOccurs="0" nillable="true" type="xs:string"/> <xs:element name="urlmap" minOccurs="0" nillable="true" type="xs:string"/> <xs:element name="the_geom" minOccurs="0" nillable="true" type="~gml:PointPropertyType"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:element name="mapbender_user" type="topp:mapbender_user_Type" substitutionGroup="gml:_Feature"/> </xs:schema>
getFeature
The getFeature request can query for single objects or a selection depending on the filter encoding which is added to the request. The OGC WFS ~getFeature request returns a GML (Example) document.
The parameter requesting the id of the postal code area is added as a WFS FILTER to the getFeature request as http GET parameter.
==== http://wms1.ccgis.de/cgi-bin/mapserv425?map=/data/umn/germany_demo/germany_demo_wfs.map& ==== SERVICE=WFS& REQUEST=~GetFeature& VERSION=1.0.0& TYPENAME=Postleitzahlbereiche& FILTER=
(the following parameters have to be URL-encoded when transmitted with GET)
<Filter> <~PropertyIsLike wildCard="%" singleChar="?" escape="ESC"> <~PropertyName> item_plz </~PropertyName> <Literal> 53111 </Literal> </~PropertyIsLike> </Filter>
The returned GML document contains the corresponding postal code area as a GML.
(the format of the GML has been modified for HTML presentation)
<?xml version='1.0' encoding="ISO-8859-1" ?> <wfs:~FeatureCollection xmlns="!http://www.ttt.org/myns" xmlns:myns="!http://www.ttt.org/myns" xmlns:wfs="!http://www.opengis.net/wfs" xmlns:gml="!http://www.opengis.net/gml" xmlns:ogc="!http://www.opengis.net/ogc" xmlns:xsi="!http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="!http://www.opengis.net/wfs ../wfs/1.0.0/WFS-basic.xsd !http://www.ttt.org/myns !http://wms1.ccgis.de/cgi-bin/mapserv? map=/data/umn/germany_demo/germany_demo_wfs.map& SERVICE=WFS& VERSION=1.0.0& REQUEST=~DescribeFeatureType TYPENAME=Postleitzahlbereiche"> <gml:boundedBy> <gml:Box srsName="epsg:31467"> <gml:coordinates> -1.000000,-1.000000 -1.000000,-1.000000 </gml:coordinates> </gml:Box> </gml:boundedBy> <gml:featureMember> <Postleitzahlbereiche> <gml:boundedBy> <gml:Box srsName="epsg:31467"> <gml:coordinates> 7.089682,50.732651 7.113803,50.749050 </gml:coordinates> </gml:Box> </gml:boundedBy> <gml:polygonProperty> <gml:Polygon srsName="epsg:31467"> <gml:outerBoundaryIs> <gml:~LinearRing> <gml:coordinates> 3365496.566430,5624978.448441 3365521.124423,5625013.908323 3365565.223312,5625084.526916 3365629.214635,5625160.583843 3365723.363724,5625232.038551 3365777.825572,5625277.769189 3365867.287406,5625324.293319 3366081.776121,5625376.954252 3366242.558916,5625409.342895 3366447.711508,5625422.348649 3366677.856852,5625435.565091 3366826.787403,5624801.669664 3366855.035066,5624566.573031 3366925.451142,5624182.224968 3366715.750264,5624144.261254 3366650.863977,5624128.508596 3366600.955317,5624112.804621 3366531.383108,5624081.886701 3366506.401347,5624071.486493 3366442.053224,5624025.159618 3366392.576627,5623979.714963 3366347.846258,5623958.781918 3366303.629382,5623898.347600 3366254.562142,5623822.330657 3366204.783816,5623801.958859 3366170.529172,5623746.359034 3366096.979434,5623625.121634 3365763.215463,5623795.455427 3365500.779929,5623942.335246 3365218.803228,5624068.496482 3365237.785434,5624138.909926 3365251.877503,5624209.028949 3365265.770476,5624284.252033 3365279.898174,5624354.790930 3365313.834894,5624430.338190 3365342.788540,5624515.791264 3365381.492255,5624611.601424 3365424.880011,5624732.334672 3365458.518013,5624832.944095 3365502.496403,5624908.664231 3365531.735324,5624963.958282 3365496.566430,5624978.448441 </gml:coordinates> </gml:~LinearRing> </gml:outerBoundaryIs> </gml:Polygon> </gml:polygonProperty> <gid>3695</gid> <oid>15223704</oid> <plz99>53111</plz99> <item_plz>53111</item_plz> <buffer_>500</buffer_> </Postleitzahlbereiche> </gml:featureMember> </wfs:~FeatureCollection>