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

1"""WFS capabilities parser.""" 

2 

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 

9 

10 

11# @TODO check support caps (we need at least BBOX) 

12 

13def parse(xml) -> gws.OwsCapabilities: 

14 """Read WFS capabilities from the GetCapabilities XML. 

15 

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. 

18 

19 Args: 

20 xml: GetCapabilities XML. 

21 

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')) 

33 

34 

35def _feature_type(type_el): 

36 """Create a source layer from a ``FeatureType`` element.""" 

37 sl = gws.SourceLayer() 

38 

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 

45 

46 return sl