示例#1
0
    def __init__(self, conf, mapfactory, opsonlineresource):
        self.conf = conf
        self.mapfactory = mapfactory
        if self.conf.has_option('service', 'allowedepsgcodes'):
            self.allowedepsgcodes = map(
                lambda code: 'epsg:%s' % code,
                self.conf.get('service', 'allowedepsgcodes').split(','))
        else:
            raise ServerConfigurationError(
                'Allowed EPSG codes not properly configured.')

        capetree = ElementTree.fromstring(self.capabilitiesxmltemplate)

        elements = capetree.findall('Capability//OnlineResource')
        for element in elements:
            element.set('{http://www.w3.org/1999/xlink}href',
                        opsonlineresource)

        self.processServiceCapabilities(capetree)

        rootlayerelem = capetree.find(
            '{http://www.opengis.net/wms}Capability/{http://www.opengis.net/wms}Layer'
        )

        for epsgcode in self.allowedepsgcodes:
            rootlayercrs = ElementTree.Element('SRS')
            rootlayercrs.text = epsgcode.upper()
            rootlayerelem.append(rootlayercrs)

        for layer in self.mapfactory.layers.values():
            layerproj = Projection(layer.srs)
            layername = ElementTree.Element('Name')
            layername.text = layer.name
            env = layer.envelope()
            llp = layerproj.inverse(Coord(env.minx, env.miny))
            urp = layerproj.inverse(Coord(env.maxx, env.maxy))
            latlonbb = ElementTree.Element('LatLonBoundingBox')
            latlonbb.set('minx', str(llp.x))
            latlonbb.set('miny', str(llp.y))
            latlonbb.set('maxx', str(urp.x))
            latlonbb.set('maxy', str(urp.y))
            layerbbox = ElementTree.Element('BoundingBox')
            layerbbox.set('SRS', layerproj.epsgstring())
            layerbbox.set('minx', str(env.minx))
            layerbbox.set('miny', str(env.miny))
            layerbbox.set('maxx', str(env.maxx))
            layerbbox.set('maxy', str(env.maxy))
            layere = ElementTree.Element('Layer')
            layere.append(layername)
            if layer.title:
                layertitle = ElementTree.Element('Title')
                layertitle.text = layer.title
                layere.append(layertitle)
            if layer.abstract:
                layerabstract = ElementTree.Element('Abstract')
                layerabstract.text = layer.abstract
                layere.append(layerabstract)
            if layer.queryable:
                layere.set('queryable', '1')
            layere.append(latlonbb)
            layere.append(layerbbox)
            if len(layer.wmsextrastyles) > 0:
                for extrastyle in [layer.wmsdefaultstyle] + list(
                        layer.wmsextrastyles):
                    style = ElementTree.Element('Style')
                    stylename = ElementTree.Element('Name')
                    stylename.text = extrastyle
                    styletitle = ElementTree.Element('Title')
                    styletitle.text = extrastyle
                    style.append(stylename)
                    style.append(styletitle)
                    layere.append(style)
            rootlayerelem.append(layere)

        self.capabilities = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n' + ElementTree.tostring(
            capetree)
示例#2
0
    def GetCapabilities(self, params):
        if not self.capabilities:
            capetree = ElementTree.fromstring(self.capabilitiesxmltemplate)

            elements = capetree.findall('Capability//OnlineResource')
            for element in elements:
                element.set('{http://www.w3.org/1999/xlink}href',
                            self.opsonlineresource)

            self.processServiceCapabilities(capetree)

            rootlayerelem = capetree.find(
                '{http://www.opengis.net/wms}Capability/{http://www.opengis.net/wms}Layer'
            )

            for epsgcode in self.allowedepsgcodes:
                rootlayercrs = ElementTree.Element('SRS')
                rootlayercrs.text = epsgcode.upper()
                rootlayerelem.append(rootlayercrs)

            for layer in self.mapfactory.ordered_layers:
                layerproj = Projection(layer.srs)
                layername = ElementTree.Element('Name')
                layername.text = layer.name
                env = layer.envelope()
                llp = layerproj.inverse(Coord(env.minx, env.miny))
                urp = layerproj.inverse(Coord(env.maxx, env.maxy))
                latlonbb = ElementTree.Element('LatLonBoundingBox')
                latlonbb.set('minx', str(llp.x))
                latlonbb.set('miny', str(llp.y))
                latlonbb.set('maxx', str(urp.x))
                latlonbb.set('maxy', str(urp.y))
                layerbbox = ElementTree.Element('BoundingBox')
                layerbbox.set('SRS', layerproj.epsgstring())
                layerbbox.set('minx', str(env.minx))
                layerbbox.set('miny', str(env.miny))
                layerbbox.set('maxx', str(env.maxx))
                layerbbox.set('maxy', str(env.maxy))
                layere = ElementTree.Element('Layer')
                layere.append(layername)
                if layer.title:
                    layertitle = ElementTree.Element('Title')
                    layertitle.text = layer.title
                    layere.append(layertitle)
                if layer.abstract:
                    layerabstract = ElementTree.Element('Abstract')
                    layerabstract.text = layer.abstract
                    layere.append(layerabstract)
                if layer.queryable:
                    layere.set('queryable', '1')
                layere.append(latlonbb)
                layere.append(layerbbox)
                if len(layer.wmsextrastyles) > 0:
                    for extrastyle in [layer.wmsdefaultstyle] + list(
                            layer.wmsextrastyles):
                        style = ElementTree.Element('Style')
                        stylename = ElementTree.Element('Name')
                        stylename.text = extrastyle
                        styletitle = ElementTree.Element('Title')
                        styletitle.text = extrastyle
                        style.append(stylename)
                        style.append(styletitle)
                        layere.append(style)
                rootlayerelem.append(layere)
            self.capabilities = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n' + ElementTree.tostring(
                capetree)
        response = Response('application/vnd.ogc.wms_xml', self.capabilities)
        return response