.. _app-schema.gml32:
Supported GML Versions
======================
GML 3.1.1
---------
* GML 3.1.1 application schemas are supported for WFS 1.1.0.
* Clients must specify WFS 1.1.0 in requests because the GeoServer default is WFS 2.0.0.
* GET URLs must contain ``version=1.1.0`` to set the WFS version to 1.1.0.
GML 3.2.1
---------
* GML 3.2.1 application schemas are supported for WFS 1.1.0 and (incomplete) WFS 2.0.0.
* Some WFS 2.0.0 features not in WFS 1.1.0 such as GetFeatureById are not yet supported.
* Clients using WFS 1.1.0 must specify WFS 1.1.0 in requests and select the ``gml32`` output format for GML 3.2.1.
* To use WFS 1.1.0 for GML 3.2.1, GET URLs must contain ``version=1.1.0`` to set the WFS version to 1.1.0 and ``outputFormat=gml32`` to set the output format to GML 3.2.1.
* The default WFS version is 2.0.0, for which the default output format is GML 3.2.1.
* All GML 3.2.1 responses are contained in a WFS 2.0.0 ``FeatureCollection`` element, even for WFS 1.1.0 requests, because a WFS 1.1.0 ``FeatureCollection`` cannot contain GML 3.2.1 features.
Secondary namespace for GML 3.2.1 required
``````````````````````````````````````````
GML 3.2.1 WFS responses are delivered in a WFS 2.0.0 ``FeatureCollection``. Unlike WFS 1.1.0, WFS 2.0.0 does not depend explicitly on any GML version. As a consequence, the GML namespace is secondary and must be defined explicitly as a secondary namespace. See :ref:`app-schema.secondary-namespaces` for details.
For example, to use the prefix ``gml`` for GML 3.2, create ``workspaces/gml/namespace.xml`` containing::
gml_namespace
gml
http://www.opengis.net/gml/3.2
and ``workspaces/gml/workspace.xml`` containing::
gml_workspace
gml
Failure to define the ``gml`` namespace prefix with a secondary namespace will result in errors like::
java.io.IOException: The prefix "null" for element "null:name" is not bound.
while encoding a response (in this case one containing ``gml:name``), even if the namespace prefix is defined in the mapping file.
GML 3.2.1 geometries require gml:id
```````````````````````````````````
GML 3.2.1 requires that all geometries have a ``gml:id``. While GeoServer will happily encode WFS responses without ``gml:id`` on geometries, these will be schema-invalid. Encoding a ``gml:id`` on a geometry can be achieved by setting an ``idExpression`` in the mapping for the geometry property. For example, ``gsml:shape`` is a geometry property and its ``gml:id`` might be generated with::
gsml:shape
strConcat('shape.', getId())
SHAPE
In this example, ``getId()`` returns the ``gml:id`` of the containing feature, so each geometry will have a unique ``gml:id`` formed by appending the ``gml:id`` of the containing feature to the string ``"shape."``.
If a multigeometry (such as a ``MultiPoint`` or ``MultiSurface``) is assigned a ``gml:id`` of (for example) ``parentid``, to permit GML 3.2.1 schema-validity, each geometry that the multigeometry contains will be automatically assigned a ``gml:id`` of the form ``parentid.1``, ``parentid.2``, ... in order.
GML 3.3
-------
The proposed GML 3.3 is itself a GML 3.2.1 application schema; preliminary testing with drafts of GML 3.3 indicates that it works with app-schema as expected.