.. index:: single: WFS Server .. _wfs_server: ***************************************************************************** WFS Server ***************************************************************************** :Author: Jean-François Doyon :Contact: jdoyon at nrcan.gc.ca :Author: Jeff McKenna :Contact: jmckenna at gatewaygeomatics.com :Revision: $Revision$ :Date: $Date$ .. contents:: :depth: 2 :backlinks: top Introduction ============ A WFS ( Web Feature Service ) publishes feature-level geospatial data to the web. This means that instead of returning an image, as MapServer has traditionally done, the client now obtains fine-grained information about specific geospatial features of the underlying data, at both the geometry AND attribute levels. As with other OGC specifications, this interface uses XML over HTTP as it's delivery mechanism, and, more precisely, GML (Geography Markup Language), which is a subset of XML. WFS-Related Information ----------------------- Here are some WFS related links (including a newly added OGC services workshop with MapServer). Since these are highly detailed technical specifications, there is no need to read through them in their entirety to get a MapServer WFS up and running. It is still recommended however to read them over and get familiar with the basics of each of them, in order to understand how it all works: - The `OGC Web Feature Service Implementation Specification`_. - The `Geography Markup Language Implementation Specification`_. - MapServer `OGC Web Services Workshop package`_. Working knowledge of MapServer is of course also required. Software Requirements --------------------- In order to enable MapServer to serve WFS, it MUST be compiled against certain librairies: - PROJ.4: The reprojection library. Version 4.4.3 or greater is required. - GDAL/OGR: I/O support libraries. Version 1.1.8 or greater is required. Please see the MapServer :ref:`UNIX Compilation and Installation HowTo ` for detailed instructions on compiling mapserver with support for these libraries and features. For Windows users, the `MS4W`_ installer comes ready to serve both WFS and WMS. .. index:: pair: WFS Server; GML Versions of GML Supported ------------------------- MapServer can output both GML2 and GML3. By default MapServer serves GML2. You can test this by adding an 'OUTPUTFORMAT' parameter to a GetFeature request, such as: - `GML2 request output`_ - `GML3 request output`_ For a detailed discussion on the versions supported, see `bug#884`_. .. index:: pair: WFS Server; Mapfile Configuring your MapFile to Serve WFS layers ============================================ Much as in the WMS support, WFS publishing is enabled by adding certain magic METADATA keyword/value pairs to a MapFile. MapServer will serve and include in its WFS capabilities only the layers that meet the following conditions: - Data source is of vector type (Shapefile, OGR, PostGIS, SDE, SDO, ...) - LAYER NAME must be set. Layer names must start with a letter when setting up a WFS server (layer names should not start with a digit or have spaces in them). - LAYER TYPE is one of: LINE, POINT, POLYGON - The "wfs_onlineresource" metadata: The wfs_onlineresource metadata is set in the map's web object metadata and specifies the URL that should be used to access your server. This is required for the GetCapabilities output. If wfs_onlineresource is not provided then MapServer will try to provide a default one using the script name and hostname, but you shouldn't count on that too much. It is strongly recommended that you provide the wfs_onlineresource metadata. See section 12.3.3 of the `WFS 1.0.0 specification`_ for the whole story about the online resource URL. Basically, what you need is a complete HTTP URL including the http:// prefix, hostname, script name, potentially a "map=" parameter, and and terminated by "?" or "&". Here is a valid online resource URL: :: http://my.host.com/cgi-bin/mapserv?map=mywfs.map& By creating a wrapper script on the server it is possible to hide the "map=" parameter from the URL and then your server's online resource URL could be something like: :: http://my.host.com/cgi-bin/mywfs? This is covered in more detail in the "More About the Online Resource URL" section of the :ref:`WMS Server ` document. - The "wfs_enable_request" metadata (see below). Example WFS Server Mapfile -------------------------- The following is an example of a bare minimum WFS Server mapfile. Note the comments for the required parameters. .. code-block:: mapfile MAP NAME "WFS_server" STATUS ON SIZE 400 300 SYMBOLSET "../etc/symbols.txt" EXTENT -180 -90 180 90 UNITS DD SHAPEPATH "../data" IMAGECOLOR 255 255 255 FONTSET "../etc/fonts.txt" # # Start of web interface definition # WEB IMAGEPATH "/ms4w/tmp/ms_tmp/" IMAGEURL "/ms_tmp/" METADATA "wfs_title" "WFS Demo Server for MapServer" ## REQUIRED "wfs_onlineresource" "http://demo.mapserver.org/cgi-bin/wfs?" ## Recommended "wfs_srs" "EPSG:4326 EPSG:4269 EPSG:3978 EPSG:3857" ## Recommended "wfs_abstract" "This text describes my WFS service." ## Recommended "wfs_enable_request" "*" # necessary END END PROJECTION "init=epsg:4326" END # # Start of layer definitions # ################## # World Continents ################## LAYER NAME "continents" METADATA "wfs_title" "World continents" ##REQUIRED "wfs_srs" "EPSG:4326" ## REQUIRED "gml_include_items" "all" ## Optional (serves all attributes for layer) "gml_featureid" "ID" ## REQUIRED "wfs_enable_request" "*" END TYPE POLYGON STATUS ON DATA 'shapefile/countries_area' PROJECTION "init=epsg:4326" END CLASS NAME 'World Continents' STYLE COLOR 255 128 128 OUTLINECOLOR 96 96 96 END END END #layer END #mapfile .. index:: pair: WFS Server; SRS Rules for Handling SRS in MapServer WFS --------------------------------------- The OGC WFS 1.0 specification doesn't allow a layer (feature type) to be advertised in more than one SRS. Also, there is no default SRS that applies to all layers by default. However, it is possible to have every layer in a WFS server advertised in a different SRS. The OGC WFS 1.1 specification allows more than one SRS to be advertised, and one of the SRSs will be advertised as the default SRS (the default SRS will be the first in the list specified in the `METADATA` `wfs_srs` / `ows_srs`). Here is how MapServer decides the SRS to advertise and use for each layer in your WFS: - If a top-level map SRS is defined then this SRS is used and applies to all layers (feature types) in this WFS. In this case the SRS of individual layers is simply ignored even if it is set. - If no top-level map SRS is defined, then each layer is advertised in its own SRS in the capabilities. .. note:: By "SRS is defined", we mean either the presence of a PROJECTION object defined using an EPSG code, or of a `wfs_srs` / `ows_srs` metadata at this level. .. note:: At the map top-level the `wfs_srs` / `ows_srs` metadata value takes precedence over the contents of the :ref:`PROJECTION` block. At the layer level, if both the `wfs_srs` / `ows_srs` metadata and the PROJECTION object are set to different values, then the `wfs_srs` / `ows_srs` metadata defines the projection to use in advertising this layer (assuming there is no top-level map SRS), and the PROJECTION value is assumed to be the projection of the data. So this means that the data would be reprojected from the PROJECTION SRS to the one defined in the `wfs_srs` / `ows_srs` metadata before being served to WFS clients. Confusing? As a rule of thumb, simply set the `wfs_srs` / `ows_srs` at the map level (in web metadata) and never set the `wfs_srs` / `ows_srs` metadata at the layer level and things will work fine for most cases. Axis Orientation in WFS 1.1 --------------------------- The axis order in previous versions of the WFS specifications was to always use easting (x or lon ) and northing (y or lat). WMS 1.1 specifies that, depending on the particular SRS, the x axis may or may not be oriented West-to-East, and the y axis may or may not be oriented South-to-North. The WFS portrayal operation shall account for axis order. This affects some of the EPSG codes that were commonly used such as ESPG:4326. The current implementation makes sure that coordinates returned to the server for the GetFeature request reflect the inverse axis orders for EPSG codes between 4000 and 5000. Test Your WFS Server -------------------- Validate the Capabilities Metadata ********************************** OK, now that we've got a mapfile, we have to check the XML capabilities returned by our server to make sure nothing is missing. Using a web browser, access your server's online resource URL to which you add the parameter "REQUEST=GetCapabilities" to the end, e.g. http://demo.mapserver.org/cgi-bin/wfs?SERVICE=WFS&VERSION=1.0.0&REQUEST=GetCapabilities If everything went well, you should have a complete XML capabilities document. Search it for the word "WARNING"... MapServer inserts XML comments starting with "