Web Feature Service

GISWiki - Das freie Portal für Geoinformatik (GIS)
Wechseln zu: Navigation, Suche

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.

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:

  1. 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.
  2. DescribeFeatureType: Bei dieser Anfrage werden Informationen zur Struktur der einzelnen Feature Types zurückgegeben.
  3. 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.
  4. GetGmlObject: Der WFS kann dadurch Elemente liefern, die durch Xlinks beschrieben sind.
  5. 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.
  6. 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:

  1. Basic WFS: Der Basic WFS bietet den nur-lesenden Zugriff mit den Operationen GetCapabilities, DescribeFeatureType und GetFeature an.
  2. XLink WFS: Bietet die Funktionen des Basic WFS und zusätzlich noch Xlink Unterstützung durch die Funktion GetGmlObject.
  3. 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>

Weblinks