Source code for gws.ext.ows.provider.wms.caps

"""WMS Capabilities parser."""

import gws
import gws.common.metadata
import gws.gis.source
import gws.tools.xml2

import gws.types as t

import gws.common.ows.provider.parseutil as u


[docs]def parse(prov, xml): el = gws.tools.xml2.from_string(xml) prov.type = 'WMS' prov.meta = t.MetaData(u.get_meta(el.first('Service'))) prov.meta.contact = t.MetaContact(u.get_meta_contact(el.first('Service.ContactInformation'))) prov.meta.url = u.get_url(el.first('Service.OnlineResource')) prov.version = el.attr('version') prov.operations = u.get_operations(el.first('Capability')) prov.source_layers = u.flatten_source_layers(_layer(e) for e in el.all('Capability.Layer')) prov.supported_crs = gws.gis.source.crs_from_layers(prov.source_layers)
def _layer(el, parent=None): oo = t.SourceLayer() oo.supported_bounds = u.get_bounds_list(el) oo.styles = [u.get_style(e) for e in el.all('Style')] oo.is_queryable = el.attr('queryable') == '1' oo.is_visible = True oo.meta = t.MetaData(u.get_meta(el)) oo.name = oo.meta.name oo.title = oo.meta.title if not oo.name: # some folks have unnamed layers in their caps # we can't render or query them oo.is_queryable = False oo.is_image = False smin = el.get_text('MinScaleDenominator') smax = el.get_text('MaxScaleDenominator') if smax: oo.scale_range = [u.as_int(smin), u.as_int(smax)] # @TODO: support ScaleHint (WMS 1.1) oo.layers = [_layer(e, oo) for e in el.all('Layer')] oo.is_group = len(oo.layers) > 0 oo.is_image = len(oo.layers) == 0 # OGC 06-042, 7.2.4.8 Inheritance of layer properties if parent: cs = set(b.crs for b in oo.supported_bounds) for b in parent.supported_bounds: if b.crs not in cs: oo.supported_bounds.append(b) cs = set(b.crs for b in oo.styles) for s in parent.styles: if s.name not in cs: oo.styles.append(s) oo.meta = gws.extend(oo.meta, parent.meta) oo.supported_crs = [b.crs for b in oo.supported_bounds] ds = u.default_style(oo.styles) if ds: oo.legend = ds.legend return oo