Coverage for gws-app/gws/plugin/ows_client/wfs/caps.py: 100%
19 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-05 13:35 +0200
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-05 13:35 +0200
1"""WFS capabilities parser."""
3import gws
4import gws.base.ows.client
5import gws.lib.crs
6import gws.base.ows.client.parseutil as u
7import gws.gis.source
8import gws.lib.xmlx as xmlx
11# @TODO check support caps (we need at least BBOX)
13def parse(xml) -> gws.OwsCapabilities:
14 """Read WFS capabilities from the GetCapabilities XML.
16 Each feature type is returned as a queryable source layer. Feature types
17 without a supported CRS or a WGS84 extent get WGS84 defaults.
19 Args:
20 xml: GetCapabilities XML.
22 Returns:
23 The parsed capabilities.
24 """
25 caps_el = xmlx.from_string(xml, gws.XmlOptions(compactWhitespace=True, removeNamespaces=True))
26 source_layers = gws.gis.source.check_layers(
27 _feature_type(el) for el in caps_el.findall('FeatureTypeList/FeatureType'))
28 return gws.OwsCapabilities(
29 metadata=u.service_metadata(caps_el),
30 operations=u.service_operations(caps_el),
31 sourceLayers=source_layers,
32 version=caps_el.get('version'))
35def _feature_type(type_el):
36 """Create a source layer from a ``FeatureType`` element."""
37 sl = gws.SourceLayer()
39 sl.name = type_el.textof('Name')
40 sl.title = type_el.textof('Title') or xmlx.namespace.plain_name(sl.name)
41 sl.metadata = u.element_metadata(type_el)
42 sl.isQueryable = True
43 sl.supportedCrs = u.supported_crs(type_el) or [gws.lib.crs.WGS84]
44 sl.wgsExtent = u.wgs_extent(type_el) or gws.lib.crs.WGS84.extent
46 return sl